【问题标题】:CakePHP how to set conditions on contain tableCakePHP如何在包含表上设置条件
【发布时间】:2017-06-05 20:34:20
【问题描述】:

我有 2 张桌子,Drivers 和 Cars。 Drivers 表与汽车有很多关联。我创建了一个名为 SearchController 的控制器。在搜索控制器中,我使用 $this->loadModel('Drivers'); 加载驱动程序模型;

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

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

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

我们将非常感谢您的帮助。

---编辑----

我想要实现的语句是:

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

【问题讨论】:

    标签: php cakephp cakephp-3.0


    【解决方案1】:

    你应该这样写你的包含:

    '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

    【讨论】:

    • 感谢您的回复。此语句返回所有驱动程序,包括使用手动汽车的驱动程序,但手动驱动程序的汽车对象为空。是否可以像我直接在 sql 上那样做。即 SELECT * FROM drivers, cars WHERE drivers.id = cars.driver_id 和 cars.transmission = 'Automatic' 只返回自动驾驶汽车的司机。
    【解决方案2】:

    可以使用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']);
    

    另请参阅

    【讨论】:

    • 感谢您的回复。此语句返回所有驱动程序,包括使用手动汽车的驱动程序,但手动驱动程序的汽车对象为空。是否可以像我直接在 sql 上那样做。即 SELECT * FROM drivers, cars WHERE drivers.id = cars.driver_id 和 cars.transmission = 'Automatic'
    • 这是正确的方法,我不知道为什么它不起作用。
    猜你喜欢
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多