【问题标题】:Query builder didn't find data when using %使用 % 时查询生成器未找到数据
【发布时间】:2022-01-10 13:54:58
【问题描述】:

我正在尝试使用 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%';,它工作得非常好

我应该怎么做的任何建议?谢谢

【问题讨论】:

    标签: laravel laravel-query-builder


    【解决方案1】:

    这看起来很奇怪。为什么要过滤集合而不是在查询中添加 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'));
    }
    

    【讨论】:

    • 这也解决了我的问题,@John Lobo 的回答和你的工作都很好,谢谢
    【解决方案2】:

    all() 是静态方法而不是查询构建器。如果您看到 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'));
    }
    

    【讨论】:

    • 工作正常,感谢您的帮助和知识
    【解决方案3】:

    您正在尝试在集合中应用您的查询字符串。在集合中,您可以使用 filter($callback_function) 方法来选择集合中的元素。为要返回的每个元素传递一个返回 true 的回调函数。

    在您的情况下,您可以使用 stristr() 函数来模拟 LIKE 运算符,如下所示:

    collect($data)->filter(function ($item) use ($searchName) {
        return false !== stristr($item->fileName, $searchName);
    });
    

    【讨论】:

      猜你喜欢
      • 2014-02-21
      • 2016-11-03
      • 2020-11-06
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多