[英]Laravel 5.4: groupBy on for-loop not working as expected
Here is my controller first it's very important to see this controller 首先是我的控制器,看这个控制器非常重要
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' ) );
}
and here is also the Models for OrderList
and OrderDetail
这也是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' );
}
}
Now I am trying to do groupby in the blade file 现在我正在尝试在刀片文件中进行分组
@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
Now the results of this array is coming like 现在这个数组的结果像
-------------------------------------------
product-name | quantity | product-id |
-------------------------------------------
Coffey | 2 | 15 |
Coffey | 1 | 15 |
Coffey | 1 | 15 |
tea | 3 | 22 |
tea | 2 | 22 |
tea | 1 | 22 |
-------------------------------------------
which I need it to be something like 我需要它像
-------------------------------------------
product-name | quantity | product-id |
-------------------------------------------
Coffey | 4 | 15 |
tea | 6 | 22 |
-------------------------------------------
Update 更新资料
when debug on orders that what I get. 当调试我得到的命令时。
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 ▶}
How to achieve this 如何做到这一点
Try adding groupBy and select in your orderDetail relationship. 尝试添加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" )); } )
And the quantity_total will be holding the total quantity. 并且quantity_total将保持总数量。
Hope that helps. 希望能有所帮助。
As you are returning an object of type OrderList
rather than Collection
then you will not have access to the groupBy()
method. 当您返回OrderList
类型而不是Collection
类型的对象时,您将无权访问groupBy()
方法。
If you want to apply a groupBy()
clause to the underlying query you can do so by accessing the query builder like so: 如果要对基础查询应用groupBy()
子句,可以通过访问查询构建器来实现,如下所示:
$order->orderDetail()->groupBy('product_id')
When you have access to a Collection
( Eloquent
or Support
), you can group by properties of the objects in your list like so: 当您有权访问Collection
( Eloquent
或Support
)时,可以按以下方式按列表中对象的属性进行分组:
$order->groupBy('product_id');
However, in your case I think you are actually wanting to group by properties of related objects. 但是,就您而言,我认为您实际上是想按相关对象的属性分组。 You can do this using the .
您可以使用来执行此操作.
notation like so: 像这样的符号:
$order->groupBy('orderDetail.product_id')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.