如何在 Eloquent ORM 中从 JSON 中保存具有相关记录的模型

Posted

技术标签:

【中文标题】如何在 Eloquent ORM 中从 JSON 中保存具有相关记录的模型【英文标题】:How to save a model with related records in Eloquent ORM from JSON 【发布时间】:2014-12-02 07:19:03 【问题描述】:

目标

Eloquent 模型 AlumSchool 具有多对多关系。一个校友可以去很多学校,而一所学校可以有很多校友。

使用 Eloquent,我可以像这样检索和输出她的学校的 alum:

$alums = Alum::with('schools')->get();
echo $alums->toJson();

AngularJS 然后在表格中显示校友。每行都有一个编辑按钮,显示一个对话框,其中包含校友可能去过的所有学校的复选框。选中一个框会将该学校添加到 alum 的 schools 数组中,取消选中一个框会删除它。

到目前为止一切顺利。

问题

将数据发布或放回服务器是出错的地方。发送到服务器的 JSON 如下所示:


    "id":1,
    "name":"John Doe",
    "schools": [
        
            "id":1,
            "name":"School A"
        ,
        
            "id":2,
            "name":"School B"
        
    ]

Alum 记录保存,但 Eloquent 不知道如何处理学校数组。

尝试的解决方案

从Laravel's documentation on Inserting Related Models in Eloquent看来,保存相关记录的方法是使用attachattach 需要一个 ID 数组,而不是对象,所以我尝试以下方法:

// Get the IDs of the schools that this user attended
$schoolIds = [];
foreach ($obj->schools as $school) 
    $schoolIds[] = $school->id;


$alum->schools()->attach($schoolIds);
$alum->save();

这行得通;校友和他的学校被保存到数据库中。但随之而来的是一个新问题:当学校未从校友的学校名单中选中时,如何分离学校。我想我可以得到所有学校的 ID,拼接出检查学校数组中的 ID,然后将结果传递给 detach——但我希望有比这更优雅的方法。

从 JSON 中保存记录及其相关记录的最佳方式是什么?

【问题讨论】:

【参考方案1】:

有趣的是,发帖似乎会直接引导您自行寻找解决方案。我在 Eloquent 文档中错过了 sync

sync 方法接受要放置在数据透视表上的 ID 数组。此操作完成后,只有数组中的 ID 会出现在 model[.]

的中间表上

用sync替换attach后,只有选中的学校会保存在alum的学校列表中。

不过,我仍然很好奇是否有更好的方法可以直接从 JSON 中保存相关记录。欢迎提供更多意见。

【讨论】:

以上是关于如何在 Eloquent ORM 中从 JSON 中保存具有相关记录的模型的主要内容,如果未能解决你的问题,请参考以下文章

Angular JS 与 Laravel - 如何绑定 Eloquent ORM 数组以查看

如何在 eloquent ORM 中执行此搜索查询

如何在 Laravel Eloquent ORM 中获取插入的多行数据

laravel Eloquent ORM - 如何获得编译查询?

如何使用 Eloquent ORM 进行多重连接查询

如何在我的 Eloquent ORM laravel 选择中包含一个过程?