Laravel Eloquent带有可选参数的查询

6
我正在尝试了解是否有一种简单的方法来使用Eloquent传递可变数量的参数,希望使用数组
据我所知,没有办法不通过循环遍历Input来查看请求中设置了什么来实现这一点。
可以在这里找到示例:Laravel Eloquent搜索两个可选字段 这样做是可行的,但我觉得它过于复杂且不够优雅,不符合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()期望参数1是字符串,但得到的是数组。这种情况可能发生吗?
2个回答

10

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时,这非常有用。


1
谢谢你的回答。我可以看到这是可能的,我希望只需通过传递一个数组就可以完成。但这也很有启发性,因为我不知道你可以做(new Order)这部分。同时,这也是一支非常棒的乐队。 - Jazzy
我可以确认这个确实有效。如果其他人在一段时间内没有神奇的答案,我会标记这个。 - Jazzy
哈哈。我这样做只是因为Model->newQuery()会为模型的表获取一个新的查询构建器...这很容易阅读,而且我不认为有静态等效物。无论如何,Builder使用“构建器模式”——关键字是builder。 “工厂”的关键字就像你说的“一次性”。我不知道Laravel中是否有查询工厂,但也许我错了。 - Plywood
那是无价的信息。你赢了。嗯,其实你并没有遇到太多竞争对手。我也不知道 dd 这个东西。我越是试图远离 PHP,就越爱 Laravel。那个人真的做了一些好事情。 - Jazzy
只是对 @Plywood 的回答的补充 - 您也可以使用 ->toSql() 来查看查询实际上在 SQL 中的样子。因此,例如,如果您将其作为 $qb->where($k, $v)->get(),那么您将使用 $qb->where($k, $v)->toSql() 来查看实际执行的 SQL 查询。 如果我走错了,请纠正我。 - Milkncookiez
显示剩余3条评论

1

您可以尝试以下方法:

方法1:

如果您的输入中只有一个可选的搜索参数

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

方法2:
如果您的输入中有多个可选参数。
$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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接