Laravel 5.4: для фильтрационного запроса по умолчанию установлено значение all - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь отфильтровать данные, поступающие из базы данных.

Вот полный запрос

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, результаты будут пустыми.Как я могу установить значение по умолчанию $status для всех или просто проигнорировать его в запросе, если он пуст, без необходимости делать другой запрос?

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018
 $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();
0 голосов
/ 24 апреля 2018

В качестве альтернативы ответу @ 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();

Ссылка на документы

0 голосов
/ 24 апреля 2018

вам нужно что-то вроде этого:

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