我在 Symfony 2.0.17-DEV 和 PHP 5.3.14 上使用 Doctrine 2.2.2。我对级联选项的多对多关联有疑问。例子很简单,希望这个梦幻般的董事会中的人能帮助我。
无论如何,Meta
超类是与 的关系的所有者User
。仅相关字段和构造函数:
abstract class Meta
{
/**
* @ORM\ManyToMany(targetEntity="User", inversedBy="meta")
* @ORM\JoinTable(name="meta_users",
* joinColumns={@ORM\JoinColumn(onDelete="CASCADE")},
* inverseJoinColumns={@ORM\JoinColumn(onDelete="CASCADE")}
* )
*/
protected $users;
public function __construct()
{
$this->users = new ArrayCollection();
}
public function addUser(User $user)
{
$this->users[] = $user;
return $this;
}
public function getUsers()
{
return $this->users;
}
}
(实现,只是空类,是Label
和Category
)
这很简单,而且确实有效。我的意思是在元数据中添加或删除用户实际上是在连接表中添加/删除相应的行。
问题恰恰相反:创建/编辑用户并分配元。User
以这种方式定义与 meta 的关联,并添加一个 cascade="all" 选项:
class User
{
/**
* @ORM\ManyToMany(targetEntity="Meta", mappedBy="users", cascade={"all"})
*/
protected $meta;
public function __construct()
{
$this->meta = new ArrayCollection();
}
public function addMeta(Meta $meta)
{
$this->meta[] = $meta;
return $this;
}
public function getMeta()
{
return $this->meta;
}
}
我对 Doctrine 很陌生,但这不起作用。在我用于创建/编辑的 Symfony 2 表单中User
,我添加了一个 type 字段entity
,只需选择所有元数据:
$builder
->add('meta', 'entity', array(
'label' => 'Meta',
'class' => 'Acme\HelloBundle\Entity\Meta',
'property' => 'select_label',
'multiple' => true,
'expanded' => true,
))
;
将元分配(使用复选框)给用户时,任何表都没有变化。怎么了?我确定我错过了一些东西,但我找不到什么。