【发布时间】:2018-07-01 09:41:14
【问题描述】:
假设我有一个包含字段的表格:
name, email, designation, city
我想要的是用户可以通过在单个搜索框中输入单个词或多个词来搜索记录。例如。 ABC abc@gmail.com
现在我正在使用这样的东西:
$keywords = $request->get('search');
$searchValues = preg_split('/\s+/', $keywords, -1, PREG_SPLIT_NO_EMPTY);
$users = DB::table('users')
->select('name', 'email', 'designation', 'city')
->where(function ($query) use($searchValues){
foreach ($searchValues as $value)
{
$query->orWhere('name', 'like', "%{$value}%")
->orWhere('email', 'like', "%{$value}%")
->orWhere('designation', 'like', "%{$value}%")
->orWhere('city', 'like', "%{$value}%");
}
})->latest('users.created_at')->paginate($perPage);
这可行,但有一个问题,它返回所有用户 name 'ABC',而不是只返回 name='ABC' 行> 和 email='abc@gmail.com'
我怎样才能做到这一点?
【问题讨论】:
-
我对php不熟悉,但我觉得问题出在你使用orWhere?考虑一个条件表达式(name == 'abc' 或 email == 'bc@gmail.com'),当 name == 'abc' 为
True,则不会检查 email == 'bc@gmail.com ' 是True或False,所以结果是 name='ABC' 的所有行。把or改成and,你就会得到你想要的。 -
我不知道 laravel 但似乎你应该使用
andWhere代替name和email而不是orWhere并隔离(带入括号)它们 -
如果我删除 Or 然后它将检查每个关键字的所有列,并且由于 name='ABC' 不会出现在电子邮件或城市列中,它最终不会为我输入的任何关键字返回任何内容
-
你不应该使用'ABC'来检查电子邮件,你必须找到哪个字符串是名称哪个字符串是电子邮件。
-
这才是真正的问题。我只需要一个搜索框来允许搜索表的任何列,否则使用 WHERE AND 的解决方案非常简单