このような関連付けを扱う場合hasMany
、CakePHP の auto-magic は 2 つのクエリを必要とします。1 つはBuilding
テーブル上、もう 1 つは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
を参照する必要がないことに注意してください。つまり、使用する必要はありません (とにかく動作しません)。BuildingRange
Building
Builduing.BuildingRange
ps、使用している CakePHP のバージョンについて言及することは常に良いことです!