使用 % 时查询生成器未找到数据

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);
});