在发送响应之前修改模型数据

时间:2016-12-17 10:35:53

标签: laravel eloquent lumen

我正在开发一个需要根据用户特定货币重新计算价格的后端。

我从数据库中获取所有必需的记录,如下所示:

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

任务的价格模型由货币和价值属性组成。

然后我遍历$ tasks并根据用户特定的货币重新计算价格:

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

检查完任务后,所有价格都会重新正确计算。

然而,当我随后序列化$ tasks并将其作为响应发送时,它包含从数据库中提取的数据 - 没有重新计算的价格。

有人问题在哪里?任何想法将不胜感激!

2 个答案:

答案 0 :(得分:2)

由于您无论如何都要对数据进行序列化,因此您需要can first convert collection into an array并将其与数组一起使用:

$tasks->toArray();

在这种情况下,您可以覆盖原始数据,因为您已尝试使用foreach循环完成。

作为替代方案,您可以create a mutatorcalculated_price属性添加到集合中。

答案 1 :(得分:1)

您可以使用Eloquent Mutator

Task模型

中创建以下功能
public function getNewPriceAttribute($value)
{
  ...// do your processing here
}

然后您可以将其用作:

$task->new_price;

创建访问者后,将属性名称添加到Task模型上的appends属性。

 protected $appends = ['new_price'];

将属性添加到追加列表后,它将包含在模型的数组和JSON表示中。