学说关联映射

时间:2014-07-27 13:05:53

标签: symfony doctrine-orm

我第一次尝试与Symfony2进行学说联系,这让我很头疼。

我有一个管理界面,除其他外,还可以上传图片。我想知道哪个管理员上传了什么图片,因此我已将外键administrator添加到我的images表中。为了收集数据,需要一个简单的JOIN来收集数据,但是使用Doctrine,我很困难,尽管看起来很简单。

所以,我有一个反映该表的Administrator对象。在那个目标中,我有这个陈述......

 @ORM\OneToMany(targetEntity="ImageBundleNamespace\ImageEntity", mappedBy="administrator")

很简单。在我的ImageEntity对象(反映Images表)中,是一个前导键列administrator

在ImageEntity对象中,我使用此语句......

 @ORM\ManyToOne(targetEntity="AdministratorNamespace\Administrator", inversedBy="imageEntity")
 @ORM\JoinColumn(name="administrator", referencedColumnName="id")

administrator中有一个ImageEntity字段,imageEntity中有一个Administrator字段,上述语句正在映射。

它不起作用。

我已在EntityManger上运行SchemaValidator,并且它表示administrator对象上的ImageEntity字段未定义为关联。第二条消息表明administrator字段不存在。

如果它有帮助,这是我所有的DQL ......

'SELECT i.id,
        i.imeSlike,
        i.velicina,
        i.ekstenzija,
        i.paths,
        a.username,
        a.ime,
        a.prezime FROM ImageBundle:ImageEntity i
        JOIN a.administrator a'

提前感谢您的帮助。

编辑

我在DQL中犯了一个错误。纠正了它。

修改

我忘了添加源代码。 管理员的关联部分......

**
 * @ORM\OneToMany(targetEntity="Icoo\Administracija\GalerijaBundle\Entity\ImageEntity", mappedBy="administrator")
 */

protected $imageEntity;

public function __construct() {
    $this->imageEntity = new ArrayCollection();
}

ImageEntity的关联部分

/**
 * @ORM\Column(type="smallint")
 *
 * @ORM\ManyToOne(targetEntity="Icoo\LoginBundle\Entity\Administrator", inversedBy="imageEntity")
 * @ORM\JoinColumn(name="administrator", referencedColumnName="id")
 *
 */

protected $administrator;

2 个答案:

答案 0 :(得分:1)

在管理员类中,您有:

/**
 * @ORM\Column(type="smallint")
 *
 * @ORM\ManyToOne(targetEntity="Icoo\LoginBundle\Entity\Administrator", inversedBy="imageEntity")
 * @ORM\JoinColumn(name="administrator", referencedColumnName="id")
 *
 */

您需要删除@ORM\Column(type="smallint")

这一定是全部。让我知道。

答案 1 :(得分:1)

您可以将字段映射与关联映射分开:

/**
 * @ORM\Column(name="administrator", type="smallint", nullable=false, options={"unsigned"=true})
 */
protected $administratorId;

/**
 * @ORM\ManyToOne(targetEntity="Icoo\LoginBundle\Entity\Administrator", inversedBy="imageEntity")
 * @ORM\JoinColumn(name="administrator", referencedColumnName="id")
 **/
protected $administrator;

如果你走得更远,你可以将异常放入$ administratorId getter / setter中以避免使用它。

正如我测试的那样,当你持久化/刷新你的实体时,doctrine会忽略$ administratorId属性的值(为了确认你可以在Doctrine \ ORM \ Persisters \ BasicEntityPersister中查看prepareUpdateData())

修改

我认为,我之前的变体是可能的但是错误。因为,doctrine从referencedColumn中的定义获取字段映射,您可以使用

添加更多定义
 * @ORM\JoinColumn(name="administrator", referencedColumnName="id", unique, nullable, onDelete, columnDefinition, fieldName)

这意味着db中的image_entity.administrator字段与db中的administrator.id字段相同(其他定义除外)