繁体   English   中英

Laravel 5.4:groupBy在for循环上无法按预期工作

[英]Laravel 5.4: groupBy on for-loop not working as expected

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

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

现在我正在尝试在刀片文件中进行分组

@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 ▶}

如何做到这一点

尝试添加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" ));
            } )

并且quantity_total将保持总数量。

希望能有所帮助。

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

如果要对基础查询应用groupBy()子句,可以通过访问查询构建器来实现,如下所示:

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

更新资料

当您有权访问CollectionEloquentSupport )时,可以按以下方式按列表中对象的属性进行分组:

$order->groupBy('product_id');

但是,就您而言,我认为您实际上是想按相关对象的属性分组。 您可以使用来执行此操作. 像这样的符号:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM