我有两张桌子,司机和汽车。司机表与汽车有很多联系。我创建了一个名为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'
答案 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()
部分查询仍然相同。
有关更多选项,请访问以下文档: