必要な結果を返すSQLステートメントがありますが、これらの結果をページ分割する必要があり、クエリを$this->paginateに変換しようとして過去数日間問題が発生しています。
私は多対多の関係にある2つのテーブルで作業しています。itemsとitem_owns。item_ownsテーブルにはid、item_id、user_idの3つの列が含まれ、itemsテーブルにはid、collection_id、nameが含まれます。
必要な結果を返す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';
以下のスニペットは私に近づきますが、paginate関数の外でuser_id(item_idでグループ化)によるitem_ownsのカウントを実行する必要があります。つまり、カウントに基づいて並べ替えることはできません...
$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')),
)
)
);
'joins' => array()も使用してみましたが、fields配列で「count」呼び出しを指定する方法がわかりません。
$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'
)
)
);
カスタムページネーション関数を使用する必要があるかもしれませんが、JOINと条件の一部がその中でどこに行くのかわかりません...
どんなアイデアでも大歓迎です!ありがとうMK