mysql - 为什么'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 的新手,所以我不知道我做错了什么,任何帮助都会对我有所帮助,谢谢。
解决方案
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
推荐阅读
- android - 将 java 本机包导入 react-native 项目
- java - CompletableFuture:等待完成百分比
- sql - 在 SQL Developer 中减去投射日期 (EPOCH) 时如何删除小数
- azure-devops - Azure DevOps 为多个 YMLS 构建最佳实践
- laravel - 使用 vue js 时 Laravel 路由不起作用
- laravel - 无法使用 Laravel 和 Xampp 进行迁移
- java - Reactor SubscriberContext 不适用于 ServerRequest 正文
- python - TypeError:在Python中使用不和谐机器人发送数据时没有字符串参数的编码
- android - NextCloud Android 应用程序:NC 密码,无法通过“授予”
- java - JAVA 将日期字符串转换为日期对象