我使用的是Laravel 5.5.14。
我正在努力学习一对多。我在这里用Laracasts的“标签”视频了解了多对多的关系 - https://laracasts.com/series/laravel-5-fundamentals/episodes/21
然而,对于一对多,它的工作方式不同。
我有两个型号。 Task
和Moment
。任务有很多时刻:
Moment.php:
public function message()
{
// one-to-many hasMany belongsTo
return $this->belongsTo('App\Task');
}
Task.php:
public function moments()
{
// one-to-many hasMany belongsTo
return $this->hasMany('App\Moment');
}
在我的“任务存储”功能中,我已将其设置为接收有效负载json有效负载,其中moments
是这样的数组:
POST api/messages/1
{
"name": "A task name here",
"moments": [
{ "hour":3, "minute":30 },
{ "hour":9, "minute":30 }
]
}
所以在我的商店功能中我想做这个pseduo代码,有可能吗?
$task = new Task($request->only('name')) // create a local task and give it the name
// i should make this a foreach but for demo purposes its manual
$moment1 = new Moment($request->moments[0]); // should run Moment validations and json abort if validation fails (for exampple: if minute field was missing)
$moment2 = new Moment($request->moments[2]);
$task->moments()->localAttach($moment1, $moment2);
$task->save(); // commit it all to database (give the moments and task id's and timestamp's)
我想在本地创建所有时刻,然后只有在本地创建所有时刻的情况下才将它们批量附加到任务。
答案 0 :(得分:2)
您不需要attach()
,因为这不是多对多的关系。只需创建任务:
$task = Task::create($request->only('name'));
然后创造时刻:
$task->moments()->create($request->moments[0]);
$task->moments()->create($request->moments[1]);