2010-12-06 4 views
0

ich mich gefragt, ob dies möglich ist, mit einem zu tun hat viele durchcakephp - eine andere hat viele durch Beziehung

contents  orgs   folders 
id    id    id 
name   name   title 
link 

join table - folder_elements 
       id 
       element_id 
       order 

Inhalt hat viele Ordner durch folder_elements

Orgs viele Ordner durch folder_elements

Also meine Frage ist, ist es möglich, Element_id zu verwenden, um die content.id oder die org.id zu speichern?

Alex

+0

'folder_elements' wird Kuchen Konventionen brechen, so dass es ist sehr nicht empfohlen, Uhr Daniel vorgeschlagene Lösung – Ish

Antwort

4

Was Sie beschreiben, ist eine Art HABTM (hasAndBelongsToMany) Vereinigung. Sie könnten die Inter-Model-Assoziationen so definieren, wie Sie es vorschlagen, aber es gibt einen beträchtlichen Designfehler: Wie würden Sie eine Situation berücksichtigen, in der die gleiche ID für einen orgs Datensatz und einen contents Datensatz verwendet wird und diese mit demselben verknüpft werden sollen folder aufnehmen? Es wäre unmöglich, zwischen den beiden in Ihrem Tisch zu unterscheiden.

Es gibt eine Reihe von Möglichkeiten, um dies zu umgehen, aber sie erfordern mehr Programmlogik oder ein unorganisierteres Datenbankschema, das Herausforderungen in der Wartbarkeit darstellt.

Die elegantere, robustere Lösung ist die Rationalisierung Ihrer Datenbankstruktur. Wenn es keine ist dringende Notwendigkeit haben eine Table-Join Them All Regel, könnten Sie Ihr Modell Verbände wie dieses Design:

  • Content hasMany ContentsFolder belongsTo Folder
  • Folder hasMany ContentsFolder belongsTo Content
  • Org hasMany OrgsFolder belongsTo Folder
  • Folder hasMany OrgsFolder belongsTo Org

Dies ist die interne Struktur einer HABTM-Assoziation, die explizit definiert ist, damit Sie c Definieren Sie Felder in der Verbindungstabelle. Ihre contents und folders Tabellen würde gleich bleiben, aber Ihre beiden Verbindungs ​​Tabellen aussehen würde:

contents_folders 
-> id 
-> content_id 
-> order 

orgs_folders 
-> id 
-> org_id 
-> order 

Leider ja, würde dies fünf Modelle anstelle von drei erfordern definieren, aber so sind die Grenzen von CakePHP objektrelationalen Modellieren.

+0

Vielen Dank! das klärt das auf. – Alex

+0

Gut zu helfen! :) –