Laravel 5.4: 过滤查询设置默认为全部
Laravel 5.4: filtration query set default to all
我正在尝试过滤来自数据库的数据。
这是完整的查询
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'));
}
现在,如果客户没有 select $status
结果为空。
我如何将默认值 $status
设置为全部,或者如果它为空而无需进行另一个查询,则在查询中忽略它?
你需要这样的东西:
$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();
$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();
作为@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();
我正在尝试过滤来自数据库的数据。
这是完整的查询
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'));
}
现在,如果客户没有 select $status
结果为空。
我如何将默认值 $status
设置为全部,或者如果它为空而无需进行另一个查询,则在查询中忽略它?
你需要这样的东西:
$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();
$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();
作为@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();