model基类封装自定义方法whereFilter
model基类中封装whereFilter方法
/**
* whereFilter
* @param $query
* @param array $column
*/
public function scopeWhereFilter($query, array $column, string $boolean = 'and')
{
if ($boolean !== 'and' && $boolean !== 'or' && !is_numeric(key($column))) {
throw new \InvalidArgumentException('query params error', 55555);
}
$firstValue = current($column);
if ($firstValue !== 'and' && $firstValue !== 'or') {
if (count($column) !== 3) {
throw new \InvalidArgumentException('query params error', 55556);
}
[$field, $operator, $value] = $column;
if (!is_string($field) || empty($value)) {
return $query;
}
if ($operator === 'in') {
return $query->whereIn($field, $value, $boolean);
}
if ($operator === 'like') {
$query->where($field, $operator, '%' . $value . '%', $boolean);
} else {
$query->where($field, $operator, $value, $boolean);
}
}
unset($column[0]);
return $query->where(function ($query) use ($firstValue, $column) {
foreach ($column as $item) {
if (is_array($item)) {
$this->scopeWhereFilter($query, $item, $firstValue);
}
}
}, null, null, $boolean);
}
在业务中调用示例
$query = DealerModel::query()
->whereFilter([
'and',
['dealer_id', '=', 1],
['dealer_name', 'like', "aaaaa"],
[
'or',
['dealer_name', 'like', 'aaaqa'],
['dealer_id', 'in', [1, 3]],
['dealer_id', 'in', []],
['dealer_name', '=', ''],
]
]);
此方法是为了过滤查询中为空的值的条件,把所有条件按照逻辑全部书写在条件中,方便阅读代码理解逻辑同时方便维护,这个只是简单封装,比较简陋,给大家提供一下思路,有问题大家可以一块交流一下
本作品采用《CC 协议》,转载必须注明作者和本文链接