使用'sonata_type_model'MultipleToMany映射时,字段未获得更新

时间:2012-04-11 13:48:54

标签: symfony doctrine-orm symfony-sonata

这是我的TagAdmin类

protected function configureFormFields(FormMapper $formMapper) 
    { 
        $formMapper 
            ->add('name') 
            ->add('description') 
            ->add('slug','text',array( 
                'read_only' => true, 
            )) 
            ->add('categories', 'sonata_type_model', array('expanded' 
=> true, 'multiple' => true)); 
    } 

类别和标签之间有manyToMany mapping

我最近升级到Sonata Admin版本2.0。

我确信它的工作时间较早,但现在我添加了新的类别 一个标签,我得到一个成功的flash消息,但改变不是 反映。

我所做的唯一其他改变是整合了Chosen JQuery 用于处理复选框的插件。我试过删除它, 但它的功能是一样的。

可能出现什么问题?

这是Tag类。

class Tag 
{ 
    /** 
     * @var integer $id 
     * 
     * @ORM\Column(name="id", type="integer") 
     * @ORM\Id 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
    private $id; 
    /** 
     * @var string $name 
     * 
     * @Gedmo\Sluggable(slugField="slug") 
     * @ORM\Column(name="name", type="string", length=255) 
     * @Gedmo\Translatable 
     */ 
    private $name; 
    /** 
     * @var text $description 
     * 
     * @ORM\Column(name="description", type="text") 
     * @Gedmo\Translatable 
     */ 
    private $description; 
    /** 
     * @ORM\ManyToMany(targetEntity="Category", mappedBy="tags") 
     */ 
    protected $categories; 
    /** 
     * @var string $slug 
     * @Gedmo\Slug(updatable=false) 
     * @ORM\Column(name="slug", type="string", length=255) 
     */ 
    private $slug; 
    public function __construct() 
    { 
        $this->categories = new \Doctrine\Common\Collections 
\ArrayCollection(); 
    } 

1 个答案:

答案 0 :(得分:2)

抱歉,这与索纳塔无关。

这是映射的问题。 Doctrine2文档说明:

  

关系的拥有方确定数据库中关系的更新。

     

要完全理解这一点,请记住双向关联的方式   维持在对象世界。每侧有2个参考   关联和这两个引用都代表相同   关联但可以彼此独立地改变。当然,在   一个正确的应用程序双向关联的语义   应用程序开发人员正确维护(这是他的   责任)。学说需要知道这两个中的哪一个在记忆中   引用是应该持久化的,而不是。这是   拥有/反向概念主要用于什么。

     

忽略仅对关联的反面进行的更改。   确保更新双向关联的两侧(或在   至少是拥有方,从学说的角度来看)

     

双向关联的拥有方是边缘主义   在确定关联状态时“看着”,并且   因此,更新关联是否有任何事情要做   在数据库中。

我的映射定义如下: -

class Tag
{
...
   /**
     * @ORM\ManyToMany(targetEntity="Category", mappedBy="tags")
     */
    protected $categories;
...
}

class Category
{
...
   /**
     * @ORM\ManyToMany(targetEntity="Tag", inversedBy="categories")
     */
    protected $tags;
...
}

将“inversedBy”设置为Tag类,解决了问题。 所以正确的实现是:

class Tag
{
...
   /**
     * @ORM\ManyToMany(targetEntity="Category", inversedBy="tags")
     */
    protected $categories;
...
}

class Category
{
...
   /**
     * @ORM\ManyToMany(targetEntity="Tag", mappedBy="categories")
     */
    protected $tags;
...
}