Laravel Eloquent: 计算总价的最佳方式
Laravel Eloquent: Best Way to Calculate Total Price
我正在使用 Laravel 5.1 构建一个简单的买卖应用程序。每个 Buy Model 都有许多 BuyDetail,其中存储了购买的商品数量和 buy_price。我已经在模型上实现了 table 之间的关系。
class Buy extends Model
{
#Eloquent relationships
public function supplier()
{
return $this->belongsTo('App\Supplier');
}
public function buyDetails()
{
return $this->hasMany('App\BuyDetail');
}
}
我想计算每次购买的总价。使用 Eloquent ORM 计算总价的最佳方法是什么?
现在我只是这样实现它:
@foreach($buys as $key => $value)
<?php
$total = 0;
?>
@foreach($value->buyDetails as $k => $bD)
<?php
$total += ($bD['buy_price']*$bD['qty']);
?>
@endforeach
<tr>
<td>{{$value->ref_number}}</td>
<td>{{$value->suplier->name}}</td>
<td>{{$value->created_at}}</td>
<td>{{$value->buyDetails->count()}}</td>
<td>{{$total}}</td>
<td>
<a href="" class="btn btn-default btn-sm" title="show">Detail</a>
<a href="" class="btn btn-primary btn-sm" title="edit">Edit</a>
<a href="" class="btn btn-danger btn-sm" title="delete">Delete</a>
</td>
</tr>
@endforeach
这可以通过(至少)两种方式完成。
使用纯 Eloquent 模型逻辑:
class Buy extends Model
{
public function getTotalPrice() {
return $this->buyDetails->sum(function($buyDetail) {
return $buyDetail->quantity * $buyDetail->price;
});
}
}
这里唯一的问题是它需要从数据库中获取所有购买详细信息,但无论如何您都需要获取这些信息才能在视图中显示详细信息。
如果您想避免从数据库中获取关系,您可以手动构建查询:
class Buy extends Model
{
public function getTotalPrice() {
return $this->buyDetails()->sum(DB::raw('quantity * price'));
}
}
我意识到答案已经被接受,但我只是想添加我自己的详细说明另一种方法。
就个人而言,我喜欢将这些“聚合”方法放在自定义集合中 类。因此,如果我有一个 Buy
模型可以有许多 BuyDetail
模型,那么我会在我的 BuyDetailCollection
方法上放置一个 getTotal()
方法,如下所示:
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
class BuyDetailCollection extends EloquentCollection
{
public function getTotal()
{
return $this->items->sum(function ($detail) {
return $detail->price * $detail->quantity;
});
}
}
然后我可以将其添加到 BuyDetail
模型中:
class BuyDetail extends Model
{
public function newCollection(array $models = [])
{
return new BuyDetailCollection($models);
}
}
然后在我需要的地方使用我的 getTotal()
方法:
$buy = Buy::with('buyDetails')->find($id);
$total = $buy->buyDetails->getTotal();
我正在使用 Laravel 5.1 构建一个简单的买卖应用程序。每个 Buy Model 都有许多 BuyDetail,其中存储了购买的商品数量和 buy_price。我已经在模型上实现了 table 之间的关系。
class Buy extends Model
{
#Eloquent relationships
public function supplier()
{
return $this->belongsTo('App\Supplier');
}
public function buyDetails()
{
return $this->hasMany('App\BuyDetail');
}
}
我想计算每次购买的总价。使用 Eloquent ORM 计算总价的最佳方法是什么?
现在我只是这样实现它:
@foreach($buys as $key => $value)
<?php
$total = 0;
?>
@foreach($value->buyDetails as $k => $bD)
<?php
$total += ($bD['buy_price']*$bD['qty']);
?>
@endforeach
<tr>
<td>{{$value->ref_number}}</td>
<td>{{$value->suplier->name}}</td>
<td>{{$value->created_at}}</td>
<td>{{$value->buyDetails->count()}}</td>
<td>{{$total}}</td>
<td>
<a href="" class="btn btn-default btn-sm" title="show">Detail</a>
<a href="" class="btn btn-primary btn-sm" title="edit">Edit</a>
<a href="" class="btn btn-danger btn-sm" title="delete">Delete</a>
</td>
</tr>
@endforeach
这可以通过(至少)两种方式完成。
使用纯 Eloquent 模型逻辑:
class Buy extends Model
{
public function getTotalPrice() {
return $this->buyDetails->sum(function($buyDetail) {
return $buyDetail->quantity * $buyDetail->price;
});
}
}
这里唯一的问题是它需要从数据库中获取所有购买详细信息,但无论如何您都需要获取这些信息才能在视图中显示详细信息。
如果您想避免从数据库中获取关系,您可以手动构建查询:
class Buy extends Model
{
public function getTotalPrice() {
return $this->buyDetails()->sum(DB::raw('quantity * price'));
}
}
我意识到答案已经被接受,但我只是想添加我自己的详细说明另一种方法。
就个人而言,我喜欢将这些“聚合”方法放在自定义集合中 类。因此,如果我有一个 Buy
模型可以有许多 BuyDetail
模型,那么我会在我的 BuyDetailCollection
方法上放置一个 getTotal()
方法,如下所示:
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
class BuyDetailCollection extends EloquentCollection
{
public function getTotal()
{
return $this->items->sum(function ($detail) {
return $detail->price * $detail->quantity;
});
}
}
然后我可以将其添加到 BuyDetail
模型中:
class BuyDetail extends Model
{
public function newCollection(array $models = [])
{
return new BuyDetailCollection($models);
}
}
然后在我需要的地方使用我的 getTotal()
方法:
$buy = Buy::with('buyDetails')->find($id);
$total = $buy->buyDetails->getTotal();