【问题标题】:How to properly json_decode a Laravel Model如何正确 json_decode 一个 Laravel 模型
【发布时间】:2022-01-06 18:55:04
【问题描述】:

在我正在开发的应用程序中,有一个报告功能需要处理一个巨大的报告然后显示它。因此决定报告将由 Job 处理,然后在准备好时呈现。

但是,问题出在此处: 为了在报告准备好后呈现报告,我必须将报告数据存储在数据库中。此数据存储在报告表中称为“值”的字段中。 为了在这个字段中存储所有的报表数据,我使用了 php 的 json_encode() (我知道 laravel 有一个 Model::toJson() 方法,但数据不仅包括模型)。

我存储的数据如下所示:

$data = json_encode([
            'subtitle' => $subtitle,
            'logged_user' => $logged_user,
            'packages' => $packages, //this is the model. I also tried doing $packages->toJson()
            'columns' => $columns,
            'colspan' => $colspan,
            'request' => $request,
        ]);

当我尝试通过 json_decode() 访问数据时,对象变成了数组而不是模型对象; 我试着做

$my_object = new App\Models\MyModel($model_decoded_array)

但是对象的一些属性和关系丢失了(不是全部,去看看)。

所以我在这里有点迷路了。有没有办法可以将我的模型转换为 Json,存储它们,然后将它们恢复到原始状态?

【问题讨论】:

  • laravel.com/docs/8.x/eloquent-serialization 具有将模型转换为数组或 JSON 的所有可用逻辑。另一个选项是 PHP 的 serialize(): php.net/manual/en/function.serialize.phpunserialize(): php.net/manual/en/function.unserialize.php,它们的存在是为了生成对象的“可存储”表示。
  • @TimLewis 序列化和反序列化工作!谢谢你。我会将问题标记为已回答并指向您的评论
  • 太棒了!是的,请随时在下面的部分中添加一个自我回答,并尽可能“接受”它(通过复选标记)(自我回答需要几天时间)。
  • @TimLewis 您也可以将您的评论复制并粘贴到一个答案中,这样您就可以在您的腰带下获得另一个接受的答案,哈哈。如果你当然想要
  • 我通常让提问者有机会展示他们如何将我的评论作为自我回答来实现。就目前而言,我的评论将是一个仅链接的答案,这被认为是 Stackoverflow 的低质量 ????

标签: json laravel serialization eloquent json-deserialization


【解决方案1】:

感谢 @TimLewis 在原始问题的 cmets 中的答案

解决这个问题的方法是在模型存储之前使用 php 的 serialize() 函数,如下所示:

$data = json_encode([
            'subtitle' => $subtitle,
            'logged_user' => $logged_user,
            'packages' => serialize($packages),
            'columns' => $columns,
            'colspan' => $colspan,
            'request' => $request,
        ]);

然后,在尝试再次访问时使用 unserialize():

$values = json_decode($report->values,true); //$report is a model passed to this file from a controller
$packages = unserialize($values['packages']); // values is the field in the db where the json data was stored

【讨论】:

  • 这不是一个理想的解决方案,并且在问题中包含更多调试信息(例如,$packages 是什么,它的 JSON 表示形式是什么样的)可能会帮助你变得更好回答。
猜你喜欢
  • 2018-02-01
  • 1970-01-01
  • 2013-04-05
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
相关资源
最近更新 更多