2013-02-12 2 views
0

У меня есть оператор 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

ответ

0

Вы используете хороший, но вы также должны использовать Cake's counter cache для подсчета очков.

+0

Спасибо за ответ. Я рассмотрел использование кеша-счетчика, но это означало бы создание новой таблицы в моей БД, поскольку в item_owns могут быть дубликаты item_ids с уникальным собственным item_owns.id. Это связано с тем, что один и тот же элемент может принадлежать пользователю несколько раз, но это разные экземпляры/копии этого элемента. – mk97

+0

Хм, вы могли бы попытаться создать еще одну временную взаимосвязь между таблицами, которые вам нужно использовать, подсчитывая, что будет просто использоваться для этого. Подобно использованию функции bindModel() перед paginate. Но я думаю, что вы все равно сможете использовать счетный кеш, даже в вашей ситуации, если вы привязали его к таблице соединений HABTM. –

+0

Спасибо ... даст вам попробовать. Это может стоить того, чтобы создать новую таблицу с кешем-счетчиком за то количество усилий, которое я, кажется, даю этому :) ... думал, что использовать эту новую таблицу как «родительскую» таблицу item_owns и мои исходные элементы itemsown, содержащие все «дочерние» элементы таким образом я мог подсчитать все дочерние элементы с одинаковым идентификатором родительского элемента и хранить их в родительской таблице. Подумайте еще об этом и попробуйте другие возможные альтернативы. Еще раз спасибо за ваш вклад! – mk97

 Смежные вопросы

  • Нет связанных вопросов^_^