0

我有三个要查询的表。现在,CakePHP 仅从 Visits 和 Guest 中提取数据,它错误地加入了 Rooms,正如我将解释的那样。

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 时的每一个查询中,它都将 Room 的连接显示为

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 关系中,另一个表包含外键,即guestsandrooms表需要一个visit_id列才能工作(尽管我认为这不是你想要的,你可能应该改用不同的关系) .

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasone

foreignKey:在另一个模型中找到的外键的名称。如果您需要定义多个 hasOne 关系,这将特别方便。此键的默认值是当前模型的带下划线的单数名称,后缀为“_id”。在上面的示例中,它将默认为“user_id”。

与您的模型类似Room,在多方关系中,另一个模型也包含外键,即在配置中,外键应该是room_idvisit_id根据visit_id您的架构甚至不存在)。

您的数据库架构当前反映以下关系:

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

我不知道您的应用程序的具体需求,所以我真的无法为您的架构提出进一步的建议(这将是一个新问题),但通常我会说您的架构到目前为止看起来还不错。将其更改为与并且是Visit我绝对不鼓励的事情,访问是特定于客人和房间的事情,但它不是排他性的,所以桌子持有外键是正确的,反之亦然这完全是错误的,因为房间和客人只能与一次访问相关联。因此,记住这一点,让您的表保持原样,并更改为上面列出的 CakePHP 模型的反射关系。hasOneRoomGuestvisits

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

于 2013-08-17T22:41:44.027 回答