CakePHP如何设置包含表的条件

时间:2017-06-01 16:34:19

标签: php cakephp cakephp-3.0

我有两张桌子,司机和汽车。司机表与汽车有很多联系。我创建了一个名为SearchController的控制器。在搜索控制器中,我使用$ this-> loadModel('Drivers');

加载Driver模型

当我进入搜索时,我希望它只返回自动驾驶汽车和驾驶员详细信息,但它会返回所有值,包括非自动驾驶的汽车。

$drivers = $this->paginate($this->Drivers, [
        'contain' => ['Cars']], [
        'conditions' => ['Cars.transmission' => 'Automatic'] ] );  

 $this->set(compact('drivers')); 
 $this->set('_serialize', ['drivers']);

非常感谢您的帮助。

--- ---- EDIT

我想要达到的声明是:

SELECT * FROM drivers, cars 
         WHERE drivers.id = cars.driver_id 
         AND cars.transmission = 'Automatic'

2 个答案:

答案 0 :(得分:3)

可以使用contain参数

将其他关联加载到分页表中
$this->paginate['contain'] = [
    'Cars' => function (\Cake\ORM\Query $query) {
        return $query->where(['Cars.transmission' => 'Automatic']);
    }
];

$drivers = $this->paginate($this->Drivers);  

$this->set(compact('drivers')); 
$this->set('_serialize', ['drivers']);

另见

答案 1 :(得分:2)

你应该像这样编写你的包含:

'contain' => [
    'Cars' => function($query){
        return $query->where(['transmission' => 'Automatic']);
    }
]

有关更多选项,请参阅CakePHP食谱:Passing Conditions to Contain

修改

要仅选择具有“自动”传输的汽车的驱动程序,并为每个驱动程序选择这些汽车的列表,您需要将这两个表连接在一起。结果代码应如下所示:

$query = $this->Drivers->find()
            ->matching("Cars", function($q){
                return $q->where(["Cars.transmission" => "Automatic"]);
            })
            ->contain([
                "Cars" => function ($q) {
                    return $q->where(["transmission" => "Automatic"]);
                }
            ]);

$result = $this->paginate($query);
这里使用的

matching()将连接表驱动程序和汽车,并相应地设置条件。 contain()部分查询仍然相同。

有关更多选项,请访问以下文档:

Pagination

Retrieving Data & Results Sets