Cakephp HABTM ассоциации - PullRequest
       25

Cakephp HABTM ассоциации

0 голосов
/ 23 марта 2012

Я работаю над настройкой, в которой я не уверен, как правильно настроить ассоциации.

Cakephp 1,3

Я думаю, что-то вроде этого, пожалуйста, поправьте меня, если я не прав!

База данных:

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`)
);

Но как настроить модели TRIP и LOCATION для правильного HABTM?

Поездки принадлежат ПОЛЬЗОВАТЕЛЮ

Поездки есть из одного места в другое => Из Нью-Йорка в Майами

Местоположение => Нью-Йорк, Майами +++

Используете ли принадлежат или имеет большое количество? Работа с несколькими идентификаторами - первая для меня.

Кто-нибудь, кто может оказать некоторую помощь? Спасибо!

-Tom

Ответы [ 3 ]

1 голос
/ 23 марта 2012

Я рекомендую hasAndBelongsToMany.Помните, что поездка может иметь несколько мест, а не только два.

Я бы перестроил ваши столы следующим образом:

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`)
);

и позволил бы CakePHP испечь это и позаботиться об остальном (он автоматически выберет отношение HABTM из общей таблицы.

РЕДАКТИРОВАТЬ: Извините, основываясь на ваших комментариях, я думаю, что это было бы лучше:

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`)
);

, а затем использовать несколько отношенийк той же модели, что и ниже: http://book.cakephp.org/1.3/view/1046/Multiple-relations-to-the-same-model

Для вашего примера locationfrom_id и locationto_id будут принадлежать двум классам, которые будут иметь одно и то же "className", то есть Locations.

0 голосов
/ 25 марта 2012

Если вы действительно планируете использовать более двух местоположений для одной поездки, вы должны создать новую таблицу, которая связывает поездки с местоположениями и дает им заказ.

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`)
);

Ассоциация HABTM будетзатем применить к модели Trip.

Если вы хотите найти поездки и при использовании модели Location, вам также нужно определить ее там.;)

Привет

func0der

0 голосов
/ 23 марта 2012

принадлежит. Это правильный способ представить его, потому что у вас есть только 2 местоположения на поездку, и эти два местоположения имеют разные значения.

HABTM был бы правильным, если бы вы определили поездку следующим образом:

Во время поездки вы посещаете множество мест и не знаете, сколько.

...