【问题标题】:Eloquent WHERE LIKE clause with more than two columns具有多于两列的雄辩 WHERE LIKE 子句
【发布时间】:2017-08-20 06:11:13
【问题描述】:

我一直在尝试在 Laravel 中进行查询,在原始 SQL 中会是这样的

"SELECT * FROM students WHERE (((students.user_id)=$id) AND (((students.name) Like '%$q%') OR ((students.last_name) Like '%$q%') OR ((students.email) Like '%$q%')))")

我关注了这个帖子 (Eloquent WHERE LIKE clause with multiple columns),它运行良好,但只有两列 Ej:

$students = student::where(user_id, Auth::id())
         ->whereRaw('concat(name," ",last_name) like ?', "%{$q}%")
         ->paginate(9);

但如果我添加多于两列,则结果变量始终为空,无论变量 $q 中的内容是否与一列或多列匹配:

$students = student::where(user_id, Auth::id())
         ->whereRaw('concat(name," ",last_name," ",email) like ?', "%{$q}%")
         ->paginate(9)

我很确定我错过了一些东西,但我找不到它是什么。提前致谢。

【问题讨论】:

  • 如果任何字段为空,Concat 将返回空。这不是问题吗?考虑到它与 2 一起使用,第三个字段是可疑字段...
  • 好的,这就是问题所在,但我该如何解决,因为我允许人们存储电子邮件但不是强制性的,但这意味着通过简单的搜索过滤表格,所以我想要它过滤考虑到所有列,也就是说,如果其中之一为 null,则不要将所有其他列转换为 null
  • 使用concat_ws 而不是concat 可以帮助正确处理NULL。但 mbozwood 的回答对我来说似乎更雄辩友好。

标签: php laravel


【解决方案1】:

你可以这样做:

$students = student::where('user_id', Auth::id())->where(function($query) use ($q) {
    $query->where('name', 'LIKE', '%'.$q.'%')
        ->orWhere('last_name', 'LIKE', '%'.$q.'%')
        ->orWhere('email', 'LIKE', '%'.$q.'%');
})->paginate(9);

上面的Eloquent会输出类似的SQL

"SELECT * FROM students WHERE students.user_id = $id AND (students.name like '%$q%' OR students.last_name Like '%$q%' OR students.email Like '%$q%')"

【讨论】:

    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 2019-01-08
    • 2021-09-29
    • 2014-09-20
    • 2020-09-29
    • 2019-01-28
    • 2014-11-05
    • 2018-05-19
    相关资源
    最近更新 更多