【问题标题】:Laravel Query Builder When / IfLaravel 查询生成器何时/如果
【发布时间】:2021-09-12 01:13:13
【问题描述】:

我正在尝试根据用户过滤器从表中过滤掉一些特定记录,但遇到了如何正确格式化它的问题。我有来自Orders 表的sales_channeltotal 列。

如果sales_channel == Non-Amazon,那么我需要获取所有这些记录,而不管total。或者,如果sales_channel !== Non-Amazon 那么我只想抓取具有total > 0 的记录

对于我的初始查询,我有以下按预期工作:

$orders = Orders::where('sales_channel', '=', 'Non-Amazon')->orWhere(function ($query) {
    $query->where('total', '>', 0);
})->get();

但是,当用户发送过滤数据的请求时,我不确定如何正确过滤请求。这是我目前拥有的$request['sales_channel'] 是他们想要返回的一系列销售渠道:

$request = $request->data;
$orders = Orders::query();

if ($request['sales_channel']) {
    $orders->whereIn('sales_channel', $request['sales_channel']);
}

如果$request['sales_channel'] 包含Non-Amazon,我将如何做到这一点,获取所有非亚马逊记录,但对于任何其他销售渠道,total > 0 必须为真。


例子:

sales_channel | total
--------------+----------------
Non-Amazon    | 19.99
Non-Amazon    | 0.00
Amazon.com    | 11.00
Amazon.com    | 0.00
Amazon.ca     | 22.00
Amazon.com.mx | 19.99

用户希望按非亚马逊和 Amazon.com 结果过滤:

$request['sales_channel'] = ['Non-Amazon', 'Amazon.com'];

结果将返回:

sales_channel | total
--------------+----------------
Non-Amazon    | 19.99
Non-Amazon    | 0.00
Amazon.com    | 11.00

【问题讨论】:

  • 您能否将示例数据作为结果的预期数据结束
  • @NurbekBoymurodov 通过示例更新了问题

标签: php laravel laravel-query-builder


【解决方案1】:

你可以试试这样的:

$request = $request->data;
$orders = Orders::query();

if ($request['sales_channel']) {
    $orders = $orders->whereIn('sales_channel', $request['sales_channel']);
}else{ 
    //the initial query
    $orders = $orders->where('sales_channel', '=', 'Non-Amazon')->orWhere(function ($query) {
        $query->where('total', '>', 0);
    });
}

//check if the orders are filtered correctly
var_dump($orders->get());

【讨论】:

  • 谢谢@Andrej,我认为这可行,但$orders 仍然返回Non-Amazon 订单,即使请求中不包含这些订单。
  • 我明白了,我编辑了答案,你能检查一下这是否有效吗?
  • 您可能需要在 if($request['sales, 中再添加一个条件来检查是否 !=='Non-Amazon' 并添加总查询。
【解决方案2】:

在什么时候使用

$orders = Orders::when(($request->sales_channel=="Non-Amazon"),function ($query)use($request){
                 $query->where('sales_channel', $request->sales_channel);
                 })->when(($request->sales_channel!="Non-Amazon"),function ($query)use($request){
                 $query->where('total', '>', 0);
                })->get();

【讨论】:

    猜你喜欢
    • 2019-06-22
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    相关资源
    最近更新 更多