Laravel 多对多同步与附加列

Posted

技术标签:

【中文标题】Laravel 多对多同步与附加列【英文标题】:Laravel Many to Many Sync with additional column 【发布时间】:2020-11-10 11:18:05 【问题描述】:

Laravel 7.0 版

我有Team 模型和User 模型,team_has_users 表。

team_has_users 表有 team_iduser_idrole 列。

一个用户可以属于一个具有不同角色的团队。

例如,一个用户可以作为客户和员工属于一个团队。

Team 模型中,我设置了这样的关系。

public function users()
   return $this->belongsToMany(User::class, 'team_has_user', 'team_id', 'user_id')
       ->withPivot('role');

当我将用户附加到团队时,它就像这样运作良好。

    $item->users()->attach($request->clients, ['role'=>'client']);
    $item->users()->attach($request->employees, ['role'=>'employee']);

但是,当我要同步它们时,我做不到。

我试图搜索并找到一个类似的syncwithoutDetaching,但它似乎不适合我的情况。 team_has_users表可以这样。

team_id    user_id    role
1           1         client
1           1         employee
1           2         client
1           1         other
...

谁能帮帮我?

谢谢!

【问题讨论】:

【参考方案1】:

attach 时,您可以在传递时传递一个额外的数组。

$item->users()->attach($request->clients, ['role'=>'client']);
$item->users()->attach($request->employees, ['role'=>'employee']);

但在同步中,您必须在数组中传递枢轴值,我在下面提到了示例。

$item->roles()->sync([1 => ['role' => 'client'], 2 => ['role' => 'employee']);

检查documentation同步部分,

【讨论】:

谢谢,我不能$item->users()->sync($request->clients, ['role'=>'client'] 吗? 要不要单独分割数组? 不,你不能。在同步中,您必须分配枢轴的值。因此你有制作数组。 [$clientid=>['role'=>'client'],[$employeeid=>['role'=>'employee']] 如果$request->clients$request->employees 有一些相同的ID,这不起作用。 这不起作用,因为team_iduser_id 对于clientemployee 是相同的。否则,根据您的问题,这是正确的解决方案。您设计了错误的数据库。用户+角色已经有关系,在你的情况下你做了错误的数据库设计。

以上是关于Laravel 多对多同步与附加列的主要内容,如果未能解决你的问题,请参考以下文章

保存多对多关系,同步/附加不存在?

在事件监听器中同步多对多关系(Laravel 5.7)

laravel 同步多对多关系

Laravel 多列上的多对多同步()

在 laravel 中使用多对多关系同步:PostgreSQL 数据透视表不更新

Laravel 多对多关系在哪里保存项目总数? [关闭]