2012-04-11 14 views
0

Hier verwenden sind meine TagAdmin KlasseFelder nicht aktualisiert wird, wenn 'sonata_type_model' ManyToMany Mapping

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

Es gibt eine manyToMany mapping zwischen Kategorien und Tags ist.

Ich habe kürzlich auf Sonata Admin Version 2.0 aktualisiert.

Ich bin sicher, es war früher funktioniert, aber jetzt, wenn ich neue Kategorien zu ein Tag hinzufügen, erhalte ich eine Erfolgsmeldung, aber die Änderung ist nicht widergespiegelt.

Die einzige andere Änderung, die ich gemacht hatte, war die Integration des ausgewählten JQuery Plugins für die Handhabung von Checkboxen. Ich habe versucht, mit dem Entfernen auch, , aber es funktioniert genauso.

Was könnte schief gehen?

Hier ist die Klasse 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(); 
    } 

Antwort

2

Sorry, das hatte nichts mit Sonata zu tun.

Es war ein Problem mit dem Mapping. Die Doctrine2-Dokumentation gibt Folgendes an:

Die besitzende Seite einer Beziehung bestimmt die Aktualisierungen der Beziehung in der Datenbank.

Um dies vollständig zu verstehen, denken Sie daran, wie bidirektionale Assoziationen in der Objektwelt verwaltet werden. Es gibt 2 Referenzen auf jeder Seite von die Zuordnung und diese 2 Referenzen repräsentieren beide die gleiche Zuordnung, können aber unabhängig voneinander ändern. Natürlich, in eine korrekte Anwendung die Semantik der bidirektionalen Zuordnung ordnungsgemäß vom Anwendungsentwickler gepflegt werden (das ist seine Verantwortung). Doctrine muss wissen, welche dieser beiden In-Memory-Referenzen die ist, die beibehalten werden sollte und welche nicht. Dies ist , wofür das owning/inverse Konzept hauptsächlich verwendet wird.

Änderungen, die nur auf der inversen Seite einer Assoziation vorgenommen werden, werden ignoriert. Achten Sie darauf, beide Seiten einer bidirektionalen Assoziation zu aktualisieren (oder zumin dest die besitzende Seite, aus Lehre Sicht)

Die besitzende Seite einer bidirektionalen Vereins ist die Seite Lehre „schaut“, wenn die Zustandsbestimmungs der Assoziation, und folglich, ob es etwas zu tun gibt, um die Assoziation in der Datenbank zu aktualisieren.

Meine Mapping wie folgt definiert: -

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

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

die "inversedBy" Festlegen von Klasse Tag, löste das Problem. Also die richtige Umsetzung ist das:

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

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