У меня есть оператор SQL, который возвращает результаты, которые я хочу, однако мне нужно развернуть эти результаты, и у меня возникли проблемы с прошлыми парами дней, пытаясь получить запрос, преобразованный в $ this-> paginateCakePHP Преобразование SQL в Paginate
Я работаю с двумя таблицами, которые имеют отношение habtm; пунктов и item_owns. Таблица item_owns содержит 3 столбца: id, item_id и user_id, в то время как таблица items содержит id, collection_id и имя.
SQL, которая возвращает результаты мне нужно:
SELECT it.id, it.name, COALESCE(count,0) as count
FROM items as it
LEFT OUTER JOIN (
SELECT count(ito.item_id) as count, ito.item_id
FROM item_owns as ito
WHERE ito.user_id='4ffb9027-8c0c-4086-a13e-01a0cab1739a'
GROUP BY ito.item_id
) as ct ON ct.item_id = it.id
WHERE it.collection_id='4fc923f5-0a58-453f-9507-0c0c86106d80';
Ниже фрагмент кода получает меня близко, но я в конечном итоге приходится выполнять подсчет item_owns по user_id (сгруппированные по item_id) вне функции постраничной что означает I не может сортировать на основе подсчета ...
$this->paginate = array(
'limit' => 5,
'conditions' => array('Item.collection_id'=> $id),
'fields' => array('Item.id', 'Item.collection_id', 'Item.name'),
'contain' => array(
'ItemOwn'=>array(
'fields' => array('ItemOwn.id, ItemOwn.item_id, ItemOwn.user_id'),
'conditions' => array('ItemOwn.user_id' => $this->Session->read('Auth.User.id')),
)
)
);
Я также попытался с помощью «присоединяется» => Array(), но не знаю, как я указываю «счетчик» вызова в массиве полей
$this->paginate = array(
'limit' => 5,
'fields' => array('Item.id', 'Item.collection_id', 'Item.name', 'count(ItemOwn.item_id)'),
'conditions' => array('Item.collection_id'=> $id, 'ItemOwn.user_id' => $this->Session->read('Auth.User.id')),
'joins' => array(
array(
'alias' => 'ItemOwn',
'table' => 'item_owns',
'foreign_key' => false,
'type' => 'LEFT OUTER',
'conditions' => array('ItemOwn.item_id = Item.id'),
'group' => 'ItemOwn.item_id'
)
)
);
Я подозреваю, что, возможно, потребуется использовать пользовательскую функцию постраничной, но я опять не знаю, где некоторые стыки и условия будут идти в том, что ...
Любые идеи с благодарностью! Спасибо MK
Спасибо за ответ. Я рассмотрел использование кеша-счетчика, но это означало бы создание новой таблицы в моей БД, поскольку в item_owns могут быть дубликаты item_ids с уникальным собственным item_owns.id. Это связано с тем, что один и тот же элемент может принадлежать пользователю несколько раз, но это разные экземпляры/копии этого элемента. – mk97
Хм, вы могли бы попытаться создать еще одну временную взаимосвязь между таблицами, которые вам нужно использовать, подсчитывая, что будет просто использоваться для этого. Подобно использованию функции bindModel() перед paginate. Но я думаю, что вы все равно сможете использовать счетный кеш, даже в вашей ситуации, если вы привязали его к таблице соединений HABTM. –
Спасибо ... даст вам попробовать. Это может стоить того, чтобы создать новую таблицу с кешем-счетчиком за то количество усилий, которое я, кажется, даю этому :) ... думал, что использовать эту новую таблицу как «родительскую» таблицу item_owns и мои исходные элементы itemsown, содержащие все «дочерние» элементы таким образом я мог подсчитать все дочерние элементы с одинаковым идентификатором родительского элемента и хранить их в родительской таблице. Подумайте еще об этом и попробуйте другие возможные альтернативы. Еще раз спасибо за ваш вклад! – mk97