【问题标题】:where clause in laravel for searchlaravel 中的 where 子句用于搜索
【发布时间】:2021-01-19 02:19:14
【问题描述】:

我正在尝试使用 laravel 查询从表 students 中选择行进行搜索,但在搜索时它会返回表中的所有行。

$data = DB::table('students')
    ->select(['name', 'username'])->where('institute', $inst)
    ->where('username', 'LIKE', '%'.$search.'%')
    ->orWhere('name', 'LIKE', '%'.$search.'%')
    ->orWhere('email', 'LIKE', '%'.$search.'%')
    ->orWhere('contact', 'LIKE', '%'.$search.'%')
    ->orderBy('id', 'DESC')
    ->paginate(10);

【问题讨论】:

  • 尝试使用toSql() 来调试你的SQL。语法为DB::table('students')->.....->toSql()
  • $search 的值是多少?如果它是空的,那么所有这些字段都将是“喜欢”该搜索模式 ('%%') ...您可能希望以特定方式对这些“位置”进行分组

标签: php laravel laravel-5 laravel-query-builder


【解决方案1】:

事情就是这样,至少在我看来,你有两种过滤器:

  • 特定学院的学生
  • 用户名、姓名、电子邮件或联系方式与给定搜索词相似的学生

如果是这样,您查询中的问题是orWhere() 子句。让我们简化您的查询以说明问题:

$data = DB::table('students')
    ->where('institute', $inst)
    ->orWhere('name', 'LIKE', '%'.$search.'%')
    ->get();

在上面的代码中,该语句将获取所有institute 等于$inst OR 名称类似于%search% 的学生。因此,结果可能包括不在给定学院的学生。您现在看到问题了吗?

为了首先按机构过滤获取具有相似用户名、姓名、电子邮件或联系人的记录,您可以将第二个条件包装在闭包中。试试这个:

$data = DB::table('students')
    ->select(['name', 'username'])
    ->where('institute', $inst)
    ->where(function ($query) use ($search) {  // <<<
        $query->where('username', 'LIKE', '%'.$search.'%')
            ->orWhere('name', 'LIKE', '%'.$search.'%')
            ->orWhere('email', 'LIKE', '%'.$search.'%')
            ->orWhere('contact', 'LIKE', '%'.$search.'%');
    })
    ->orderBy('id', 'DESC')
    ->paginate(10);

【讨论】:

  • 搜索时返回错误:未定义变量:搜索
  • 抱歉,我忘了传递$search 闭包。我已经更新了代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 2010-09-23
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多