【发布时间】:2011-04-28 05:16:46
【问题描述】:
我有一个客户,它的数据库有几个相当大的相互关系模型。我们在生成的 $hasOne 关系中遇到了一个奇怪的“错误”。问题是这样的:
模型UsersItems 与Users 有$hasOne 关系。如下
var $hasOne = array(
'Author' => array(
'className' => 'User',
'foreignKey' => 'id'
)
);
这会为这些项目提取并加入别名为“作者”的用户数据(在用户选择它们进行“书签”的情况下,这些项目也属于用户)。
如果 UserItem 有一个 id,比如 3445(表的当前大小范围的中间位置),它就可以顺利通过。
但是,如果一个 UserItem 具有 5000(表当前大小的上限)的 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,所以我知道这是问题所在;现在我正试图弄清楚如何让 Cake 生成这个正确的查询......
【问题讨论】:
-
生成的SQL查询是什么,怎么会失败?
-
我会尽快更新这些内容。
-
为原始问题添加了新信息。
-
如果您在数据库上手动执行此查询是否有效?
users中是否有匹配UsersItem.id的条目? -
如果在数据库上手动执行,查询效果不会更好。相同的项目返回与作者有关的缺失信息。目前在用户中不存在与 UsersItem.id 匹配的相应条目。我想我看到了答案的走向......
标签: php mysql cakephp relational-database cakephp-model