我正在开发一个需要根据用户特定货币重新计算价格的后端。
我从数据库中获取所有必需的记录,如下所示:
$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并将其作为响应发送时,它包含从数据库中提取的数据 - 没有重新计算的价格。
有人问题在哪里?任何想法将不胜感激!
答案 0 :(得分:2)
由于您无论如何都要对数据进行序列化,因此您需要can first convert collection into an array并将其与数组一起使用:
$tasks->toArray();
在这种情况下,您可以覆盖原始数据,因为您已尝试使用foreach
循环完成。
作为替代方案,您可以create a mutator将calculated_price
属性添加到集合中。
答案 1 :(得分:1)
您可以使用Eloquent Mutator。
在Task
模型
public function getNewPriceAttribute($value)
{
...// do your processing here
}
然后您可以将其用作:
$task->new_price;
创建访问者后,将属性名称添加到Task
模型上的appends
属性。
protected $appends = ['new_price'];
将属性添加到追加列表后,它将包含在模型的数组和JSON表示中。