CakePHP似乎忽略了外键

时间:2013-08-17 22:00:38

标签: php cakephp

我正在尝试查询三个表。现在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”。这个外键显然是通过这个设置的,那为什么不是访问模型中的那个呢?

1 个答案:

答案 0 :(得分:1)

对于这种关系,您的表格设置不正确,您的关系配置分别对于您的数据库架构不正确。

在has-one关系中, other 表包含外键,即guestsrooms表需要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>到目前为止。更改它以使VisithasOneRoom之间存在Guest关系是我绝对不鼓励的,访问是特定于访客和房间的内容,但是它不是独占的,所以visits表保存外键是正确的,反之亦然,因为一个房间和一个客户只能与一次访问相关联。因此,考虑到这一点,保持您的表格不变,并更改为上面列出的CakePHP模型的反映关系。

请注意,在遵循数据库模式的CakePHP约定时,您不必在关系配置中显式定义外键,而是自动生成基于模型名称的正确键。