我想在 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/