2012-03-23 14 views
0

Ich arbeite an einem Setup, bei dem ich nicht sicher bin, wie man richtige Assoziationen Setup bekommen.CakePHP HABTM Assoziationen

CakePHP 1.3

ich so etwas wie dies denke, korrigieren Sie mich bitte, wenn ich falsch bin!

Datenbank:

CREATE TABLE IF NOT EXISTS `trips` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `user_id` bigint(20) NOT NULL, 
    `location_to` bigint(20) NOT NULL, 
    `location_from` bigint(20) NOT NULL, 
    `published` int(1) DEFAULT NULL, 
    `created` datetime DEFAULT NULL, 
    `modified` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ; 

CREATE TABLE IF NOT EXISTS `locations` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL 
    PRIMARY KEY (`id`) 
); 
CREATE TABLE IF NOT EXISTS `locations_from` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `trip_id` bigint(20) NOT NULL, 
    `location_id` bigint(20) NOT NULL 
    PRIMARY KEY (`id`) 
); 
CREATE TABLE IF NOT EXISTS `locations_to` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `trip_id` bigint(20) NOT NULL, 
    `location_id` bigint(20) NOT NULL 
    PRIMARY KEY (`id`) 
); 

Aber wie die Modelle TRIP einzurichten und LOCATION für die korrekte HABTM?

Trips belongsTo USER

Trips hat von Ort ein und location => Von New York, um Miami

Standorte => New York, Miami +++

Verwenden belongsTo og hasAndBelongsToMany? Mit mehreren Bezeichnern zu arbeiten, ist für mich eine Premiere.

Jeder, der etwas Hilfe geben kann? Vielen Dank!

-Tom

Antwort

1

Ich empfehle ein hasAndBelongsToMany. Denken Sie daran, dass eine Reise mehrere Orte haben kann, nicht nur zwei.

Ich würde wieder konstruieren Ihre Tabellen wie folgt aus:

CREATE TABLE IF NOT EXISTS `trips` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `user_id` bigint(20) NOT NULL, 
    `published` int(1) DEFAULT NULL, 
    `created` datetime DEFAULT NULL, 
    `modified` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ; 
CREATE TABLE IF NOT EXISTS `locations` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL 
    PRIMARY KEY (`id`) 
); 
CREATE TABLE IF NOT EXISTS `locations_trips` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `location_id` bigint(20) NOT NULL 
    `trip_id` bigint(20) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

und lass CakePHP diese backen und kümmern uns um den Rest (es wird die HABTM Beziehung von der gemeinsamen Tabelle automatisch abholen).

EDIT: Sorry, basierend auf Ihre Kommentare, ich denke, das wäre besser:

CREATE TABLE IF NOT EXISTS `trips` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `user_id` bigint(20) NOT NULL, 
    `locationfrom_id` bigint(20) NOT NULL, 
    `locationto_id` bigint(20) NOT NULL, 
    `published` int(1) DEFAULT NULL, 
    `created` datetime DEFAULT NULL, 
    `modified` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ; 
CREATE TABLE IF NOT EXISTS `locations` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL 
    PRIMARY KEY (`id`) 
); 

und dann wie unten mehrere Beziehungen zu dem gleichen Modell verwenden: http://book.cakephp.org/1.3/view/1046/Multiple-relations-to-the-same-model

Für Ihr Beispiel locationfrom_id und locationto_id würde zu zwei Klassen gehören, die denselben "Klassennamen" haben, also Orte.

+0

Hallo .. Dies ist ähnlich zu dem, was ich dachte, aber mein Setup wird auf basieren, USER von Ort zu Ort bei TIMEDATE wird (nicht mit Zeit- und Datumsfelder stören , wird eingefügt wenn ich richtig richtig komme). Wenn möglich, mehr Ort einfügen, wie, von NY nach Miami, vorbei an DENVER. Wie du sagst, können mehrere Standorte haben. – Tom

+0

OK, dann war das ursprüngliche Setup korrekt, ich würde nur die Tabellennamen in "localtos" und "locationfroms" ändern und die Fremdschlüssel-IDs "localto_id" und "locationfrom_id" haben, damit sie mit den Namenskonventionen von CakePHP übereinstimmen. – Suman

+0

Und hasAndBelongsToMany verwenden? Aber was in welchem ​​Modell? das ist die Frage;) Danke für deine Zeit! – Tom

0

belongsTo ist der richtige Weg, es zu vertreten, da Sie nur 2 Standorte von Reise haben und diese zwei Standorte unterschiedliche Bedeutungen haben.

HABTM richtig gewesen wären, wenn Sie eine Reise auf diese Weise definiert hatten:

Während einer Reise, gehen Sie zu vielen Orten, und Sie wissen nicht viele, wie.

0

Wenn Sie wirklich planen, mehr als zwei Standorte für eine einzelne Fahrt zu verwenden, sollten Sie eine neue Tabelle erstellen, die die Fahrten mit den Standorten verknüpft und ihnen eine Bestellung erteilt.

CREATE TABLE IF NOT EXISTS `location_trips` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `location_id` bigint(20) NOT NULL, 
    `trip_id` bigint(20) NOT NULL, 
    `number` bigint(20) NOT NULL 
    PRIMARY KEY (`id`) 
); 

Die HABTM-Zuordnung würde dann auf das Trip-Modell angewendet werden.

Wenn Sie auch bei der Verwendung des Standortmodells nach Ausflügen suchen möchten, müssen Sie es auch dort definieren.;)

Grüße

func0der

Verwandte Themen