使用 % 时查询生成器未找到数据
Query builder didn't find data when using %
我正在尝试使用 laravel 在控制器中使用查询生成器,但我不明白,但查询没有找到数据。
代码如下:
public function index()
{
$data = downloads::all();
if(request('searchName')){
$data = $data->where('fileName','like','%'.request('searchName').'%'); //Here's the problem
return view('download', compact('data'));
}
else{
return view('download', compact('data'));
}
}
我已经尝试过 dd(request('searchName'))
并且它显示了我提供的输入,所以这里没有问题
当我使用 $data->where('fileName','like','%'.request('searchName').'%')
时没有显示数据
我不认为我拼错了文件名,因为当我使用 $data->where('fileName','like',request('searchName'))
并且它工作并显示文件时,但文件名必须与输入的搜索名完全相同,当然我要的不是这个
即使我使用 dd('%'.request('searchName').'%');
它也会显示 "%*searchName*%"
这就是为什么当我使用 $data->where('fileName','like','%'.request('searchName').'%');
它不起作用时我很困惑
我什至在 SQL Workbench 中使用了 SELECT * FROM *tables* WHERE fileName LIKE '%p%';
,而且效果很好
有什么建议吗?谢谢
这看起来很奇怪。为什么要过滤集合而不是在查询中添加 where
条件?
假设您有数千条 download
条记录,但 where 条件仅与少数几条匹配,您将获取所有内容只是为了显示其中的一些。
IMO,更好的方法应该是
public function index(Request $request)
{
$data = downloads::
when($request->has('searchName'), function($query) use ($request){
$query->where('fileName','like','%'.$request->searchName.'%');
})
->get();
return view('download', compact('data'));
}
all()
是静态方法而不是查询 builder.If 你看到 all()
代码的内部然后它调用 get 方法
/**
* Get all of the models from the database.
*
* @param array|mixed $columns
* @return \Illuminate\Database\Eloquent\Collection|static[]
*/
public static function all($columns = ['*'])
{
return static::query()->get(
is_array($columns) ? $columns : func_get_args()
);
}
解决这个问题的方法很少。
public function index()
{
$downloads = downloads::query();
if(!empty(request('searchName'))){
$downloads->where('fileName','like','%'.request('searchName').'%');
}
$data=$downloads->get();
return view('download', compact('data'));
}
或
public function index()
{
$data = downloads::when(!empty(request('searchName')),function($query){
$query->where('fileName','like','%'.request('searchName').'%');
})->get();
return view('download', compact('data'));
}
您正在尝试在集合中应用您的查询字符串。在集合中,您可以使用 filter($callback_function) 方法来 select 集合中的元素。为要返回的每个元素传递 returns true 的回调函数。
对于您的情况,您可以使用 stristr() 函数来模拟 LIKE 运算符,如下所示:
collect($data)->filter(function ($item) use ($searchName) {
return false !== stristr($item->fileName, $searchName);
});
我正在尝试使用 laravel 在控制器中使用查询生成器,但我不明白,但查询没有找到数据。
代码如下:
public function index()
{
$data = downloads::all();
if(request('searchName')){
$data = $data->where('fileName','like','%'.request('searchName').'%'); //Here's the problem
return view('download', compact('data'));
}
else{
return view('download', compact('data'));
}
}
我已经尝试过 dd(request('searchName'))
并且它显示了我提供的输入,所以这里没有问题
当我使用 $data->where('fileName','like','%'.request('searchName').'%')
时没有显示数据
我不认为我拼错了文件名,因为当我使用 $data->where('fileName','like',request('searchName'))
并且它工作并显示文件时,但文件名必须与输入的搜索名完全相同,当然我要的不是这个
即使我使用 dd('%'.request('searchName').'%');
它也会显示 "%*searchName*%"
这就是为什么当我使用 $data->where('fileName','like','%'.request('searchName').'%');
我什至在 SQL Workbench 中使用了 SELECT * FROM *tables* WHERE fileName LIKE '%p%';
,而且效果很好
有什么建议吗?谢谢
这看起来很奇怪。为什么要过滤集合而不是在查询中添加 where
条件?
假设您有数千条 download
条记录,但 where 条件仅与少数几条匹配,您将获取所有内容只是为了显示其中的一些。
IMO,更好的方法应该是
public function index(Request $request)
{
$data = downloads::
when($request->has('searchName'), function($query) use ($request){
$query->where('fileName','like','%'.$request->searchName.'%');
})
->get();
return view('download', compact('data'));
}
all()
是静态方法而不是查询 builder.If 你看到 all()
代码的内部然后它调用 get 方法
/**
* Get all of the models from the database.
*
* @param array|mixed $columns
* @return \Illuminate\Database\Eloquent\Collection|static[]
*/
public static function all($columns = ['*'])
{
return static::query()->get(
is_array($columns) ? $columns : func_get_args()
);
}
解决这个问题的方法很少。
public function index()
{
$downloads = downloads::query();
if(!empty(request('searchName'))){
$downloads->where('fileName','like','%'.request('searchName').'%');
}
$data=$downloads->get();
return view('download', compact('data'));
}
或
public function index()
{
$data = downloads::when(!empty(request('searchName')),function($query){
$query->where('fileName','like','%'.request('searchName').'%');
})->get();
return view('download', compact('data'));
}
您正在尝试在集合中应用您的查询字符串。在集合中,您可以使用 filter($callback_function) 方法来 select 集合中的元素。为要返回的每个元素传递 returns true 的回调函数。
对于您的情况,您可以使用 stristr() 函数来模拟 LIKE 运算符,如下所示:
collect($data)->filter(function ($item) use ($searchName) {
return false !== stristr($item->fileName, $searchName);
});