0

我有一个返回我想要的结果的 SQL 语句,但是我需要对这些结果进行分页,并且在过去几天试图将查询转换为 $this->paginate 时遇到了麻烦

我正在使用两个具有 habtm 关系的表;项目和 item_owns。item_owns 表包含 3 列:id、item_id 和 user_id,而 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';

下面的代码片段让我很接近,但是我最终不得不在分页函数之外按 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(),但不确定如何在字段数组中指定“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

4

1 回答 1

0

您使用的 contains 很好,但您还应该使用 Cake 的计数器缓存进行计数。

于 2013-02-12T09:40:12.690 回答