首页 > 解决方案 > 为什么'where'返回laravel中的所有数据

问题描述

我在我的项目中应用搜索过滤器,所以首先我从多个表中获取数据并存储在两个不同的变量中,然后将这两个变量合并为一个,这样我就可以从该合并变量中过滤数据。所以我的代码是这样的

$data1=Model::query()
   ->Join('...')
   ->leftJoin('...')
   ->where('id',login_user)
   ->select(...)
   ->whereRaw('id IN (select MAX(id) FROM table GROUP BY name)')
   ->groupBy('name')
   ->get();

$data2=Model2::query()
    ->leftJoin(...)
    ->select(...)   
    ->where('id',login_user)
    ->whereNotIn(..)
    ->get(); 

data1 和 data2 都返回具有不同值的同一列,所以我像这样合并两个变量

$results = $data1->concat($data2);

不,当我已经获取数据时,现在我需要从中添加过滤器数据,$results因此我为此制定post了方法。所以当用户请求过滤带有名称的数据时,我会写这样的查询

if ($request->name!="") {
  $results->when(request('name'), function($q){
    $q->Where('name', request('name'));
  });
}
$records = $results;
return response()->json(['success'=>true,'message'=>'success', 'data' => $records]);

但是该查询并没有过滤数据并返回所有数据。我是 laravel 的新手,所以我不知道我做错了什么,任何帮助都会对我有所帮助,谢谢。

标签: mysqllaravel

解决方案


if (request()->has('name')) {
  $results->when(request()->get('name'), function($q){
    return $q->where('name', request()->get('name'));
  });
}
$records = $results;
return response()->json(['success'=>true,'message'=>'success', 'data' => $records]);

当您使用“when()”时,您可以将 if 表达式全部删除:

$results->when(request()->has('name'), function($q){
    return $q->where('name', request()->get('name'));
});
$records = $results;
return response()->json(['success'=>true,'message'=>'success', 'data' => $records]);

request()是一个 Laravel 助手Request $request

编辑:where()ORM 中的子句带有一个小“w”,而不是“W”,如orWhere


推荐阅读