CakePHP 3.6 查询生成器复杂的 OR 条件问题
CakePHP 3.6 Query Builder complex OR conditions issue
我正在尝试使用具有复杂嵌套 AND 和 OR 条件的查询构建器来构建查询。这是我到目前为止所写的内容。
$cond_arr = array();
$cond_arr['VehicleBrandModels.status'] = 1;
$query = $this->VehicleBrandModels->find();
$query->hydrate(false);
$query->select($this->VehicleBrandModels);
$query->where($cond_arr);
$VBM_data = $query->toArray();
这将生成如下查询
SELECT * FROM vehicle_brand_models WHERE status = 1;
我想生成一个包含嵌套的 AND & OR 条件的查询,如下所示
SELECT * FROM vehicle_brand_models WHERE status = 1 AND ((overall_rating > 0 AND overall_rating < 2) OR (overall_rating >= 2 AND overall_rating < 4) OR (overall_rating >= 4 AND overall_rating <= 5));
任何人都可以帮助解决如何在 CAKEPHP 3.0 查询生成器中实现这一点吗?
最简单的解决方案如下
$cond_arr = [
'VehicleBrandModels.status' => 1,
'OR' => [
['overall_rating >' => 0, 'overall_rating <' => 2],
['overall_rating >=' => 2, 'overall_rating <' => 4],
['overall_rating >=' => 4, 'overall_rating <=' => 5]
]
];
还有更多 'cake' 方法,如果我有时间,我会 post 它。
但请注意,根据我的观察,您的所有 OR 条件都有重叠,您可以简单地执行
$cond_arr = [
'VehicleBrandModels.status' => 1,
'overall_rating >' => 0,
'overall_rating <=' => 5
];
编辑:如前所述,这是使用查询表达式的更简便的方法
$query->where(function($exp, $q) {
$exp = $exp->eq('VehicleBrandModels.status', 1);
$conditions1 = $exp->and_([])
->gt('overall_rating ', 0)
->lte('overall_rating ', 2);
$conditions2 = $exp->and_([])
->gt('overall_rating ', 2)
->lte('overall_rating ', 4);
$conditions3 = $exp->and_([])
->gt('overall_rating ', 4)
->lte('overall_rating ', 5);
$orConditions = $exp->or_([$conditions1, $conditions2, $conditions3]);
$exp->add($orConditions);
return $exp;
});
仍有一些条件重叠
我正在尝试使用具有复杂嵌套 AND 和 OR 条件的查询构建器来构建查询。这是我到目前为止所写的内容。
$cond_arr = array();
$cond_arr['VehicleBrandModels.status'] = 1;
$query = $this->VehicleBrandModels->find();
$query->hydrate(false);
$query->select($this->VehicleBrandModels);
$query->where($cond_arr);
$VBM_data = $query->toArray();
这将生成如下查询
SELECT * FROM vehicle_brand_models WHERE status = 1;
我想生成一个包含嵌套的 AND & OR 条件的查询,如下所示
SELECT * FROM vehicle_brand_models WHERE status = 1 AND ((overall_rating > 0 AND overall_rating < 2) OR (overall_rating >= 2 AND overall_rating < 4) OR (overall_rating >= 4 AND overall_rating <= 5));
任何人都可以帮助解决如何在 CAKEPHP 3.0 查询生成器中实现这一点吗?
最简单的解决方案如下
$cond_arr = [
'VehicleBrandModels.status' => 1,
'OR' => [
['overall_rating >' => 0, 'overall_rating <' => 2],
['overall_rating >=' => 2, 'overall_rating <' => 4],
['overall_rating >=' => 4, 'overall_rating <=' => 5]
]
];
还有更多 'cake' 方法,如果我有时间,我会 post 它。
但请注意,根据我的观察,您的所有 OR 条件都有重叠,您可以简单地执行
$cond_arr = [
'VehicleBrandModels.status' => 1,
'overall_rating >' => 0,
'overall_rating <=' => 5
];
编辑:如前所述,这是使用查询表达式的更简便的方法
$query->where(function($exp, $q) {
$exp = $exp->eq('VehicleBrandModels.status', 1);
$conditions1 = $exp->and_([])
->gt('overall_rating ', 0)
->lte('overall_rating ', 2);
$conditions2 = $exp->and_([])
->gt('overall_rating ', 2)
->lte('overall_rating ', 4);
$conditions3 = $exp->and_([])
->gt('overall_rating ', 4)
->lte('overall_rating ', 5);
$orConditions = $exp->or_([$conditions1, $conditions2, $conditions3]);
$exp->add($orConditions);
return $exp;
});
仍有一些条件重叠