这是我的控制器代码:
if ($request->exists('tipo')) {
$valor = $request->value;
$candidates = Candidate::buscarpor($tipo, $valor)
->orderBy('id', 'desc')
->Paginate(5)
->withQueryString();
dd($candidates);
}
这就是我的“候选”模型中的范围"buscarpor“:
public function scopeBuscarpor($query, $tipo, $valor)
{
if(($tipo) && ($valor)) {
if($tipo == 'names') {
// return $query->orWhereRaw("concat(name, ' ', last_name) like '%".$valor."%' ");
return $query->where(DB::raw("CONCAT('name', ' ', 'last_name')"), 'like', '%'.$valor.'%')
->orWhere(DB::raw("CONCAT('last_name', ' ', 'name')"), 'like', '%'.$valor.'%');
}
return $query->where($tipo, 'like', "%$valor%");
}
}
当搜索是“名称”类型时,我应该在DB中查询,使用候选人的名字或姓氏搜索候选人/人,我只有一个输入类型的文本,我只写了他所有的名字就是这个输入类型的文本。
这个范围内的变量$valor有数据,没有问题。我测试了添加数据库中存在的名称,但它返回0项。
这是我的dd($candidates)
输出。
我不知道我做错了什么,请各位,如果你们对如何解决这个问题有一些想法,我会很感激的。非常感谢。
发布于 2021-07-03 21:53:09
可能where表达式的格式不正确。试着像这样写
$query->where(DB::raw("CONCAT('name', ' ', 'last_name') like '%?%'", [$valor]))
->orWhere(DB::raw("CONCAT('last_name', ' ', 'name') like '%?%'", [$valor]));
您也可以使用whereRaw()
语法代替。
$query->whereRaw("CONCAT('name', ' ', 'last_name') like '%?%'", [$valor])
->orWhereRaw("CONCAT('last_name', ' ', 'name') like '%?%'", [$valor]);
或者名字是用大写字母写在数据库里的?如果使用postgreSQL,则可以使用ilike
而不是like
进行不区分大小写的搜索。
如果使用MySQL,则可能必须在原始方法中使用lower()
。
$query->whereRaw("LOWER(CONCAT('name', ' ', 'last_name')) like '%?%'", [$valor])
->orWhereRaw("LOWER(CONCAT('last_name', ' ', 'name')) like '%?%'", [$valor]);
https://stackoverflow.com/questions/68241080
复制