0

クエリしようとしているテーブルが 3 つあります。現在、CakePHP は Visits と Guests からのみデータを引き出しています。

Visits
id   |  guest_id   |   room_id   |   arrival_date

Guests
id    |    name   |  user_id

Rooms
id    |    user_id   |  description 

訪問を照会するときに、3 つすべての情報を取得しようとしています

$visits = $this->paginate('Visit', array(
            'arrival_date >=' => $date,
            'room.user_id' => $user_id
            )
        );  

これが私のモデルでの関係です

モデルを訪問

public $hasOne = array(
    'Guest' => array(
        'foreignKey' => 'id'
    ),
    'Room' => array(
        'foreignKey' => 'id'
    )
);

ルームモデル

public $belongsTo = array(   //user creates a room
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

public $hasMany = array(
    'Visit' => array(
        'foreignKey' => 'visit_id',
    ),
);  

sql_dump を使用すると、すべてのクエリで、部屋の結合が次のように表示されます

LEFT JOIN `TestReservations`.`rooms` AS `Room` ON (`Room`.`id` = `Visit`.`id`) 

Room.id = Visit.room_id である必要があります

部屋モデルの hasOne リレーションを誤って room_id に変更してしまい、"Room.room_id = visit.id" として結合されていることに気付きました。この外部キーは明らかにこれを介して設定されているのに、なぜ訪問モデルにないのでしょうか?

4

1 に答える 1

1

そのような関係に対してテーブルが正しく設定されていないか、データベーススキーマに対して関係構成が正しくありません。

has-one リレーションシップでは、もう一方のテーブルに外部キーが含まれます。つまり、テーブルguestsroomsテーブルには、これが機能するための列が必要になりvisit_idます (ただし、これはあなたが望むものではないと思いますが、代わりに別のリレーションシップを使用する必要があります)。 .

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasoneを参照してください。

foreignKey : 他のモデルで見つかった外部キーの名前。これは、複数の hasOne 関係を定義する必要がある場合に特に便利です。このキーのデフォルト値は、アンダースコア付きの現在のモデルの単数形の名前で、末尾に「_id」が付きます。上記の例では、デフォルトで「user_id」になります。

モデルと同様に、Room多くの関係では、他のモデルにも外部キーが含まれています。つまり、構成では、room_id代わりに外部キーが必要ですvisit_id(visit_idスキーマによれば存在しません)。

現在、データベース スキーマには次の関係が反映されています。

  • Visit belongsTo Guest, Room
  • Guest hasMany Visit
  • Room hasMany Visit
  • Guest belongsTo User
  • Room belongsTo User
  • User hasMany Guest, Room

私はあなたのアプリケーションの特定のニーズについては知らないので、あなたのスキーマについてこれ以上提案することはできません (それは新しい質問の何かになるでしょう) が、一般的に、あなたのスキーマは今のところ問題ないように見えると思います. 訪問はゲストと部屋に固有のものですが、排他的ではないため、テーブルがVisit外部キーを保持するのは正しいです。部屋とゲストは 1 回の訪問にしか関連付けられないため、単純に間違っています。そのことを念頭に置いて、テーブルをそのままにして、上記のように CakePHP モデルの反映された関係に変更してください。hasOneRoomGuestvisits

リレーションシップ設定で外部キーを明示的に定義する必要がないことに注意してください。データベース スキーマの CakePHP 規則に従う場合、モデル名に基づく正しいキーが自動的に生成されます。

于 2013-08-17T22:41:44.027 に答える