如何在 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 模型 Alum
与 School
具有多对多关系。一个校友可以去很多学校,而一所学校可以有很多校友。
使用 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看来,保存相关记录的方法是使用attach
。 attach
需要一个 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 数组以查看
如何在 Laravel Eloquent ORM 中获取插入的多行数据