我正在尝试查询三个表。现在CakePHP只是从访问和访客中提取数据,因为我将探索不正确地加入房间。
Visits
id | guest_id | room_id | arrival_date
Guests
id | name | user_id
Rooms
id | user_id | description
我在查询访问时试图获取有关这三件事的信息
$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的每一个查询中,它显示了Rooms的连接
LEFT JOIN `TestReservations`.`rooms` AS `Room` ON (`Room`.`id` = `Visit`.`id`)
应该是Room.id = Visit.room_id
我不小心将我的房间模型中的hasOne关系更改为room_id,我发现它加入为“Room.room_id = visit.id”。这个外键显然是通过这个设置的,那为什么不是访问模型中的那个呢?
答案 0 :(得分:1)
对于这种关系,您的表格设置不正确,您的关系配置分别对于您的数据库架构不正确。
在has-one关系中, other 表包含外键,即guests
和rooms
表需要visit_id
列工作(虽然我认为这不是你想要的,但你应该选择不同的关系)。
请参阅http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasone
foreignKey :在其他模型中找到的外键的名称。如果您需要定义多个hasOne关系,这尤其方便。此键的默认值是当前模型的下划线,单数名称,后缀为“_id”。在上面的示例中,它将默认为“user_id”。
与Room
模型类似,在has-many关系中,另一个模型也包含外键,即在配置中外键应为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
我不知道你的应用程序的具体需求,所以我无法真正为你的架构提出进一步的建议(这将是一个新问题),但通常我会说你的架构看起来不错< em>到目前为止。更改它以使Visit
与hasOne
和Room
之间存在Guest
关系是我绝对不鼓励的,访问是特定于访客和房间的内容,但是它不是独占的,所以visits
表保存外键是正确的,反之亦然,因为一个房间和一个客户只能与一次访问相关联。因此,考虑到这一点,保持您的表格不变,并更改为上面列出的CakePHP模型的反映关系。
请注意,在遵循数据库模式的CakePHP约定时,您不必在关系配置中显式定义外键,而是自动生成基于模型名称的正确键。