2012-03-23 177 views
0

我正在設置一個設置,我不確定如何獲得正確的關聯設置。Cakephp HABTM協會

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

但如何建立正確HABTM模型TRIP和位置?

旅行屬於關聯用戶

旅行有一個從位置和位置=>從紐約,邁阿密

位置=>紐約,邁阿密+++

使用屬於關聯OG hasandbelongstomany?使用多個標識符是我的第一個。

任何人都可以提供一些幫助?謝謝!

-Tom

回答

1

我推薦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

嗨..這是類似於我在想什麼,但我的設置將依據,用戶在TIMEDATE會隨位置(不帶TIMEDATE領域打擾,當我得到正確的時候會插入)。如果可能的話插入更多的位置,例如,從紐約到邁阿密,通過槽DENVER。就像你說的,可以有多個位置。 – Tom 2012-03-23 20:11:21

+0

好吧,那麼你的原始設置是正確的,我只需要將表名改爲「locationtos」和「locationfroms」,並使外鍵id爲「locationto_id」和「locationfrom_id」,以使其與CakePHP的命名約定一致。 – Suman 2012-03-23 21:23:32

+0

並使用hasAndBelongsToMany?但是什麼模式?這是個問題;)謝謝你的時間! – Tom 2012-03-23 21:29:36

0

屬於關聯是代表了正確的方式,因爲你只有2由行程位置和那些2點的位置有不同的含義。

HABTM本來是正確的,如果您已經定義行程是這樣的:

在旅途中,你去很多地方,你不知道有多少。

0

如果您真的打算在單次旅行中使用兩個以上的地點,則應創建一個將旅程與地點相關聯的新表,併爲它們提供訂單。

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模型。

如果您還想在使用位置模型時查找行程,則還必須在此處定義它。;)

問候

func0der