2009-09-23 72 views
3

我在使用HABTM关系创建分页时遇到了一些问题。首先,表和关系:CakePHP分页与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中,我想分页处理Request的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的“遏制”的说法...

任何想法?

回答

1

我已经能够在某种程度上工作,但该解决方案根本不觉得非常cakey。

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

这是唯一为我工作,具有HABTM表中的非约定字段名的方式。 – 2017-03-17 13:10:16

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')); 
+0

这实际上不起作用。 'paginate()'* only *的第二个参数需要条件。额外的东西需要添加到'$ this-> paginate'数组中。 – nickf 2009-09-29 06:37:39

+1

哦,人..你不能阅读关于分页的文档?这里正确编辑我的项目为您的情况: $ this-> paginate ['Item'] = compact('contains','conditions','order'); $ items = $ this-> paginate('Item'); – Sergei 2009-09-30 05:30:58

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))); 

添加使用绑定模式,所有的查询,不但以下

+0

是否有限制分页结果的技巧?我似乎无法得到这个工作 – 2012-06-25 10:12:50