Laravel 一对多,使用多个本地创建,然后最终批量附加/保存

Laravel 一对多,使用多个本地创建,然后最终批量附加/保存,laravel,laravel-5.5,Laravel,Laravel 5.5,我使用的是Laravel 5.5.14 我正在努力学习一对多。我从Laracasts这里学到了“标签”视频的多对多关系- 然而,一对多的情况却不一样 我有两个模型任务和时刻。任务有很多时刻: Moment.php: public function message() { // one-to-many hasMany belongsTo return $this->belongsTo('App\Task'); } Task.php: public function mome

我使用的是Laravel 5.5.14

我正在努力学习一对多。我从Laracasts这里学到了“标签”视频的多对多关系-

然而,一对多的情况却不一样

我有两个模型<代码>任务和
时刻
。任务有很多时刻:

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有效负载,其中
是如下所示的数组:

POST api/messages/1

{
    "name": "A task name here",
    "moments": [
        { "hour":3, "minute":30 },
        { "hour":9, "minute":30 }
    ]
}
所以在我的存储函数中,我想做这个psedoo代码,可能吗

$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)

我想在本地创建所有时刻,然后仅当所有时刻都在本地成功创建时才将它们批量附加到任务。

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

$task = Task::create($request->only('name'));
然后创造时刻:

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

哦,哇,太有趣了,先生。谢谢你。为什么使用
->create
而不是
new Xxx(
->create
在本地执行,并且只有在最终的
->save
时才会将内容放入数据库?@Blagoh
create
将创建一个对象并保存它。对于相同的功能,它的语法更具可读性和简洁性。非常感谢亚历克西,我现在正在处理这个问题。我还有一分钟的时间可以使用它e来接受你的答案。@Blagoh是的,确实如此。但无论如何,你都应该在创建这些对象之前验证输入数据。你也可以使用,但如果你想正确执行,请在使用模型之前验证输入数据。@Blagoh你真的根本不需要它。)没有任何好的方法可以做到这一点,也没有人可以做到这一点。关于验证,使用(
请求
类验证)验证来自表单、AJAX请求等的输入数据。