1

我有一些使用可包含的深层关联,需要过滤结果。对于这个问题,假设我们正在销售汽车并希望按功能缩小结果范围。

Car hasmany make hasmany model 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只适合你指定在获取数据时要包含哪些模型,而不是完全限制父模型获取数据。一个明显的症状是有时您的父数据可能包含一些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',
     )
);

但是这样做的一个缺点是您可能Car由于加入而重复了。那是一个单独的问题;)

于 2013-09-26T02:31:45.730 回答