[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

我想在 Laravel 中使用中间表! 如何使用同步方法

感谢您的辛勤工作!
我是系统开发部的山田。

这次,我将解释一下 Laravel 中使用中间表时使用的同步方法。

同步方法是什么?

如果表关系是多对多,我认为解决方案基本上是使用中间表。
那时,它就是一个优秀的工具,可以让你轻松地使用sync方法对中间表中的数据进行注册、更新、删除等操作。
让我们看一些具体的例子。

准备工作(表配置)

使用同步方法时,假设以下情况。

  • 我想链接用户和爱好并为这种关系添加评论。
  • 一个用户可以有多种爱好
  • 一种爱好可以由多个用户选择。

实现上述目的的表配置假设如下。

  • 保存用户名称的 users 表
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); }

现在我们已经准备好使用sync方法了,我们从现在开始就使用它。

同步方法

首先,我想注册数据。
如果要将电影(hobby_id:1)添加到太郎(user_id:1)的爱好中,可以如下表达。

$user = User::find(1); $user->爱好()->sync(1);

如果您想同时发表评论或多次注册,可以如下表达。
假设 taro (user_id:1) 将 youtube (hobby_id:2) 和 Study (hobby_id:3) 添加到他的爱好中,并且还将包含评论。

$user = User::find(1); $user->hobbies()->sync([ 2 => ['comment' => '我很喜欢'], 3 => ['comment' => '我非常喜欢' '],]);

然而,这里有一个警告。
将电影 (hobby_id:1) 添加到 taro (user_id:1) hobbies 的 DB 上
执行此代码时的 DB

向太郎(user_id:1)的爱好添加电影(hobby_id:1)的数据已经消失。
这是因为sync方法,顾名思义,就是同步指定数据状态的方法。
*sync:同步

通过利用这种同步特性,可以轻松删除和更新数据。
考虑将 taro(id:1) 的爱好更改为以下内容。
youtube(hobby_id:2)、学习(hobby_id:3)⇒电影(hobby_id:1)、youtube(hobby_id:2)

当前的DB如下。

如果您运行下面的代码

$user = User::find(1); $user->爱好()->sync([1,2]);

结果如下。

通常情况下,我会删除学习 (hobby_id:3),然后添加电影 (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方法只执行Laravel内部指定的sync方法,但
通过这样的方法,你可以防止意外错误,这是一个非常易于使用的方法。

让我们都掌握同步方法,享受每天编码的乐趣吧!
那么好吧! !

最后

我开设了我所属的系统开发服务网站“SEKARAKU Lab”。
Beyond是从服务器设计搭建到运营的一站式服务,所以如果您在服务器端开发方面遇到任何问题,请随时联系我们。
SEKARAKU 实验室: https://sekarakulab.beyondjapan.com/

如果您觉得这篇文章有帮助,请点赞!
5
加载中...
5 票,平均:1.00 / 15
12,223
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[大阪/横滨] 积极招募基础设施工程师和服务器端工程师!

[大阪/横滨] 积极招募基础设施工程师和服务器端工程师!

写这篇文章的人

关于作者

山田由纪

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