2016-12-29 10 views
1

私はこのの助けを借りて、注文の合計を計算しようとしました: Laravel Eloquent: Best Way to Calculate Total PriceLaravel料金の計算

私は計算がモデルで行うことにしたいので、私は複数のコントローラでそれを使用することができます。

私のコードは次のようになります。

class Order extends Model 
{ 
    public function customer() 
    { 
     return $this->belongsTo('App\Customer'); 
    } 

    public function orderItems() 
    { 
     return $this->hasMany('App\OrderItem'); 
    } 

    public function total() 
    { 
     return $this->orderItems->sum(function($orderItem) 
      { 
       return $orderItem->net_price; 
      }); 
    } 
} 

だから私は、私は正確に例のようにすべてを行っていると思うが、私は次のエラーを取得しています:

ErrorException in Model.php line 2696: Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation

すべてのヘルプは非常になります感謝。
ありがとうございます。

+0

今はまったくそれを呼び出していないとにかくエラーが発生します。 – Joha

+0

私は{{$ order-> total}}と{{$ order-> total()}}のビューから呼び出す前に – Joha

答えて

0

Joha、小数点以下の値を扱っているときに、コレクションのsum関数を使用することには非常に注意が必要です。これは、整数値を使用している場合は関係ありません。

sum関数が合計を誤って計算し、59.999999999998184のような奇妙な数値を残すことがあります。これは小数演算がコンピュータではあまり安定していないため、各項目をループして、代わりにbcmathを使用する必要があります。たとえあなたが今それを体験していなくても、アプリが成長するにつれて、これは問題になるでしょう。ここ

はより安全&正確例であろう。

class Order extends Model{ 

    public function customer() 
    { 
     return $this->belongsTo('App\Customer'); 
    } 

    public function orderItems() 
    { 
     return $this->hasMany('App\OrderItem'); 
    } 

    public function getTotalAttribute() { 
     $totalPrice = 0; 

     foreach ($this->orderItems as $orderItem) { 
      $totalPrice = bcadd($totalPrice, $orderItem->net_price, 2); 
     } 

     return $totalPrice; 
    } 
} 

コード例に示されるように、私はまた、属性に関数をリファクタリングであろう。これにより、モデルの属性であるかのように$order->totalにアクセスできます。

+0

あなたの答えをありがとう、どのように/リファクタリングが行われているので、私はそれを属性として使うことができますか?関数get ...を呼び出すだけです。Attribute()? – Joha

+0

リファクタリングは私の答えに含まれるコードで行われます。 これは、関数の名前が 'getTotalAttribute()'であるためです。 Laravelはこれを自動的に認識し、今あなたが注文しているビュー/コントローラで、 '$ order-> total'にアクセスすると、' getTotalAttribute() '関数の値を返します。これは理にかなっていますか? – SixteenStudio

+0

はい、それは意味があり、私はすでにそれを試してみました。あなたにタンク! – Joha

0

はについて何:

public function total() { 
    return $this->orderItems->sum('net_price'); 
} 
+0

を試しましたが、同じエラーが発生します。 – Joha

+0

その答えの2番目のオプションはどうでしょうか? – CUGreen

+0

これは問題だと思っていません。なぜならコントローラでは、foreach($ order-> orderItems as orderItem){...}を使用してorderitemをループすることができるからです。 – Joha

0

問題はhasMany関係にあります。これを試してみてください:もちろん

public function orderItems() 
{ 
    return $this->hasMany(App\OrderItem::class, 'order_id'); 
} 

、あなたがのOrderItemの表の情報を保持している名前にorder_idを変更する必要があります。

+0

私はそれを試してみましょう。 '' '$ this-> orderItems() - > sum(DB :: raw( 'net_price'));' '' – Joha

+0

'order id'はorderItemsテーブルの外部キーです。私は前にそれを持っていた方法で、デフォルトで動作するはずですよね? – Joha

+0

する必要があります。しかし、私は他の問題を見ていないので、私たちはそれを試してみるべきだと思った。 –

0

関数のように見えますが、問題は、私がそれを呼び出した場所からのビューが、変更後に正しくアップロードされなかったことです。ビュー内の通話は{{$ order-> total()}}

ありがとうございます。

関連する問題