【问题标题】:Modifying model data before sending response在发送响应之前修改模型数据
【发布时间】:2017-05-03 00:48:24
【问题描述】:

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

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

 $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 并将其作为响应发送时,它包含从数据库中获取的数据 - 没有重新计算价格。

有没有人是哪里出了问题?任何想法将不胜感激!

【问题讨论】:

    标签: laravel eloquent lumen


    【解决方案1】:

    由于您无论如何都在序列化数据,因此您 can first convert collection into an array 并像处理数组一样处理它:

    $tasks->toArray();
    

    在这种情况下,您将能够覆盖原始数据,就像您尝试使用 foreach 循环完成的那样。

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

    【讨论】:

    • 谢谢!我必须在两个正确答案之间进行选择,@Amit Gupta 的答案更完整。我至少给了你投票:-)
    【解决方案2】:

    您可以为此使用Eloquent Mutator

    Task模型中创建如下函数

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

    然后您可以将其用作:

    $task->new_price;
    

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

     protected $appends = ['new_price'];
    

    一旦属性被添加到附加列表中,它将被包含在模型的数组和 JSON 表示中。

    【讨论】:

      猜你喜欢
      • 2022-11-04
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      相关资源
      最近更新 更多