Intereting Posts

Laravel Eloquent: лучший способ расчета общей цены

Im строит простую заявку на покупку и продажу с Laravel 5.1. Каждая модель покупки имеет много BuyDetail, в котором хранится купленное количество товаров и buy_price. Я реализую связь между таблицей на модели.

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 

Related of "Laravel Eloquent: лучший способ расчета общей цены"

Это можно сделать (по крайней мере) двумя способами.

Использование чистой логики модели 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 , тогда я бы поставил метод getTotal() на мой метод BuyDetailCollection следующим образом:

 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();