У меня есть клиент с базой данных, которая имеет несколько масштабных и взаимосвязанных моделей.Мы столкнулись со странной «ошибкой» в отношениях с $ hasOne, которые мы производим.Проблема заключается в следующем:
Модель UsersItems имеет отношение $ hasOne с пользователями.Это выглядит следующим образом:
var $hasOne = array(
'Author' => array(
'className' => 'User',
'foreignKey' => 'id'
)
);
Это извлекает и объединяет пользовательские данные с псевдонимом «Автор» для этих элементов (которые также принадлежат Пользователям в контексте пользователей, которые выбрали их для «закладки»).
Если у UserItem есть id
, скажем, 3445 (больше середины диапазона текущего размера таблицы), он прекрасно справляется.
Однако, если UserItem имеет, скажем, id
5000 (верхний диапазон текущего размера таблицы), $ 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
в качестве идентификатора автора, поэтому я знаю, что это была проблема;сейчас я пытаюсь выяснить, как заставить Cake сгенерировать этот правильный запрос ...