1

包含可能を使用していくつかの深い関連付けがあり、結果をフィルタリングする必要があります。この質問のために、車を販売していて、機能によって結果を絞り込みたいとしましょう。

車には多くのメーカーがあり、多くのモデルがあります HABTM 機能

$options = array( 
    'order' => array('Car.price'),
    'contain' => array(
        'make',
        'model' => array(
            'order' => 'Model.name ASC'
        ),
        'features'
    )
);
$cars = $this->Car->find('all', $options);

パワー ウィンドウがないすべての車を除外するにはどうすればよいですか (Features.name != power_windows)。

4

1 に答える 1

3

Containableは、データをフェッチするときに含めたいモデルを指定する場合にのみ適していますが、親モデルがデータをフェッチすることをまったく制限しません。明らかな症状の 1 つは、親データにデータがnull含まれている場合があることです。

joinsそれを達成するには、条件を指定できるようにここで使用する必要があると思います。

$options = array(
    'order' => array('Car.price'),
    'contain' => array(
         'make',
         'model' => array(
             'order' => 'Model.name ASC'
         ),
         'features'
    ),
    'joins' => array(
         array(
             'table' => 'features',
             'alias' => 'Feature',
             'type' => 'LEFT',
             'conditions' => array(
                 'Car.id = Feature.car_id'
             )
         )
     ),
     'conditions' => array(
          'Features.name !=' => 'power_windows',
     )
);

ただし、これの 1 つの欠点は、Car参加したために重複している可能性があることです。それは別の問題です;)

于 2013-09-26T02:31:45.730 に答える