如何在 Laravel 中使用中间表!如何使用 sync 方法

感谢您的辛勤工作!
我是系统开发部的山田。
这次,我们将解释在 Laravel 中使用中间表时使用的同步方法。
同步方法是什么?
当表关系为多对多时,基本解决方案是使用中间表。
在这种情况下,同步方法可以轻松地对中间表执行注册、更新和删除数据等操作。
让我们来看一些具体示例。
准备工作(餐桌布置)
使用同步方法时,假定存在以下情况:
- 我想将用户与他们的兴趣爱好联系起来,并对他们之间的关系发表评论。
- 一个用户可以有多种爱好
- 一项爱好是由多个用户选择的。
为实现上述目标,假设表格配置如下。
- 一个用户表,用于存储用户的姓名。
| ID | 姓名 |
|---|---|
| 1 | 芋头 |
| 2 | 花子 |
| 3 | 三郎 |
- 一张列出各种爱好名称的表格
| ID | 姓名 |
|---|---|
| 1 | 电影 |
| 2 | YouTube |
| 3 | 学习 |
- 一个中间表(hobby_user 表),表示用户和爱好之间的关系,并允许添加评论。)
| ID | 用户身份 | 爱好ID | 评论 |
|---|---|---|---|
| 1 | 1 | 1 | 我很喜欢它 |
| 2 | 1 | 2 | 我很喜欢它 |
| 3 | 2 | 1 | 我很喜欢它 |
接下来,我们将假设您已在 Laravel 中准备了一个包含上述信息的迁移文件,并将描述的数据插入到 users 和 hobbies 表中。
准备工作(Laravel 模型文件)
要在 Laravel 模型文件中表示多对多关系,请编写以下代码:
// 爱好模型 public function users() { return $this->belongsToMany(User::class); } // 用户模型 public function hobbies() { return $this->belongsToMany(Hobby::class); }
现在我们已经准备好使用同步方法,我们将从这里开始使用它。
同步方法
我们先来注册一些数据。
如果您想将电影(hobby_id:1)添加到太郎(user_id:1)的爱好中,您可以按如下方式操作:
$user = User::find(1); $user->hobbies()->sync(1);

如果您想发表评论或一次性添加多个项目,可以按以下步骤操作。例如,
让我们将 YouTube(hobby_id:2)和学习(hobby_id:3)添加到 taro(user_id:1)的爱好中,并添加一条评论。
$user = User::find(1); $user->hobbies()->sync([ 2 => ['comment' => '我很喜欢'], 3 => ['comment' => '我一般喜欢'], ]);
但是,这里有一点需要注意。
在数据库中
执行时生成的数据库,

将电影(hobby_id:1)添加到太郎(user_id:1)爱好中的数据已丢失。
这是因为同步方法(sync)顾名思义,会将数据状态与指定内容同步。
*sync:同步
使用此同步功能,您可以轻松删除和更新数据。
例如,假设我们将 Taro(id:1)的爱好更改为:
YouTube(hobby_id:2)、学习(hobby_id:3)⇒ 电影(hobby_id:1)、YouTube(hobby_id:2)。
当前数据库如下:

如果您运行以下代码:
$user = User::find(1); $user->hobbies()->sync([1,2]);
结果如下:

通常情况下,你会删除“学习”(hobby_id:3)并添加“电影”(hobby_id:1),但使用同步方法,你可以一次性完成这些操作。
此外,你需要注意的是id=2部分。
虽然这次没有指定注释,但它们保持不变。
这是因为同步的内容仅是指定的user_id和hobby_id之间的关系,而hobby_id=2不需要更改,因此记录保持不变,既不会被更新也不会被删除。
同步方法的应用
我们解释过 sync 方法是一种同步方法,但实际上也可以在不进行同步的情况下注册。要
做到这一点,只需将第二个参数声明为 false 即可。
继续之前的表格,让我们将学习(hobby_id:3)添加到太郎(id:1)的爱好列表中。
$user = User::find(1); $user->hobbies()->sync(3, false);

通过将第二个参数指定为 false,现有电影(hobby_id:1)和 YouTube(hobby_id:2)不会被删除,学习(hobby_id:3)也成功添加。
但是,很容易忘记指定 false,如果不指定,则存在意外删除数据的风险。
因此,可以通过指定 syncWithoutDetaching 方法而不是指定 false 来达到同样的效果。
$user = User::find(1); $user->hobbies()->syncWithoutDetaching(3);
概括
这次我们介绍了 sync 方法,它在 Laravel 中注册、更新或删除中间表时非常有用。
只要理解同步的本质,我认为它非常容易使用。
此外,最后介绍的 syncWithoutDetaching 方法只是在 Laravel 内部将 sync 方法的参数设置为 false 并执行,但
有这样一个方法可以避免粗心大意的错误,因此非常方便。
让我们一起掌握同步方法,享受每天编程的乐趣
吧!
最后
我开设了我所属的系统开发服务网站“SEKARAKU Lab”。
Beyond是从服务器设计搭建到运营的一站式服务,所以如果您在服务器端开发方面遇到任何问题,请随时联系我们。
SEKARAKU 实验室: https://sekarakulab.beyondjapan.com/
5