2016-03-31 7 views
0

Ich habe drei einfache Entitäten.Viele bis viele Assoziationen mit 3 teilnehmenden Klassen - Formulargenerierung

class Product { 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="ProductsCategories", mappedBy="category") 
    */ 
    private $categories; 

    //.. 

class ProductsCategories { 
    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="Product") 
    */ 
    private $product; 

    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="Category") 
    */ 
    private $category; 

    //.. 


class Category { 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="ProductsCategories", mappedBy="product") 
    */ 
    private $products; 

    //.. 

Ich möchte viele zu viele Verknüpfung mit zusätzlichen Klasse erstellen, um zusätzliche Felder hinzuzufügen. Mein Problem ist, dass ich weiß nicht, wie Formularfeld zu erzeugen, hier ist meine Form Typ

//.. 
    ->add('categories', 'entity', [ 
     'class' => 'AppBundle:Category', 
     'choice_label' => function($category, $key, $index) { 
      return $category->getName(); 
     }, 
     'multiple' => true, 
     'required' => true, 
     'expanded' => false, 
    ]) 
    //.. 

Aber wenn ich das Formular abschicken, diese Fehler auftauchen:

Expected value of type "Doctrine\Common\Collections\Collection|array" for association field "AppBundle\Entity\Product#$categories", got "AppBundle\Entity\Category" instead.

Dank.

Antwort

0

EDIT: Sorry, ich habe nicht verstanden, dass Sie eine ManyToMany mit Attributen wollen, ich denke, Sie müssen einen ProductCategoryType erstellen, mit einigen Feldern für Ihre "Attribute" und einem Feld EntityType auf Kategorie. Dann fügen Sie im ProductType einen CollectionType von ProductCategoryType hinzu.


Ihre Einheit nicht korrekt ist, Sie ManyToMany Beziehung und keine OneToMany auf jedem Entity, dass mach auf einer anderen Einheit verwenden. Else Doctrine macht nicht die Beziehung zwischen den 2 Entitäten. Sie müssen nur Prouct und Kategorie Entität mit einer ManyToMany-Beziehung haben. Ich gebe Ihnen ein Beispiel für eine ManyToMany bidirektionale.

class Product { 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="Category", mappedBy="products") 
    */ 
    private $categories; 

    //.. 


class Category { 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="Product", inversedBy="categories") 
    */ 
    private $products; 

    //.. 

Sie müssen einige Methoden in Artikel hinzufügen.

__construct() { 
    $this->categories = new ArrayCollection(); 
} 

addCategory(Category $category) { 
    $this->categories[] = $category; 
} 

removeCategory(Category $category) { 
    $this->categories->removeElement($caegory); 
} 

getCategories() { 
    return $this->categories(); 
} 

das gleiche für Kategorien Do (ersetzen Kategorie nach Produkt und Kategorien nach Kategorie Dann können Sie die addCategory Methode wie folgt ändern:

addCategory(Category $category) { 
    $this->categories[] = $category; 
    $category->addProduct($this); 
} 

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-unidirectional

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-bidirectional

+0

Nein, nein, nein, Sie verstehen nicht, mit Ihrem Beispiel kann ich der neu erstellten dritten Tabelle keine zusätzlichen Felder hinzufügen. http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-unidirectional 'Warum sind Viele-zu-Viele-Verbindungen weniger verbreitet? Da Sie häufig zusätzliche Attribute einer Assoziation zuordnen möchten, führen Sie in diesem Fall eine Assoziationsklasse ein. Folglich verschwindet die direkte Viele-zu-Viele-Assoziation und wird durch Eins-zu-Viele/Viele-zu-Eins-Assoziationen zwischen den 3 teilnehmenden Klassen ersetzt. – nacholibre

+0

Entschuldigung, ich verstehe nicht, dass Sie eine ManyToMany mit Attributen wollen, Ich denke, dass Sie einen ProductCategoryType mit einigen Feldern für Ihre "Attribute" und einem Feld EntityType für Kategorie erstellen müssen. Dann fügen Sie im ProductType einen CollectionType von ProductCategoryType hinzu. – mpiot

Verwandte Themen