代码之家  ›  专栏  ›  技术社区  ›  Yousef Altaf

Laravel 5.4:过滤查询设置默认为全部

  •  0
  • Yousef Altaf  · 技术社区  · 6 年前

    我正在尝试过滤来自数据库的数据。

    这是完整的查询

    public function index(Request $request)
    {
        $dateFrom = $request->get('dateFrom', Carbon::now()->subYears(10)->toDateTimeString());
        $dateTo = $request->get('dateTo', Carbon::today());
        $status = $request->get('orderState');
    
        $orders = (new OrderDetail())
            ->where('supplier_id', Auth::guard('supplier')->user()->id)
            ->whereBetween('created_at', [$dateFrom, $dateTo])
            ->whereHas('orderId', function ($query) use ($status) {
                $query->where('order_state_id', $status);
            })
            ->groupBy('order_id')
            ->get();
    
        //Order Status
        $orderStates = OrderState::listsTranslations('states')->pluck('states', 'id')->toArray();
    
        return view('supplierComponents.order_list', compact('orders', 'orderStates'));
    }
    

    现在如果客户端没有选择 $status 结果为空。 如何设置默认值 $状态 如果它是空的,而没有义务进行另一个查询,那么在查询中是全部还是忽略它?

    3 回复  |  直到 6 年前
        1
  •  2
  •   fico7489    6 年前

    你需要这样的东西:

    $orders = ( new OrderDetail() )
        ->where( 'supplier_id', Auth::guard( 'supplier' )->user()->id )
        ->whereBetween( 'created_at', [ $dateFrom, $dateTo ] );
    
        if($status){
            $orders = $orders->whereHas( 'orderId', function ( $query ) use ( $status ) {
                $query->where( 'order_state_id', $status );
            });
        }
    
        $orders = $orders->groupBy( 'order_id' )
        ->get();
    
        2
  •  1
  •   halfer Vinayaka Karjigi    6 年前

    作为@fico7489答案的替代方法,您还可以使用 when() 方法:

    $orders = (new OrderDetail())
        ->where('supplier_id', Auth::guard('supplier')->user()->id)
        ->whereBetween('created_at', [$dateFrom, $dateTo])
        ->when($status, function ($query) use ($status) {
            $query->whereHas('orderId', function ($query) use ($status) {
                $query->where('order_state_id', $status);
            });
        })
        ->groupBy('order_id')
        ->get();
    

    Link to the docs

        3
  •  1
  •   Adeoluwa Simeon    6 年前
     $orders = ( new OrderDetail() )
                    ->where( 'supplier_id', Auth::guard( 'supplier' )->user()->id )
                    ->whereBetween( 'created_at', [ $dateFrom, $dateTo ] )
                    ->whereHas( 'orderId', function ( $query ) use ( $status ) {
                       if(isset($status)) $query->where( 'order_state_id', $status );
                    } )`enter code here`
                    ->groupBy( 'order_id' )
                    ->get();