2012-03-23 7 views
0

私は正しいアソシエーション設定を取得する方法がわからない設定に取り組んでいます。Cakephp HABTM associations

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とLOCATIONをしますか? Userに属し

ツアー

ツアーは、ある場所から場所へと=>ニューヨークから、マイアミ

場所に=>ニューヨーク、マイアミ+++

使用belongsToのOG hasAndBelongsToManyの?いくつかの識別子を使って作業することが私にとっては初めてのことです。

助けてもらえますか?ありがとう!あなたが旅行することによってのみ、2場所を持っており、それらの2箇所が異なる意味を持っているので

-Tom

答えて

1

私はhasAndBelongsToManyをお勧めします。旅行には2つだけでなく、複数の場所があることを覚えておいてください。

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

をして(それが自動的に共通テーブルからHABTM関係をピックアップします)CakePHPはこれを焼くと、残りの世話をしてみましょう:

私はこのようなあなたのテーブルを再構築します。

編集:申し訳ありませんが、あなたのコメントに基づいて、私はこれは良いことだと思う。そして、

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はbelongsToと同じ "className"を持つ2つのクラス(Locations)です。

+0

こんにちは。これは私が考えていたものに似ていますが、私のセットアップは、ユーザーがTIMEDATEで場所から場所へ行くに基づいています(のtimedateフィールドを気にいけません、habtmが正しいときに挿入されます)。可能であれば、ニューヨークからマイアミに向かい、DENVERを通って、より多くの場所を挿入することが可能です。あなたが言うように、複数の場所を持つことができます。 – Tom

+0

元の設定が正しい場合は、テーブル名を "locationtos"と "locationfroms"に変更し、CakePHPの命名規則と一致するように外部キーIDを "locationto_id"と "locationfrom_id"にします。 – Suman

+0

そしてhasAndBelongsToManyを使用しますか?しかし、どのようなモデルですか?それは質問です;)あなたの時間をありがとう! – Tom

0

belongsToのは、それを表現するための正しい方法です。あなたが旅行をこのように定義されていた場合

HABTMが正しいされているでしょう:

旅行中に、あなたは多くの場所に行くと、あなたはどのように多くのか分かりません。

0

1回のトリップに2つ以上の場所を使用する予定がある場合は、旅行を場所に関連付けて注文する新しいテーブルを作成する必要があります。

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アソシエーションが適用されます。

場所モデルを使用している間に旅行を検索する場合は、その場所も定義する必要があります。;)

挨拶

func0der

関連する問題