首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用'sonata_type_model‘ManyToMany映射时未更新字段

使用'sonata_type_model‘ManyToMany映射时未更新字段
EN

Stack Overflow用户
提问于 2012-04-11 21:48:54
回答 1查看 2.5K关注 0票数 0

这是我的TagAdmin类

代码语言:javascript
复制
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版。

我确信它之前是有效的,但现在当我向标签添加新类别时,我会收到一条成功的闪光消息,但更改没有反映出来。

我所做的唯一的其他更改是集成了所选的JQuery插件来处理复选框。我也尝试过删除它,但它的功能是一样的。

会出什么问题呢?

这是Tag类。

代码语言:javascript
复制
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(); 
    } 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-12 14:14:07

抱歉,这和索纳塔无关。

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

关系的所属方确定对数据库中关系的更新。

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

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

双向关联的拥有方是side Doctrine在确定关联的状态时“查看”,并因此确定是否需要执行任何操作来更新数据库中的关联。

我的映射定义如下:

代码语言:javascript
复制
class Tag
{
...
   /**
     * @ORM\ManyToMany(targetEntity="Category", mappedBy="tags")
     */
    protected $categories;
...
}

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

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

代码语言:javascript
复制
class Tag
{
...
   /**
     * @ORM\ManyToMany(targetEntity="Category", inversedBy="tags")
     */
    protected $categories;
...
}

class Category
{
...
   /**
     * @ORM\ManyToMany(targetEntity="Tag", mappedBy="categories")
     */
    protected $tags;
...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10107282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档