2016-07-05 20 views
1

Ich versuche derzeit, ein Backend für ein Projekt zu erstellen. In diesem Projekt können Sie "ContentElements" erstellen, mit denen Inhalte auf einer Seite angezeigt werden können (in meinem Fall Sites). Jedes ContentElement kann mehrere Optionen haben. Wenn ein Benutzer eine neue Site mit einem ContentElement (z. B. Header) erstellt, würde er alle Optionen des Elements eingeben. Zum Beispiel:Join Tabelle mit der ID einer anderen Join Tabelle

"src": "/img/bg.jpg", 
"text": "Lorem ipsum..." 

Um den Optionswert pro Seite speichern wird es verwendet, in, speichere ich diese Werte in einer separaten Tabelle (content_elements_sites_values).

Mein Plan sieht derzeit wie folgt aus: data scheme

Also, was ich derzeit versuche zu tun ist, wenn ich alle Daten mit der Website von ‚content_elements_sites_values‘

Ich möchte auch die Daten erhalten zugeordnet bekommen
$site = $this->Sites->get($id, [ 
     'contain' => ['Templates', 'Colors', 'SiteTypes', 'ContentElements' => [ 
      'ContentElementOptions' => [ 
       'ContentElementsSitesValues' 
       ] 
      ] 
     ], 
     'conditions' => [ 
      // Just to explain my problem. 
      'ContentElementsSites.id' => 'ContentElementsSitesValues.content_elements_sites_id' 
     ] 
    ]); 

Ich weiß wirklich nicht, ob das überhaupt möglich ist oder ob mein "Design" ein totaler Bullen ist. Aber ich kann mir keine andere Möglichkeit vorstellen, die gefüllten Daten zu speichern. Ich bin sehr offen für Vorschläge für eine bessere Möglichkeit, diese Daten zu speichern. Bitte fragen Sie, wenn Sie weitere Informationen benötigen, um mir zu helfen.

Vielen Dank im Voraus!


EDIT

Ich versuche, besser zu erklären, was ich erreichen will.

Jeder Website können mehrere content_elements des gleichen Typs haben (Verband in content_elements_sites gespeichert Verknüpfungstabelle).
Jeder content_element kann durch einen Admin mehrere content_element_options

Alle content_element_options und content_elements definiert haben.

kann ein anderer Benutzer eine Website und füllen Sie es mit content_elements erstellen und content_elements_sites_value für alle content_element_options eingeben. Und da das gleiche content_element (z. B. ein Absatz oder eine Liste) mehrere Vorkommen auf der gleichen Website haben kann, muss ich alle content_elements_sites_value der Benutzer eingegeben.

Das ist, warum ich geschaffen, um die Verbindung zwischen content_elements_sites und content_element_options.

Derzeit verwende ich diese Abfrage den Wert alles erwarten zu bekommen:

$site = $this->Sites->find('all', [ 
     'conditions' => [ 
      'Sites.id' => $id 
     ], 
     'contain' => ['ContentElements' => [ 
       'sort' => [ 
        'ContentElementsSites.order' => 'ASC' 
       ], 
       'ContentElementOptions' => [ 
        'ContentElementsSitesValues' => [ 
         'conditions' => [ 
          'ContentElementsSitesValues.content_elements_sites_id' => 'ContentElementsSites.id', 
         ] 
        ] 
       ] 
      ] 
     ] 
    ]); 

Dies leer content_elements_sites_values ​​Ergebnisse

(int) 1 => object(App\Model\Entity\ContentElementOption) { 
    'id' => (int) 7, 
    'content_element_id' => (int) 1, 
    'name' => 'Test', 
    'json_name' => 'test', 
    'option_type_id' => (int) 1, 
    'content_elements_sites_value' => null,    
} 

derzeit Mein Programm sieht wie folgt aus: data scheme

Ich frage mich, ob diese Abfrage überhaupt möglich ist. Oder wenn das Ganze einfach zu flexibel ist.

Antwort

0

Die Art und Weise Sie die Beziehungen definiert haben, bedeutet, dass Sie einen sehr modularen Ansatz haben wollen, so dass ein Inhaltselement mit mehreren Standorten und ein Content-Element Option verwendet werden kann mit mehreren Inhaltselementen verwendet werden können.

Wenn das der Fall ist, sieht Schema Richtung in Ordnung mit wenigen Änderungen:

1) content_elements_sites_values ​​ Tabelle kann haben SITE_ID Spalte direkt statt content_elements_sites_id Spalte als Standort für einen Eintrag immer eindeutig sein In dieser Tabelle ist die Verbindungs-ID content_elements_sites nicht erforderlich.

2) content_elements_sites_values ​​ Tabelle kann zu content_element_options_values ​​umbenannt werden.

3) Sie können id Spalte von content_elements_sites und content_elements_sites_values ​​ Kreuzung Tabellen entfernen.

+0

Aber es wäre nicht möglich, mehrere Vorkommen eines _content_element_ auf derselben Seite zu haben, wenn ich die ** site_id ** in ** content_elements_sites_values ​​** setze. Ich werde meine Frage aktualisieren, weil ich das nicht klar gemacht habe - tut mir leid. Aber Sie haben recht, es wird sehr flexibel sein. Und das gibt mir Kopfschmerzen :) – Slice

+0

Ich sehe. dann können Sie mit ** content_elements_sites_id ** fortfahren. Was die Abfrage betrifft, sollten Sie ** matching() ** anstelle von * contain() * verwenden, da Sie die Ergebnisse der Haupttabelle auf der Grundlage von Zuordnungsbedingungen einschränken möchten. Gehen Sie hier Schritt für Schritt vor - rufen Sie zuerst zwei Verknüpfungen ab, überprüfen Sie die Abfrage im Debug-Kit, feuern Sie sie direkt in der Datenbank ab, nehmen Sie bei Bedarf Änderungen vor und fügen Sie dann die dritte Verknüpfung hinzu und wiederholen Sie diese. [Ref] (http://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#retrieving-associated-data) – Gaurav

0

vielleicht ist es das, was Sie suchen:

$site = $this->Sites->get($id, [ 
    'contain' => ['Templates', 'Colors', 'SiteTypes', 'ContentElements', 'ContentElements.ContentElementOptions','ContentElements.ContentElementOptions.ContentElementsSitesValues'], 
....]); 

nicht vergessen Assoziationsbeziehung in Modelltabelle zu definieren.

+0

Aber das ist nur eine andere Möglichkeit, die gleiche Abfrage zu schreiben. Ich versuche gerade meine Frage umzuformulieren. – Slice