首先看看以下模型结构:
模型构建:
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”。你是怎么做到的?
感谢您的帮助!
答案 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版本总是好的!