我第一次尝试与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;
答案 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
字段相同(其他定义除外)