【问题标题】:Laravel Eloquent query with optional parameters带有可选参数的 Laravel Eloquent 查询
【发布时间】:2022-04-17 16:03:58
【问题描述】:

我正在尝试了解是否有一种简单的方法可以将可变数量的参数传递给 Eloquent 中的查询,希望使用 array

据我所知,如果不循环通过 Input 查看请求中设置的内容,似乎没有办法做到这一点。

此处的示例:Laravel Eloquent search two optional fields

这可行,但我觉得它的复杂性/不优雅对我来说不是 Laravel。

这是我所在的地方,这可能是不可能的,只是希望其他人已经解决了类似的问题:

$where = array("user_id" => 123, "status" => 0, "something else" => "some value");

        $orders = Order::where($where)->get()->toArray();
        return Response::json(array(
                'orders' => $orders
                ),
            200
        );

这当然会返回错误strtolower() expects parameter 1 to be string, array given

这可能吗?

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    Order::where 实际上返回一个查询构建器的实例,所以这可能比你想象的要容易。如果您只想获取查询构建器的该实例并一次“构建”查询一个 where(),您可以像这样获得它:

    $qb = (new Order)->newQuery();
    foreach ($searchParams as $k => $v) {
        $qb->where($k, $v);
    }
    return $qb->get(); // <-- fetch your results
    

    如果您想查看查询生成器在做什么,您也可以执行 get() 并在之后执行:

    dd(\DB::getQueryLog());
    

    这将向您展示结果查询的样子;这在使用 Eloquent 时非常有用。

    【讨论】:

    • 感谢您的回答。我可以看到这是可能的,我希望通过array 一次性完成。但这也很有用,因为我不知道你可以做(new Order) 部分。也是一支非常棒的乐队。
    • 我可以确认这确实有效。如果暂时没有其他人有神奇的答案,我会标记这个。
    • 哈哈。我这样做是因为 Model->newQuery() 为模型的表获取了一个新的查询构建器……它很容易阅读,而且我不相信有一个静态的等价物。无论哪种方式,Builder 都使用“builder 模式”——关键字是 builder。 “工厂”的关键字就像你说的“一次性”。我不知道 Laravel 中的查询工厂,但也许我错了。
    • 这是无价的信息。你赢了。好吧,你并没有真正得到太多的竞争。 dd 我也不知道的事情。我越是尝试远离 PHP,我就越喜欢 Laravel。那家伙确实干了件好事。
    • 您从哪里得知(new Model)-&gt;newQuery()?我在文档中没有看到类似的东西,每当我问 Laravel 问题时,我都会得到以前从未见过的东西。
    【解决方案2】:

    你可以试试这个:

    方法一:

    如果您在输入中收到一个可选的搜索参数

    $orders = Order::select('order_id','order_value',...other columns);
    
    if($request->has(user_id)) {
       $orders->where('orders.user_id','=',$request->user_id);
    }
    
    //considering something_else as a substring that needs to be searched in orders table
    if($request->has('something_else')) {
        $orders->where('orders.column_name', 'LIKE', '%'.$request->something_else.'%');
    }
    
    $orders->paginate(10);
    

    方法二:

    如果输入中有多个可选参数

    $orders = Order::select('columns');
    foreach($input_parameters as $key => $value) {
        //this will return results for column_name=value
        $orders->where($key, $value);//key should be same as the column_name
    
        //if you need to make some comparison
        $orders->where($key, '>=', $value);//key should be same as the column_name
    }
    return $orders->paginate(15);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 2017-11-29
      • 2014-10-05
      • 2021-07-15
      相关资源
      最近更新 更多