我在 laravel 的方法中实现多重搜索时遇到问题,我有如下代码
$search_fields = ['name', 'symbol'];
$searchValues = preg_split('/\s+/', $request->q, -1, PREG_SPLIT_NO_EMPTY);
$query = function ($q) use ($searchValues, $search_fields) {
foreach ($searchValues as $value) {
foreach ($search_fields as $field){
$q->where($field, 'like', "%{$value}%")
->orWhere($field, 'like', "%{$value}%");}
;}};
return $products = Product::where($query)->orderBy('name', 'asc')->take(100)->get();
但它不起作用,因为生成这样的sql:
select
*
from
`products`
where
(
`name` like "%261%"
or `name` like "%261%"
and `symbol` like "%261%"
or `symbol` like "%261%"
)
order by
`name` asc
limit
100
我需要像下面这样,但我不知道如何在 Laravel 中做到这一点:(
select
*
from
`products`
where
(
`name` like "%hp%"
or `symbol` like "%hp%")
and (`name` like "%261%"
or `symbol` like "%261%"
)
order by
`name` asc
limit
100
最佳答案
您需要将括号之间的 where 分组到闭包中。所以你的 $query
函数应该像这样更新:
$query = function ($q) use ($searchValues, $search_fields) {
foreach ($searchValues as $value) {
foreach ($search_fields as $field) {
$q->where(function ($query) use ($field, $value) {
$query
->orWhere($field, 'like', "%{$value}%")
->orWhere($field, 'like', "%{$value}%");
});
}
}
};
这让查询生成器知道要将哪些哪里
放在一起。
关于mysql - Laravel 和 MySql 中的多重搜索问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54311662/