2016-12-17 3 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(); 

цена модель Task состоит из валютных и значения атрибутов.

Тогда я перебирать $ задач и пересчитывать цену на основе конкретного пользователя валюты:

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

После осмотра задачи, все цены пересчитываются правильно.

Однако, когда я впоследствии сериализую $ tasks и отправляю его в качестве ответа, он содержит данные по мере их поступления из базы данных - без пересчета цен.

Кто-нибудь, в чём проблема? Любые идеи будут высоко оценены!

ответ

1

Для этого можно использовать Eloquent Mutator.

Создать следующую функцию в Task модели

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

И тогда вы можете использовать его как:

$task->new_price; 

После создания аксессора добавьте имя атрибута к appends собственности на Task модели.

protected $appends = ['new_price']; 

После того, как атрибут был добавлен в список присоединяет, он будет включен в массив и JSON представлений Обе модели.

+0

Именно то, что я искал, спасибо! :-) – user3559787

2

Поскольку вы сериализации данные в любом случае, вы can first convert collection into an array и работать как с массивом:

$tasks->toArray(); 

В этом случае вы будете иметь возможность переопределить исходные данные, как вы пытались выполнить с foreach петля.

В качестве альтернативы вы можете create a mutator, который добавит calculated_price недвижимости в коллекцию.

+1

Спасибо! Я должен был выбрать между двумя правильными ответами, и @Amit Gupta's сделал это более полным. Я дал вам хотя бы проголосовать :-) – user3559787

Смежные вопросы