如何使用 Eloquent 在数据透视表中插入多行?

Posted

技术标签:

【中文标题】如何使用 Eloquent 在数据透视表中插入多行?【英文标题】:How to insert multiple rows in pivot table using Eloquent? 【发布时间】:2020-01-25 00:04:28 【问题描述】:

我有一个名为user_machine_pivot 的数据透视表,它连接两个表:usermachines,在创建新用户时,我从下拉列表中选择他可以操作的机器。我想要实现的是,当我发出axios.post 请求时,我想使用user_idmachine_id 在数据透视表中插入多行。这是我的用户模型代码:

public function machine()

    return $this->belongsToMany(Machine::class, 'user_machine_pivot')->withTimestamps();

我的axios.post 从 Telescope 请求内容:

full_name: "RandomName",
username: "RandomName",
password: "********",
machines: [
3,
2
]

我的用户控制器:

$user = User::create($validatedUserData);
$user->machine()->attach($user->id, ['machine_id' => $machines]);

首先,我正在验证 UserData 并创建一个用户,然后我尝试将用户附加到数据透视表中的机器上。 任何帮助和指点表示赞赏。

【问题讨论】:

【参考方案1】:
$user->machine()->attach($user->id, ['machine_id' => $machines]);

这是不对的。你已经有$user,并且你想附加一个特定的machine,所以你需要将该id传递给machines()->attach()

$user = User::create($validatedUserData);
$machine = ...; 
// Not sure how you're getting `$machines`, and it should be singular `$machine`

$user->machines()->attach($machine->id, [...]);
// Replace `[...]` with any additional columns.

注意,如果要附加多个,请使用attach()sync()

$user->machines()->attach($machines);
$user->machines()->sync($machines); 

attach() 最好在您附加现有记录时使用,因为 sync()detach() 然后 attach() ids 您正在传递。此外,如果您需要其他列,请将您的 $machines 调整为关联数组:

$machines = [
  1,
  2 => ["additional" => "column"],
  3
]; // Etc. etc.

【讨论】:

谢谢您的详尽回答,先生! 没问题!乐于助人!

以上是关于如何使用 Eloquent 在数据透视表中插入多行?的主要内容,如果未能解决你的问题,请参考以下文章

Eloquent 从数据透视表中获取数据

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

Eloquent Api 资源:显示数据透视表中的一列

Lumen/Laravel Eloquent - 按数据透视表中的属性过滤

多对多关系 - 如何更新数据透视表中的属性

如何在 Laravel 中使用附加或同步方法在数据透视表中插入多个值