CakePHP与HABTM模型分页

时间:2009-09-23 00:16:17

标签: php cakephp pagination

我在使用HABTM关系创建分页时遇到了一些问题。首先,表格和关系:

requests (id, to_location_id, from_location_id)
locations (id, name)
items_locations (id, item_id, location_id)
items (id, name)

因此,一个请求有一个位置,请求来自来自,一个位置请求。对于这个问题,我只关心“到”的位置。

Request --belongsTo--> Location* --hasAndBelongsToMany--> Item

(* as "ToLocation")

在我的RequestController中,我想分页请求的ToLocation中的所有项目。

// RequestsController
var $paginate = array(
    'Item' => array(
        'limit' => 5,
        'contain' => array(
            "Location"
        )
    )
);

// RequestController::add()
$locationId = 21;
$items = $this->paginate('Item', array(
    "Location.id" => $locationId
));

这是失败的,因为它正在生成这个SQL:

SELECT COUNT(*) AS count FROM items Item   WHERE Location.id = 21

我无法弄清楚如何让它实际使用$paginate的“包含”参数......

有什么想法吗?

3 个答案:

答案 0 :(得分:11)

经过3天的搜索,我找到了方法

var $paginate = array('Post'=>array('group'=>'Post.id'));

建议添加群组,因为有时我们会在不同的类别中获得重复的帖子

$this->Post->bindModel(array('hasOne'=>array('CategoriesPost')), false);
$out = $this->paginate('Post', array('CategoriesPost.category_id'=>array(1,4,7,6)));

添加 false 以将绑定模型用于所有查询,而不仅仅是以下

答案 1 :(得分:3)

要对HABTM进行分页,您需要将'hasOne'连接模型暂时绑定到您要分页的模型:

// prepare to paginate Item
$this->Item->bindModel(array('hasOne'=>array('ItemsLocation')));
$contain['ItemsLocation']=array();
$conditions[]=array('ItemsLocation.location_id'=>$locationId);
$order = array('Item.created' => 'desc'); // set order
...
$items = $this->paginate('Item', compact('conditions','contain','order'));

答案 2 :(得分:1)

我已经能够让它在某种程度上发挥作用,但解决方案根本不会让人觉得很糟糕。

$items = $this->paginate(
    $this->Request->ToLocation->Item,
    array(
        "Item.id IN ("
        . "SELECT item_id FROM items_locations "
        . "WHERE location_id = " . $locationId
        . ")"
    )
);