2009-03-17 20 views
3

Mit CakePHP habe ich eine generische Adressentabelle, die ich mit Kunden, Lieferanten, Kontakte verknüpfen möchte. die meisten Tische haben nur eine 1 bis 1 Beziehung, aber ich möchte, dass meine Kunden Tabelle 2Wie verwende ich mehrere Fremdschlüssel in einer Tabelle mit Bezug auf eine andere Tabelle in CakePHP

vielleicht zur Klärung haben: Ich habe eine Tabelle Kunden

id, int 
mailing_address_id, int 
billing_address_id, int 

und eine Adressen-Tabelle

id,int 
addr, varchar 
city, varchar 
etc.... 

Jetzt weiß ich, ich könnte eine customer_id in die Adressentabelle setzen. Aber ich möchte das nicht machen, weil ich eine Tabelle mit Verkäufern, Kontakten und anderen Tabellen habe, die alle die Adresstabelle verwenden werden. Die customer_id wäre nicht wirklich relevant für diese anderen Tabellen.

würde ich die Kunden Modell wie in den beiden Adressen

Antwort

1

Folgen Travis Leleu Vorschlag - denn es ist eine gute Idee, und zwar unabhängig.

Fügen Sie dann ein Enum-Feld zur Addresses-Tabelle mit dem Namen table_id hinzu. Der Wert des Feldes table_id könnte "Kunde", "Lieferant", "Kontakt" und alle anderen Tabellen sein, die mit der Adresstabelle verknüpft werden.

Fügen Sie auch einen einzigen Fremdschlüssel mit der Bezeichnung entity_id ein. Dieser Fremdschlüssel wäre der Primärschlüssel des entsprechenden Kunden, Lieferanten oder was auch immer.

Wenn Sie zum Beispiel die Rechnungsadresse für einen bestimmten Anbieter möchten, fügen Sie in der $conditions Array:

'Address.entity_id'=>'123456' 
'Address.table_id'=>'vendor' 
'Address.type'=>'billing' 

Mit diesem Set-up können Sie so viele Tabellen haben, wie Sie die Addresses Tabelle verweisen möchten .

+0

Während ich auf eine automatische Lösung gehofft hatte, wird diese gut funktionieren. –

+0

Das hat mir geholfen, aber würde es kein Problem geben, wenn die Adresse sowohl ein Lieferant als auch ein Kunde ist? –

0

Jack automatisch verknüpfen,

Vielleicht richtig verstehe ich die Frage nicht, so dass ich entschuldige mich, wenn ich falsch interpretiert habe.

Ich würde wahrscheinlich nur ein Enum-Feld in der Adresstabelle machen, um zu notieren, welche Art von Adresse es ist (Abrechnung oder Mailing). Dann können Sie eine direkte $ hasMany-Beziehung zwischen Ihrem Kundenmodell und Ihrem Adressmodell verwenden. Wenn Sie eine Abfrage durchführen (z. B. möchten Sie nur die Rechnungsadresse für einen bestimmten Kunden), geben Sie einfach im Array $ conditions 'Address.type = =' billing 'an.

HTH, Travis

+0

Bitte sehen Sie meine bearbeitete Frage. –

0

Wenn ein Kunde hasMany Adressen, verwenden Sie die hat-viele Assoziations:

http://book.cakephp.org/view/82/hasMany

Wenn ein Kunde hasOne (und nur eine) Adresse, verwenden Sie die hat-ein Verband:

http://book.cakephp.org/view/80/hasOne

Wenn die Kunden möglicherweise th teilen könnten Bei gleicher Adresse (gleicher Datensatz) müssen Sie HABTM mit der Join-Tabelle verwenden, auf die Sie angespielt haben.

Mehr Infos über Cake Verbände: http://book.cakephp.org/view/78/Associations-Linking-Models-Together

+0

Ich habe meine Frage zur besseren Übersicht bearbeitet. Wenn ich hasMany oder hasOne mit meinem Setup verwenden kann, bin ich mir nicht sicher, wie. –

+0

Hast du das Blog-Tutorial auf der CakePHP-Seite durchgesehen? Es geht über Tabellenverknüpfungen hinweg. –

1

Ich mag Kyle's und Travis's Vorschläge, aber Sie können auch die Fremdschlüssel die andere Richtung setzen.

Wenn Sie möchten, dass Ihre Adressen unabhängig sind und mehrere andere Tabellen auf sie verweisen, sollten Sie in der Lage sein, zwei belongsTo relationships von Kunde zu Adresse zu definieren. Jede Beziehung muss dann angeben, welches Feld als Fremdschlüssel verwendet werden soll.

Beide Lösungen lassen Sie jedoch für verwaiste Adressen offen, weil die Fremdschlüsseleinschränkung nicht wirklich korrekt ist. Die einfachste Lösung könnte darin bestehen, der Adreßtabelle einfach einen Stapel optionaler Fremdschlüssel hinzuzufügen, wie z. B. customer_id, company_id, employee_id und so weiter. Dann haben Sie ein Standardbogenmuster, und die Schlüssel zeigen in die richtige Richtung, so dass Sie die korrekte referentielle Integrität erhalten.

Eine andere Lösung besteht darin, eine allgemeinere Entitätentabelle mit einer Adresse als untergeordnete Tabelle zu entwerfen. Dann sind Kunde, Firma und Mitarbeiter alle Subtypen der Entitätstabelle. Für weitere Details zu diesem Schemastil empfehle ich Data Model Patterns von David Hay.

Verwandte Themen