Laravel 5.4:for循环中的groupBy无法按预期工作

时间:2018-05-01 10:16:40

标签: php laravel for-loop laravel-blade

这是我的控制器首先看到这个控制器非常重要

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

这里也是OrderListOrderDetail

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

现在我正在尝试在刀片文件中执行groupby

@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 :(得分:0)

尝试在 orderDetail 关系中添加 groupBy 选择


              $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" ));
            } )

quantity_total 将保留总数量。

希望有所帮助。

答案 1 :(得分:0)

当您返回OrderList类型的对象而不是Collection时,您将无法访问groupBy()方法。

如果要将groupBy()子句应用于基础查询,可以通过访问查询构建器来执行此操作,如下所示:

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

更新

如果您有权访问CollectionEloquentSupport),则可以按列表中的对象属性进行分组,如下所示:

$order->groupBy('product_id');

但是,在您的情况下,我认为您实际上想要按相关对象的属性进行分组。您可以使用.表示法执行此操作,如下所示:

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