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

您好!
我是系统开发部的山田。
这次,我们将解释在 Laravel 中使用中间表时使用的同步方法。
同步方法是什么?
当表之间存在多对多关系时,基本解决方案是使用中间表。`sync`
方法非常适合轻松地对中间表执行添加、更新和删除数据等操作。
让我们来看一些具体的例子。
准备工作(餐桌布置)
使用同步方法时,假定存在以下情况:
- 我想将用户与他们的兴趣爱好联系起来,并对他们之间的关系发表评论。
- 一个用户可以有多种爱好
- 一项爱好是由多个用户选择的。
为实现上述目标,假设表格配置如下。
- 一个用户表,用于存储用户的姓名。
| 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)添加到 taro(user_id:1)的爱好列表中,您可以这样写:
$user = User::find(1); $user->hobbies()->sync(1);

如果您想一次性添加评论或注册多个项目,可以按以下步骤操作。
假设 taro(user_id:1)已将 youtube(hobby_id:2)和学习(hobby_id:3)添加到其爱好中,并且还写了一条评论。
$user = User::find(1); $user->hobbies()->sync([ 2 => ['comment' => '我很喜欢'], 3 => ['comment' => '我一般喜欢'], ]);
然而,这里有一点需要注意。
在数据库中执行此代码时,将“movies”(hobby_id:1)添加到前面提到的 taro(user_id:1)的爱好中时所显示的
数据库

指示“电影”(hobby_id:1)已添加到 taro(user_id:1)爱好列表中的数据已消失。
这是因为同步方法(sync)顾名思义,会根据指定的内容同步数据状态。
*sync:同步
利用这种同步特性,可以轻松执行数据删除和更新操作。
例如,考虑将 taro(id:1) 的爱好更改为:
youtube(hobby_id:2), studying(hobby_id:3) ⇒ movies(hobby_id:1), youtube(hobby_id:2)
当前数据库如下:

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

通常情况下,这需要先删除“study”(hobby_id:3),然后再添加“movie”(hobby_id:1),但使用同步方法可以让我们一步完成。
此外,需要注意的是id=2部分的行为。
虽然这次我们没有添加注释,但它仍然保持不变。
这是因为同步操作只会影响指定的user_id和hobby_id之间的关系,而hobby_id=2不需要更改,因此记录不会被更新或删除,而是保持不变。
同步方法的应用
我解释过 `sync` 方法是用于同步的,但实际上也可以在不同步的情况下注册数据。
方法是将第二个参数声明为 `false`。
根据之前的表格,我们将“学习”(hobby_id:3)添加到 taro(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` 方法,其内部实现与 `sync` 方法相同,只是将 `sync` 参数设置为 `false`。但
有了这样一个方法,可以有效避免意外错误,因此非常方便。
让我们一起掌握同步方法,享受每天编程的乐趣吧!
下次见!
最后
我已上线“SEKARAKU Lab”,这是我所属系统开发公司的服务网站。Beyond
提供从服务器设计、搭建到运维的一站式服务,如果您在服务器端开发方面遇到任何问题,欢迎随时联系我们。SEKARAKU
Lab:https://sekarakulab.beyondjapan.com/
6
