0

首先看一下下面的模型结构:

模型构建

id
name

建模范围

id
building_id
postalcode

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

现在让

$current_postalcode="12345";

我知道想在BuildingController中做这样的事情:

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

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

我感谢您的帮助!

4

1 回答 1

1

在处理这样的hasMany关联时,CakePHPs 自动魔术需要两个查询,一个在Building表上,一个在BuildingRange表上。通过该pagiante方法传递条件时,这些条件将传递给第一个查询,因此由于关联的模型表未连接,因此它将失败。

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

$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引用模型,即无需使用(无论如何都行不通)。BuildingRangeBuildingBuilduing.BuildingRange

ps,提一下你使用的 CakePHP 版本总是好的!

于 2013-01-13T19:35:43.703 回答