2011-04-28 18 views
2

我有一個擁有數個數據庫的客戶端,這個數據庫有幾個相當大的和相互關係的模型。在我們生產的$ hasOne關係中,我們遇到了一個奇怪的「錯誤」。問題是這樣的:CakePHP沒有爲hasOne關係拉動超過一定數量的行

模型UsersItems與用戶具有$ hasOne關係。它是如下

var $hasOne = array(
    'Author' => array(
     'className' => 'User', 
     'foreignKey' => 'id' 
    ) 
); 

這拉動並用(具有選定他們爲「書籤」,這也屬於在用戶的上下文中的用戶)的別名「作者」爲這些項加入用戶數據。

如果UserItem有一個id,比如說3445(表格當前大小範圍的更多中間值),它就可以很好地實現。

但是,如果UserItem具有(例如表格當前大小的上限範圍)的id,那麼$ hasOne無法從find()中提取任何信息。因此,似乎更新的「書籤」項目不檢索作者數據,而其他人(「舊」)做得很好。

這會導致什麼?

添加的信息

查詢如下:

SELECT `UsersItem`.`id`, `UsersItem`.`user_id`, `UsersItem`.`item_id`, 
     `UsersItem`.`in_list`, `User`.`id`, `User`.`username`, `User`.`password`, 
     `User`.`email`, `User`.`group_id`, `User`.`resethash`, `User`.`confirmhash`, 
     `User`.`confirmed`, `Item`.`id`, `Item`.`user_id`, `Item`.`name`, 
     `Item`.`category_id`, `Item`.`description`, `Item`.`pagelink`, 
     `Item`.`purchaselink`, `Item`.`moderated`, `Item`.`image_filename`, 
     `Item`.`votecount`, `Item`.`parent_id`, `Item`.`discover_order`, 
     `Item`.`created`, `Item`.`slug`, `Item`.`normalized_name`, 
     ((`Item`.`votecount`)/pow((3600*TIMEDIFF(`Item`.`created`, NOW()) + 12), .42)) AS `Item__rank`, 
     `Author`.`id`, `Author`.`username`, `Author`.`password`, `Author`.`email`, 
     `Author`.`group_id`, `Author`.`resethash`, `Author`.`confirmhash`, 
     `Author`.`confirmed` 
FROM `users_items` AS `UsersItem` 
LEFT JOIN `users` AS `User` ON (`UsersItem`.`user_id` = `User`.`id`) 
LEFT JOIN `items` AS `Item` ON (`UsersItem`.`item_id` = `Item`.`id`) 
LEFT JOIN `users` AS `Author` ON (`Author`.`id` = `UsersItem`.`id`) 
WHERE `UsersItem`.`user_id` = 1118 
    AND `UsersItem`.`in_list` = 1 
ORDER BY `UsersItem`.`id` DESC 

第二個增補

這個查詢確實工作:

SELECT `UsersItem`.`id`, `UsersItem`.`user_id`, `UsersItem`.`item_id`, `UsersItem`.`in_list`, `User`.`id`, `User`.`username`, `User`.`password`, `User`.`email`, `User`.`group_id`, `User`.`resethash`, `User`.`confirmhash`, `User`.`confirmed`, `Item`.`id`, `Item`.`user_id`, `Item`.`name`, `Item`.`category_id`, `Item`.`description`, `Item`.`pagelink`, `Item`.`purchaselink`, `Item`.`moderated`, `Item`.`image_filename`, `Item`.`yeekcount`, `Item`.`parent_id`, `Item`.`discover_order`, `Item`.`created`, `Item`.`slug`, `Item`.`normalized_name`, ((`Item`.`yeekcount`)/pow((3600*TIMEDIFF(`Item`.`created`, NOW()) + 12), .42)) AS `Item__rank`, `Author`.`id`, `Author`.`username`, `Author`.`password`, `Author`.`email`, `Author`.`group_id`, `Author`.`resethash`, `Author`.`confirmhash`, `Author`.`confirmed` FROM `users_items` AS `UsersItem` LEFT JOIN `users` AS `User` ON (`UsersItem`.`user_id` = `User`.`id`) LEFT JOIN `items` AS `Item` ON (`UsersItem`.`item_id` = `Item`.`id`) LEFT JOIN `users` AS `Author` ON (`Author`.`id` = `Item`.`user_id`) WHERE `UsersItem`.`user_id` = 1118 AND `UsersItem`.`in_list` = 1 ORDER BY `UsersItem`.`id` DESC 

注意,在這個特殊的位的區別:

LEFT JOIN `users` AS `Author` ON (`Author`.`id` = `Item`.`user_id`) 

我是拉錯id作爲作者的ID前面,所以我知道這是問題;現在我想弄清楚如何讓蛋糕生成這個正確的查詢...

+4

什麼是生成的SQL查詢,它是如何失敗的? – deceze 2011-04-28 05:22:44

+0

我會盡快更新。 – dclowd9901 2011-04-28 14:50:17

+0

向原問題添加新信息。 – dclowd9901 2011-04-30 18:06:05

回答

2

這裏找不到答案。無論好壞,我最終做的是創建一個虛擬的字段,填充作者姓名的價值。

關係模型的問題是它們僅適用於通過相關模型調用時。在我的情況下,UsersItems表和編寫相關項目的人的姓名之間沒有(也不應該是)任何關係。

虛擬表被調用該模型的外觀實例。這意味着,即使在UsersItems-> Items關係中,項目填充其虛擬字段。

我最終什麼事在item.php模型文件創建看起來有點像:

var $virtualFields = array(
    'author' => 'SELECT `username` FROM `users` WHERE `id = Item.user_id`' 
); 

我等聽別人早在這是否是一個合適的解決方案,這問題,但這是迄今爲止唯一一個爲我工作的人。因爲UsersItems表中沒有關聯的author_id列,所以我只是不知道如何將兩個表關聯起來。

+0

我想你是在尋找像這樣的東西 - http://bakery.cakephp.org/articles/eldonbite/2008/09/18/subclass-behavior – Rifat 2011-05-07 16:42:42

+0

可能。我可能會用這種子類方法重新審視。 – dclowd9901 2011-05-08 08:09:39

1

我瘋狂的猜測是,在某些時候作者和UserItem的ID已經不同步,即作者ID 3445 hasOne UserItem ID 3445但作者id 5000 hasOne UserItem 5001或其他內容,並且該查詢嘗試獲取錯誤表的ID。但沒有看到生成的查詢,這很難說。

3

如果我理解正確的查詢,您的公會應該是這樣的:

在UserItem型號:

var $belongsTo= array(
    'User', 'Item' 
); 

在產品型號:

var $hasMany = array(
    'UserItem' 
); 

var $hasOne = array(
    'Author' = array(
     'className' => 'User', 
     'foreignKey' => 'id' 
); 

我希望這有助於。

+0

如何查詢模型?使用可包含的行爲?我們可以得到正在執行的查詢查詢嗎? – talelcool 2011-05-05 08:33:52

+0

這未經測試。我只是一邊想着這個一邊打字。 – junwafu 2011-05-05 09:07:31

4

也許你應該切換作者關係屬於關聯,而不是hasOne在你的產品型號如下:

var $BelongsTo= array(
'Author' = array(
    'className' => 'User', 
    'foreignKey' => 'user_id'); 

book解釋得非常好,在屬於關聯關係外鍵是你所需要的:

foreignKey:在當前模型中找到的外鍵的名稱。如果您需要定義多個belongsTo關係,這特別方便。此鍵的默認值是其他模型的下劃線單數名稱,後綴爲「_id」。

希望我幫助:)。