Laravel 5.4: 在 Eloquent 中,在关系 whereHas 中使用 groupBy
Laravel 5.4: in Eloquent using groupBy inside of relation whereHas
如何在 Eloquent
中使用 whereHas
中的 groupBy
这是我的查询
public function index( Request $request ) {
$dateFrom = $request->get( 'dateFrom' );
$dateTo = $request->get( 'dateTo' );
$status = $request->get( 'orderState' );
$orders = ( new OrderList() )
->whereHas( 'orderDetail', function ( $query ) {
$query->where( 'supplier_id', Auth::guard( 'supplier' )->user()->id );
} )
->when( $dateFrom, function ( $query ) use ( $dateFrom, $dateTo ) {
$query->whereBetween( 'created_at', [ $dateFrom, $dateTo ] );
} )
->when( $status, function ( $query ) use ( $status ) {
$query->where( 'order_state_id', $status )->get();
} )
->get();
//dd( $orders );
//Order Status
$orderStates = OrderState::listsTranslations( 'states' )->pluck( 'states', 'id' )->toArray();
return view( 'supplierComponents.order_list', compact( 'orders', 'orderStates' ) );
}
我需要按 order_id
对订单列表进行分组 存在于 orderDetail
我试过了
->whereHas( 'orderDetail', function ( $query ) {
$query->where( 'supplier_id', Auth::guard( 'supplier' )->user()->id )->groupBy('order_id');
} )
更新
然后
订单清单详情有order_id
我需要order_list才能groupBy
它
dd($orders) results
11 => OrderList {#723 ▼
#fillable: array:4 [▶]
#connection: "mysql"
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:6 [▶]
#original: array:6 [▶]
#casts: []
#dates: []
#dateFormat: null
#appends: []
#events: []
#observables: []
#relations: array:1 [▼
"orderDetail" => Collection {#741 ▼
#items: array:1 [▶]
}
]
#touches: []
+timestamps: true
#hidden: []
#visible: []
看到这个
#relations: array:1 [▼
"orderDetail" => Collection {#741 ▼
#items: array:1 [▶]
}
如果它被分组,它应该在此处将相关项目分组,但它不会以这种方式发生
但这没有用,正确的方法应该是什么?
whereHas
不会给你group by,你得重新获取关系数据。使用以下内容:
$orders = ( new OrderList() )
->whereHas( 'orderDetail', function ( $query ) {
$query->where( 'supplier_id', Auth::guard( 'supplier' )->user()->id );
} )
->with(['orderDetail' => function ($query) {
$query->where( 'supplier_id', Auth::guard( 'supplier' )->user()->id )->groupBy('order_id');
}])
->when( $dateFrom, function ( $query ) use ( $dateFrom, $dateTo ) {
$query->whereBetween( 'created_at', [ $dateFrom, $dateTo ] );
} )
->when( $status, function ( $query ) use ( $status ) {
$query->where( 'order_state_id', $status )->get();
} )
->get();
$orders = Order::join('orderDetail',function($q){
$q->on('orderDetail.your_id','orders.id');
$q->where('supplier_id', Auth::guard('supplier')->user()->id);
})
->select(['orders.user_id','orderDetail.order_id'])
->when($dateFrom, function ( $query ) use ( $dateFrom, $dateTo ) {
$query->whereBetween('orders.created_at', [ $dateFrom, $dateTo ] );
})
->when($status, function ( $query ) use ( $status ) {
$query->where( 'orders.order_state_id', $status );
})
->groupBy('orderDetail.order_id')
->get();
如何在 Eloquent
中使用whereHas
中的 groupBy
这是我的查询
public function index( Request $request ) {
$dateFrom = $request->get( 'dateFrom' );
$dateTo = $request->get( 'dateTo' );
$status = $request->get( 'orderState' );
$orders = ( new OrderList() )
->whereHas( 'orderDetail', function ( $query ) {
$query->where( 'supplier_id', Auth::guard( 'supplier' )->user()->id );
} )
->when( $dateFrom, function ( $query ) use ( $dateFrom, $dateTo ) {
$query->whereBetween( 'created_at', [ $dateFrom, $dateTo ] );
} )
->when( $status, function ( $query ) use ( $status ) {
$query->where( 'order_state_id', $status )->get();
} )
->get();
//dd( $orders );
//Order Status
$orderStates = OrderState::listsTranslations( 'states' )->pluck( 'states', 'id' )->toArray();
return view( 'supplierComponents.order_list', compact( 'orders', 'orderStates' ) );
}
我需要按 order_id
对订单列表进行分组 存在于 orderDetail
我试过了
->whereHas( 'orderDetail', function ( $query ) {
$query->where( 'supplier_id', Auth::guard( 'supplier' )->user()->id )->groupBy('order_id');
} )
更新
订单清单详情有order_id
我需要order_list才能groupBy
它
dd($orders) results
11 => OrderList {#723 ▼
#fillable: array:4 [▶]
#connection: "mysql"
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:6 [▶]
#original: array:6 [▶]
#casts: []
#dates: []
#dateFormat: null
#appends: []
#events: []
#observables: []
#relations: array:1 [▼
"orderDetail" => Collection {#741 ▼
#items: array:1 [▶]
}
]
#touches: []
+timestamps: true
#hidden: []
#visible: []
看到这个
#relations: array:1 [▼
"orderDetail" => Collection {#741 ▼
#items: array:1 [▶]
}
如果它被分组,它应该在此处将相关项目分组,但它不会以这种方式发生
但这没有用,正确的方法应该是什么?
whereHas
不会给你group by,你得重新获取关系数据。使用以下内容:
$orders = ( new OrderList() )
->whereHas( 'orderDetail', function ( $query ) {
$query->where( 'supplier_id', Auth::guard( 'supplier' )->user()->id );
} )
->with(['orderDetail' => function ($query) {
$query->where( 'supplier_id', Auth::guard( 'supplier' )->user()->id )->groupBy('order_id');
}])
->when( $dateFrom, function ( $query ) use ( $dateFrom, $dateTo ) {
$query->whereBetween( 'created_at', [ $dateFrom, $dateTo ] );
} )
->when( $status, function ( $query ) use ( $status ) {
$query->where( 'order_state_id', $status )->get();
} )
->get();
$orders = Order::join('orderDetail',function($q){
$q->on('orderDetail.your_id','orders.id');
$q->where('supplier_id', Auth::guard('supplier')->user()->id);
})
->select(['orders.user_id','orderDetail.order_id'])
->when($dateFrom, function ( $query ) use ( $dateFrom, $dateTo ) {
$query->whereBetween('orders.created_at', [ $dateFrom, $dateTo ] );
})
->when($status, function ( $query ) use ( $status ) {
$query->where( 'orders.order_state_id', $status );
})
->groupBy('orderDetail.order_id')
->get();