2016-07-11 9 views
0

私のララブモデルにアクセサとミューテータを追加しました。ですか?

public function getAmountAttribute($amount) 
{ 
    return ($amount)/100; 
} 
public function setAmountAttribute($amount) 
{ 
    $this->attributes['amount'] = $amount * 100; 
} 

これらはうまく動作します。 1つの場所で私は問題に直面しています: 問題は、私のコントローラで金額フィールドの集計関数を適用することです。しかし、アクセサは動作していません。

Model::with(['xxx'])->where('parent_id', $id)->sum('amount') 

$ idの値を確認しました。 parent_idが$ idと等しい量のフィールドの合計を私に与えています。ダイビング後の結果は100になります。

ありがとうございます。

答えて

0

アクセサーとミューテータを使用すると、 をモデルから取得したり値を設定したりするときにEloquentアトリビュートをフォーマットすることができます。

...テーブルを照会していません。

Model::with(['xxx']) 
    ->addSelect(DB::raw('SUM(`table`.amount/100) as sum_of_amounts')) 
    ->where('parent_id', $id) 
    ->get(); 
0

アクセサ/ミューテータはあなたが結果からプロパティにアクセスするときにのみ呼ばれますが、あなたがそれを行うことはできませんので、それはクエリ内では動作しませんが、代替として、あなたはLaravelのCollection::sum()メソッドを使用することができます例:

protected $appends = ['amount']; 
:それは次有する場合

$collection = Model::with(['xxx'])->where('parent_id', $id)->get(); 
$someOfAmount = $collection->sum('amount'); 

すると、使用中のあなたModelで保護さ$appendsプロパティを作成したことを確認します

注:この$appendsが必須かどうかはわかりませんが、これを試すことがあります。

+1

私の思うように、私たちはデータベースにフィールドがなく、私たちのコレクションに含めることを望んでいたときに、$ appendsを使用するべきです。 [雄弁にアクセサーを使用する](http://laraveldaily.com/why-use-appends-with-accessors-in-eloquent/) あなたの答えに応じてこの方法で使用することをお勧めします。ありがとう –