一对多,在本地创建许多,然后最终批量附加/保存

时间:2018-01-10 19:54:19

标签: laravel laravel-5.5

我使用的是Laravel 5.5.14。

我正在努力学习一对多。我在这里用Laracasts的“标签”视频了解了多对多的关系 - https://laracasts.com/series/laravel-5-fundamentals/episodes/21

然而,对于一对多,它的工作方式不同。

我有两个型号。 TaskMoment。任务有很多时刻:

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)

我想在本地创建所有时刻,然后只有在本地创建所有时刻的情况下才将它们批量附加到任务。

1 个答案:

答案 0 :(得分:2)

您不需要attach(),因为这不是多对多的关系。只需创建任务:

$task = Task::create($request->only('name'));

然后创造时刻:

$task->moments()->create($request->moments[0]);
$task->moments()->create($request->moments[1]);