Was ist der beste Weg, um eine tableA HABTM tableA Beziehung für eine CakePHP Anwendung zu erstellen?
-
03-07-2019 - |
Frage
Ich habe die Notwendigkeit, die Funktionalität erstellen registrierten Benutzer zu ermöglichen, sich mit anderen Nutzungen zu verbinden und eine Familie zu gründen. Meine Datenbank-Tabellen wie folgt aussehen:
db.persons - (Bob, Jane, Timmy, etc.)
- id
- name
db.persons_persons
- id
- person__id_parent
- person_id_child
- relationtype_id
db.relationtypes - (Ehegatte, Kind, Neffen, etc.)
- id
- name
Mit dieser Struktur soll ich in der Lage sein, zu spezifizieren, dass Bob ein Ehegatte von Jane in der persons_persons Tabelle ist. Der Rekord in db.persons_persons aussehen würde etwas (psuedo):
ID | person_parent | person_child | relationtype
1 | Bob | Jane | Spouse
2 | Bob | Timmy | Child
Ich weiß, dies könnte eine Datenfragmentierung verursachen, da, wenn Bob und Jane verheiratet sind, dann würde ein Kind von einem haben mit dem anderen verbunden sein. Aber das ist nicht meine Frage. Meine Frage ist, ob diese Datenbank-Setup ist ‚am meisten richtiger‘ für den Einsatz in einer CakePHP Anwendung.
Lösung
Zum einem CakePHP wird automatigally eine people
Tabelle in einen people
-Controller und ein person
Modell inflect, so dass Sie es persons
nicht nennen müssen. Dann würde ich die Lookup-Tabelle relationships
nennen anstatt persons_persons
.
würde ich die Felder in Ihren Beziehungen Tabelle person_id
nennen, relation_id
und relation_type_id
, und dann einen Unterstrich in Ihrem relationtypes
Tabellennamen hinzufügen, damit es relation_types
wird.
Ich denke, das semantische ist.
Sie können nach wie vor eine hasAndBelongsToMany Vereinigung, verwenden und die Verwendung des Automagic „ mit “von CakePHP angeboten Verbänden (1.2 nur) für Beziehungstyp der zusätzlichen Daten in der HABTM Tabelle zugreifen zu können.
Allerdings habe ich versucht sein würde zu verwenden:
-
Person
hasManyRelation
-
Relation
belongsToPerson
,Relation
,RelationType
In der App ist eine Beziehung Personen implizierte Beziehung jemand anderes zu ihnen? D. h wenn Sie feststellen, Person.id = 1 Sie könnten alle ihre Beziehungen erhalten, zum Beispiel Person.id 2, 3 und 4. Aber wenn Sie Person.id 2 finden, würden Sie nicht automatisch erhalten Person.id = 1, es sei denn, es gab einen anderen Datensatz in der Tabelle Beziehungen, die diese Beziehung dargestellt.
Um dies zu erreichen, können Sie eine andere assocation einrichten:
-
Person
hasManyRelation1
mit foreignKeyperson_id
-
Person
hasManyRelation2
mit foreignKeyrelation_id
-
Relation
belongsToPerson
,Relation
,RelationType
Beachten Sie, können Sie diese doppelte Beziehung mit HABTM erreichen.