HABTM与分页

时间:2013-01-13 15:36:51

标签: php cakephp pagination find has-and-belongs-to-many

首先看看以下模型结构:

模型构建

id
name

Model BuildingRange

id
building_id
postalcode

好的,所以 BuildingRange $ belongsTo 构建构建 $ hasMany BuildingRange 。应该清楚直到'这里。

现在让

$current_postalcode="12345";

我知道想在 BuildingController 中执行类似的操作:

$this->paginate('Building',array('Building.BuildingRange.postalcode'=>$current_postalcode));

在文本中:我想选择所有建筑物,因为存在$ current_postalcode的条目“BuildingRange”。你是怎么做到的?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

在处理这样的hasMany关联时,CakePHPs auto-magic需要两个查询,一个在Building表上,另一个在BuildingRange表上。通过pagiante方法传递条件时,这些条件将传递给第一个查询,因此它将失败,因为关联的模型表未连接。

这个问题可以通过几种不同的方式解决,一种是使用ad-hoc连接,例如:

$this->paginate = array
(
    'joins' => array
    (
        array
        (
            'table' => 'building_ranges',
            'alias' => 'BuildingRange',
            'type' => 'LEFT',
            'conditions' => array('BuildingRange.building_id = Building.id')
        )
    )
);
$this->paginate('Building', array('BuildingRange.postalcode' => $current_postalcode));

这将导致查询看起来像这样:

SELECT `Building`.`id`,
       `Building`.`name`
FROM   `buildings` AS `Building`
       LEFT JOIN `building_ranges` AS `BuildingRange`
              ON ( `BuildingRange`.`building_id` = `Building`.`id` )
WHERE  `BuildingRange`.`postalcode` = '12345'
LIMIT  20 

请注意,在传递给paginate方法的条件中,无需通过BuildingRange模型引用Building模型,即无需使用Builduing.BuildingRange(这无论如何都不会起作用。)

ps,提到你正在使用的CakePHP版本总是好的!