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、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を参照する必要がないことに注意してください。つまり、使用する必要はありません (とにかく動作しません)。BuildingRangeBuildingBuilduing.BuildingRange

ps、使用している CakePHP のバージョンについて言及することは常に良いことです!

于 2013-01-13T19:35:43.703 に答える