Laravel 5.4: в Eloquent с использованием groupBy внутри отношения, где есть - PullRequest
0 голосов
/ 26 апреля 2018

Как я могу использовать groupBy в whereHas в Eloquent

Вот мой запрос

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');
            } ) 

Обновление

Here is the Order List а затем

Here is the Order List Details

В списке заказов есть order_id, ведь мне нужно, чтобы order_list был groupBy it

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 [▶] }

если это сгруппировано, то должны быть сгруппированы связанные элементы здесь, но это не происходит таким образом

но это не сработало, каким должен быть правильный способ сделать это?

Ответы [ 2 ]

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

whereHas не даст вам группу, вам нужно снова получить данные о взаимоотношениях. используйте следующее:

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