这是常见的问题。 有许多检查块的形式。使得checkbocks可用并单击save,相应的checkbock-labels字段不会保存。
PersonAdmin类包含
...
->add('books', 'sonata_type_model',
array('by_reference' => false, 'expanded' => true, 'multiple' => true, 'label' => 'Books'))
...
实体类包含
/**
* @ORM\ManyToMany(targetEntity="Book", mappedBy="persons", cascade={"persist"})
* @ORM\JoinTable(name="person_book")
*/
protected $books;
....
public function __construct()
{
$this->books = new ArrayCollection();
}
public function addBook(Book $book)
{
$this->books[] = $book;
return $this;
}
和geters,seters ......
我未能成功搜索解决方案。我发现有必要添加
'by_reference' => false,
或
cascade={"persist"}
但我的代码中包含了所有这些内容。
答案 0 :(得分:1)
如前所述,您需要在双方保存关系。但我更喜欢另一种方式:在实体的添加动作中保存关系:
//In the Person entity:
public function addBook(Book $book)
{
$book->addPerson($this);
$this->books[] = $book;
return $this;
}
//In the Book entity (if you have the same problem for another side):
public function addPerson(Person $person)
{
$person->addBook($this);
$this->persons[] = $person;
return $this;
}
答案 1 :(得分:0)
你必须双方保存。
在自定义crud控制器中覆盖默认的editAction和createAction。
e.g:
这是艺术家与活动之间多对多关系的一个例子。
($ object是您在动作中编辑/创建的当前对象)
foreach ($form['selectArtists']->getData() as $key => $value) {
$artist = $em->getRepository('MyCompanyProjectBundle:Artist')->findOneById($value);
$object->addArtist($artist);
$artist->addEvent($object);
$em->persist($artist);
}
答案 2 :(得分:0)
使用编辑=>内嵌。
->add('books', 'sonata_type_collection',
array('by_reference' => false, 'label' => 'Books'),
array('edit'=>'inline','inline'=>'table'))
可以帮到你。