【问题标题】:reverse of toJson() - deserialise JSON to modelsJson() 的反向 - 将 JSON 反序列化为模型
【发布时间】:2017-04-13 07:02:53
【问题描述】:

我加载具有关系的模型(如书籍、作者、出版商、关键字),然后以 JSON 格式将其发送到 Web 界面。用户将在那里对其进行编辑,然后界面会将其作为 JSON 发送回。问题是如何从 JSON(与 toJson() 调用相反)创建模型,然后将其保存到数据库中。如果我可以将原始数据(再次从数据库重新加载)与我从 Web 层收到的数据进行比较,那也会很有帮助。

【问题讨论】:

    标签: json laravel eloquent


    【解决方案1】:

    您可以在服务器接收到 JSON 后对其进行解码:

    $decoded = json_decode( Input::get('json') );
    

    如果您想比较模型,一个选项是从解码的 JSON 中获取模型的 ID(确保您仔细检查用户是否可以访问它,以防他们试图在您身上捏造数据),循环访问您的密钥解码数据的 /values 并将它们相互匹配。

    $model = YourModel::find( $decoded->id ); // dont forget to ensure they have access to this model
    
    // Set up an empty array to store anything that's changed
    $changes = array();
    
    // Loop over your decoded values
    foreach( $decoded as $key => $value ) {
    
        // If the value in your model doesn't match the decoded value, add to the changes array
        if( $model->{$key} != $value ) {
            $changes[$key] = $value;
        }
    }
    

    【讨论】:

    • 谢谢,这有帮助,但我猜只适用于平面模型。我的模型有关系,据我所知,如果我在加载它后更改服务器端,我可以对其执行 ->save() 。现在这就是我想要对通过网络接收的模型(及其关系)进行的处理。所以关键问题在这里,我如何从 JSON 创建一个模型(有关系)。
    • 你可以通过 YourModel::find( $model_id) )->with('relationship')->toJson() 来传递你的模型。如果您想随时检查父模型和子模型的更改,只需检查解码的 JSON 对象的格式,并使用与答案中类似的键/值检查循环遍历其关系。
    • 在这种情况下,我可能会使用上述逻辑创建一个检查方法,该方法返回给定两个对象或数组的更改值数组,并将其重用于父模型和任何其他相关模型的属性.
    【解决方案2】:

    您可以使用collect(json_decode($json)) 将其转换为collection

    collection Docs

    【讨论】:

    • 我需要将其转换为可以保存的具有关系的模型。收藏会对此有所帮助吗?
    猜你喜欢
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多