Doctrine 2 多重映射继承

Posted

技术标签:

【中文标题】Doctrine 2 多重映射继承【英文标题】:Doctrine 2 multiple mapping inheritance 【发布时间】:2012-07-03 10:00:06 【问题描述】:

我为所有具有 GeoLocation 功能的实体定义了一个映射超类:

<?php
namespace Acme\GeoBundle\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\MappedSuperclass
 */
class Placeable 

/**
* @ORM\Column(type="decimal", scale=7)
*/
protected $loc_latitude;

[...]


?>

我目前将两个实体映射到这个超类。 但是,我还想将此地理映射提供给我的用户实体,由 FOSUserBundle 提供。问题是这个实体已经从 FOSUserBundle 中包含了 User 模型:

<?php
namespace Acme\UserBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;

/**
 * @ORM\Entity
 */
class User extends BaseUser 
?>

所以我的问题是:如何将 Placeable 的映射信息提供给我的用户实体?

【问题讨论】:

【参考方案1】:

你应该有一个 Location/Address 对象,继承自 Placeable,并将 Location 与 User 链接起来。

PS : 这是因为你不能从 PHP 中的多个实体继承

<?php

class User extends BaseUser

    /**
     * @ORM\OneToOne(targetEntity="Location", inversedBy="user")
     * @ORM\JoinColumn(name="location_id", referencedColumnName="id")
     */
    private $location;


class Location extends Placeable

    /**
     * @ORM\OneToOne(targetEntity="User", mappedBy="location")
     */
    private $user;

【讨论】:

以上是关于Doctrine 2 多重映射继承的主要内容,如果未能解决你的问题,请参考以下文章

在 Doctrine 2 继承中覆盖 inversedBy 映射

覆盖Doctrine 2继承中的inversedBy映射

Doctrine2 - 继承映射,查询子类

PHP Doctrine 使用鉴别器映射查询继承的类

doctrine2 映射覆盖从 MappedSuperclass 继承的 inversedBy 字段。

Doctrine 继承和 MySQL 连接表限制