2016-12-17 7 views
1

私は、ユーザー固有の通貨に基づいて価格を再計算する必要があるバックエンドで作業しています。応答を送信する前にモデルデータを変更する

私は次のように、データベースから必要なすべてのレコードをフェッチ:

$tasks = Task::with([ 
      'images' => function($query){}, 
      'price' => function($query){}, 
      'user' => function($query){ $query->with('images');}, 
     ])->whereDoesntHave('tasksState', function($query) use ($user){ 
      $query->where('user_id', $user->id); 
      $query->where('state', '<>', 0); 
     })->where('id', '>', $offset)->where('user_id', '<>', $user->id)->take($limit)->get(); 

タスクの価格モデルは、通貨および値の属性で構成されています。私は$タスクやユーザー固有の通貨に基づいて再計算する価格を反復

は次に:

foreach ($tasks as $k => $task){ 
      $price = $task->price->value; 
      $price = $price * $rate->getValue(); 
      $tasks[$k]->price = $price; 
      //$task->price = $price; 
     } 

タスクを検査した後、すべての価格が正しく再計算されます。

しかし、後で$タスクをシリアル化して応答として送信すると、データベースからフェッチされたデータが再計算されます。

誰か問題がどこにありますか?どんなアイデアも大歓迎です!

答えて

1

これにはEloquent Mutatorを使用できます。

Taskモデル

public function getNewPriceAttribute($value) 
{ 
    ...// do your processing here 
} 

に次の関数を作成し、あなたにそれを使用することができます、アクセサを作成した後

$task->new_price; 

Taskモデルにappendsプロパティに属性名を追加します。

protected $appends = ['new_price']; 

属性が追加リストに追加されると、その属性はモデルの配列とJSON表現の両方に含まれます。

+0

私が探していたものを正確に、ありがとう! :-) – user3559787

2

あなたはとにかくデータをシリアル化しているので、あなたはcan first convert collection into an array、配列と同じように、それを仕事:あなたが達成しようとしたとして、あなたは、元のデータを上書きすることができます。この場合

$tasks->toArray(); 

foreachループ。

create a mutatorこれは、calculated_priceというプロパティをコレクションに追加します。

+1

ありがとうございました!私は2つの正しい答えの間で選択しなければなりませんでした。私はあなたに少なくとも投票を与えました:-) – user3559787

関連する問題