2017-05-22 1 views
0

ich auf einer Symfony 2 basierten Web-App arbeite und viele zu viele Beziehung zwischen Entitäten erstellen kämpfen:Wie eine viele zu viele Beziehung in Symfony2 verwenden

Jede Task Einheit sollte auf eine beliebige Anzahl von Categories zugeordnet werden . Natürlich kann jede Category von einer beliebigen Anzahl von Task Entitäten verwendet werden. Während eine Task ihre Categories kennen muss, hat die Category Klasse keine Beziehung zurück zu Tasks.

Nach this tutorial I erstellt:

class Task {  
    /** 
    * @ORM\Column(name="categories") 
    * @ORM\ManyToMany(targetEntity="MyBundle\Entity\Category") 
    */ 
    protected $categories; 

    public function __construct() { 
     $this->productVariations = new \Doctrine\Common\Collections\ArrayCollection(); 
     ... 
    } 
} 

der in der folgenden SQL-Tabelle ergibt:

CREATE TABLE task ... categories VARCHAR(255) NOT NULL, ... 

Ein neues Task verwendet man ein Formular mit der folgenden Art erstellt:

class TaskType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder 
      ->add('categories', EntityType::class, array(
       'class' => 'MyBundle:Category', 
       'choice_label' => 'name', 
       'multiple' => true, 
       'expanded' => true, 
      )) 
      ... 
    } 
} 

Einreichen des Formulars und Fortführen des neuen Task Instanz führt in einer SQL-Zeile mit folgendem Inhalt in der categories Spalte:

Doctrine\Common\Collections\[email protected] 

Was bedeutet das? Speichern der referenzierten Category Entities als Array ist keine normale Form, aber natürlich gültig (tatsächlich würde ich diese Lösung dem Hinzufügen einer Beziehungstabelle vorziehen, da in der Praxis die Anzahl der Kategorien pro Task ziemlich klein ist, also eine dritte Tabelle mehr wäre Overhead).

Ich würde jedoch annehmen, dass das Array die IDs der referenzierten Objekte/Zeilen in irgendeiner Form speichert. Wie wäre es möglich, eine beliebige Anzahl von Referenzen in einer VARCHAR(255) Spalte zu speichern?

Beim Senden und Persistent erstellt einen DB-Eintrag, die Category Referenzen sind nicht korrekt gespeichert. Wenn ich versuche, diesen Eintrag erneut zu lesen, ist die Eigenschaft categories leer.

+0

Warum nicht das [this] (http://knpuniversity.com/screencast/collections) Tutorial verwenden? –

Antwort

1

Sie haben eine redundante Spaltendefinition. Versuchen Sie einfach folgende Zeile zu entfernen:

* @ORM\Column(name="categories") 

Dann müssen Sie Ihr Datenbankschema aktualisieren.

Diese Zeile erzeugt ein varchar Feld in der Aufgabentabelle, das nicht dort sein sollte. Viele zu viele Beziehungen werden über separate Tabelle implementiert.

Wenn Sie IDs in einem einzelnen Feld anstatt in einer separaten Tabelle speichern möchten, werden Sie selbst damit arbeiten. Das ist so, weil es keine Beziehung mehr geben kann. Sie verlieren die Möglichkeit, einen Fremdschlüssel zu erstellen oder Join-Abfragen durchzuführen. Auch das Filtern von Datensätzen wird schwieriger zu erreichen sein.

0

Ich denke, du verpasst hier etwas.

Wie Sie schon sagten, ein Task kann auf viele Category (n) in Verbindung gebracht werden und die Category Klasse nicht über eine relationale Mapping auf die Task Klasse benötigen.

Alles, was Sie in Ihrer Task Klasse benötigen, ist eine Eigenschaft, auf die Sie Ihre Kategorien verweisen können.

Ich denke, was Sie suchen, ist this.