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カテゴリとタグの間にはあります。

最近、SonataAdminバージョン2.0にアップグレードしました。

以前は機能していたと思いますが、タグに新しいカテゴリを追加すると、成功のフラッシュメッセージが表示されますが、変更は反映されません。

私が行った他の唯一の変更は、チェックボックスを処理するために選択された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(); 
    } 
4

1 に答える 1

2

申し訳ありませんが、これはソナタとは何の関係もありませんでした。

マッピングに問題がありました。Doctrine2のドキュメントには次のように記載されています。

リレーションシップの所有側が、データベース内のリレーションシップの更新を決定します。

これを完全に理解するには、オブジェクトの世界で双方向の関連付けがどのように維持されているかを覚えておいてください。アソシエーションの両側に2つの参照があり、これら2つの参照は両方とも同じアソシエーションを表しますが、互いに独立して変更できます。もちろん、正しいアプリケーションでは、双方向アソシエーションのセマンティクスはアプリケーション開発者によって適切に維持されます(それは彼の責任です)。Doctrineは、これら2つのメモリ内参照のどちらが永続化されるべきか、どちらが永続化されるべきでないかを知る必要があります。これは、所有/逆の概念が主に使用されるものです。

アソシエーションの逆側にのみ加えられた変更は無視されます。双方向アソシエーションの両側(または、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 に答える