Sonata管理员不保存多对多字段

时间:2014-02-27 11:14:01

标签: forms symfony many-to-many sonata-admin

这是常见的问题。 有许多检查块的形式。使得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"}

但我的代码中包含了所有这些内容。

3 个答案:

答案 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'))

可以帮到你。