簡體   English   中英

CakePHP似乎忽略了外鍵

[英]CakePHP seems to ignore foreign key

我有三個要查詢的表。 目前,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時,它會顯示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”的形式加入。 顯然是通過此方式設置了此外鍵,那么為什么訪問模型中沒有該外鍵?

對於這種關系,您的表設置不正確,或者對於數據庫架構,關系配置不正確。

在一對一關系中, 另一個表包含外鍵,即, 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

我不了解您的應用程序的特定需求,因此我無法真正為您的架構提出進一步的建議(這將是一個新問題),但是通常我會說到目前為止您的架構還可以。 我絕對不建議更改它,以使VisitRoomGuest之間具有hasOne關系,這絕對是我不鼓勵的,一次訪問是特定於來賓和房間的,但這不是唯一的,因此, visits表包含外鍵是正確的,否則,這將是完全錯誤的,因為一個房間和一個客人只能與一次訪問相關聯。 因此請記住,將表保持原樣,並更改為上面列出的CakePHP模型的反映關系。

請注意,您不必在關系配置中顯式定義外鍵,在遵循數據庫架構的CakePHP約定時,會自動生成基於模型名稱的正確鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM