如何在 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
加载中...
5 票,平均:1.00 / 15
13,333
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

山田由纪

2021年加入Beyond Co., Ltd.
我的爱好是卡拉OK和桌
游。我的桌游已经放不下一个架子了,所以我想买一个新的架子,但我很伤心,因为我没有地方放在家里放一个架子。
拥有模具设计和销售经验,积累了丰富的经验,并找到了服务器端工程师的工作。
目前从事使用PHP和Python的服务器端开发。
以后想学习一门前端语言,对基于React的前端框架Next.js很感兴趣。