Laravel 5.4: groupBy для цикла for работает не так, как ожидалось - PullRequest
0 голосов
/ 01 мая 2018

Вот сначала мой контроллер, очень важно увидеть этот контроллер

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

        //Order Status
        $orderStates = OrderState::listsTranslations( 'states' )->pluck( 'states', 'id' )->toArray();


        return view( 'supplierComponents.order_list', compact( 'orders', 'orderStates' ) );
    }

и вот также модели для OrderList и OrderDetail

class OrderList extends Model {
    protected $fillable = [
        ......
        ......
    ];
    public function orderDetail() {
        return $this->hasMany( OrderDetail::class, 'order_id' );
    }

    public function ....
    ....................
    }
}

class OrderDetail extends Model {
    protected $fillable = [
        ......
        ......
    ];

    public function orderId() {
        return $this->belongsTo( OrderList::class, 'order_id' );
    }

    public function productId() {
        return $this->belongsTo( Product::class, 'product_id' );
    }
}

Теперь я пытаюсь сделать групповой в блейд-файле

@foreach($orders as $order)
     @foreach($order->orderDetail->groupBy('product_id') as $items)
       <tr>
         <td>{!! $items->sum('quantity') !!}</td>
         <td>{!! $items->first()->product_name !!}</td>
         <td>{!! $items->first()->product_id !!}</td>
       </tr>
     @endforeach
@endforeach

Теперь результаты этого массива выглядят как

-------------------------------------------
product-name   |  quantity  |  product-id | 
-------------------------------------------
Coffey         |     2      |      15     |
Coffey         |     1      |      15     |
Coffey         |     1      |      15     |
tea            |     3      |      22     |
tea            |     2      |      22     |
tea            |     1      |      22     |
-------------------------------------------

что мне нужно, чтобы это было что-то вроде

-------------------------------------------
product-name   |  quantity  |  product-id | 
-------------------------------------------
Coffey         |     4      |      15     |
tea            |     6      |      22     |
-------------------------------------------

Обновление

при отладке по заказам то что получаю.

Collection {#708 ▼
  #items: array:14 [▼
    0 => OrderList {#717 ▼
      #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:5 [▼
        "deliveryList" => null
        "orderedUsers" => User {#756 ▶}
        "orderedStates" => OrderState {#763 ▶}
        "orderDetail" => Collection {#782 ▶}
        "address" => CustomerAddressBook {#791 ▶}
      ]
      #touches: []
      +timestamps: true
      #hidden: []
      #visible: []
      #guarded: array:1 [▶]
    }
    1 => OrderList {#718 ▶}
    2 => OrderList {#719 ▶}
    3 => OrderList {#720 ▶}
    4 => OrderList {#721 ▶}

Как этого добиться

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Поскольку вы возвращаете объект типа OrderList вместо Collection, у вас не будет доступа к методу groupBy().

Если вы хотите применить предложение groupBy() к базовому запросу, вы можете сделать это, обратившись к конструктору запросов следующим образом:

$order->orderDetail()->groupBy('product_id')

Обновление

Когда у вас есть доступ к Collection (Eloquent или Support), вы можете группировать по свойствам объектов в вашем списке следующим образом:

$order->groupBy('product_id');

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

$order->groupBy('orderDetail.product_id')

0 голосов
/ 01 мая 2018

Попробуйте добавить groupBy и , выберите в отношениях orderDetail .


              $orders = ( new OrderList() )
                   ->whereHas( 'orderDetail', function ( $query ) {
                       $query->where( 'supplier_id', Auth::guard( 'supplier' )->user()->id );
                       $query->groupBy( 'product_id' );
                       $query->select(DB::raw( "SUM(quantity) as quantity_total" ));
            } )

И amount_total будет содержать общее количество.

Надеюсь, это поможет.

...