0

这是我的 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 插件以处理复选框。我也尝试过删除它,但它的功能是一样的。

可能出了什么问题?

这是标签类。

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(); 
    } 
4

1 回答 1

2

抱歉,这与奏鸣曲无关。

这是映射的问题。Doctrine2 文档指出:

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

要完全理解这一点,请记住在对象世界中如何维护双向关联。关联的每一侧都有 2 个引用,这 2 个引用都代表相同的关联,但可以相互独立地更改。当然,在正确的应用程序中,双向关联的语义由应用程序开发人员正确维护(这是他的责任)。Doctrine 需要知道这两个内存引用中的哪一个是应该被持久化的,哪个不是。这就是拥有/反向概念的主要用途。

仅对关联的反面所做的更改将被忽略。确保更新双向关联的双方(或至少从 Doctrine 的角度来看拥有方)

双向关联的拥有方是 Doctrine 在确定关联状态时“查看”的一方,因此是否需要更新数据库中的关联。

我的映射是这样定义的:-

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;
...
}
于 2012-04-12T06:14:07.090 回答