在Symfony2中,我最近尝试用特性来思考,创造某种行为。 我们假设我在一个实体中有一个地址属性。我在AddressableTrait中外化了与此相关的属性,getter和setter。
但是,如果地址成为一个实体呢?我开始尝试在我的特征中定义我的OneToMany关系,就好像它是在一个普通实体中一样:
use Doctrine\ORM\Mapping as ORM;
class AddressableTrait {
/**
* @var
* @ORM\OneToMany(targetEntity="XXXX\GlobalBundle\Entity\Address", inversedBy="What to put here" )
*/
protected $addresses;
/**
* @return ArrayCollection
*/
public function getAddresses()
{
return $this->addresses;
}
/**
* @param ArrayCollection $addresses
*/
public function setAddresses($addresses)
{
$this->addresses = $addresses;
}
}
反转的内容是什么?如果准确地嵌入所有行为特征,那么特性的目的,所以我认为至少使用传统的注释/ YML / XML,它是不可能实现的。
我挖了一下,发现this very interesting link似乎允许你通过事件来定义关系,但仍有逻辑可以添加到"完成"关系。
更新: 使用上面的链接,我设法创建了动态的ManyToMany关系。架构更新在创建时有效,但如果我评论动态关系,架构:update --dump-sql不会删除它。它似乎只能添加。强制动态映射坚持真实关系添加/删除的任何线索?
非常感谢您的回答!
尼古拉斯
答案 0 :(得分:0)
我在实体中使用特征时遇到了问题。对于常规数据库值(标量,DateTime),traits工作正常,但是当我尝试在traits中定义实体关系时,doctrine迁移包会将该属性转换为varchar字段。
我能找到修复创建正确的实体关系属性的唯一方法是将它们移出特征并进入实体类本身。