laravel中的where子句用于搜索

问题描述

我正在尝试使用laravel查询从表学生中选择行,但是在搜索时会从表中返回所有行。

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

解决方法

这就是问题,至少就我所知,您有两种过滤器:

  • 给定机构中的学生
  • 用户名,姓名,电子邮件或联系人与给定搜索词相似的学生

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

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

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

要首先按机构 AND 进行过滤,以获取具有相似的用户名,姓名,电子邮件或联系方式的记录,则可以将第二个条件包装在结尾处。试试这个:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...