如何在 Laravel 中的表之间建立关系?
Posted
技术标签:
【中文标题】如何在 Laravel 中的表之间建立关系?【英文标题】:How can I make a relation between tables in Laravel? 【发布时间】:2017-07-09 08:38:49 【问题描述】:我有三个这样的表:
// users
+----+-----------+
| id | user_name |
+----+-----------+
| 1 | Jack |
| 2 | Peter |
| 3 | John |
+----+-----------+
// skills
+----+------------+
| id | skill_name |
+----+------------+
| 1 | php |
| 2 | html |
| 3 | Laravel |
| 4 | mysql |
| 5 | jQuery |
+----+------------+
// skill_user
+----------+---------+
| skill_id | user_id |
+----------+---------+
| 2 | 1 |
| 5 | 1 |
| 1 | 2 |
| 2 | 2 |
| 4 | 2 |
+----------+---------+
现在我想获得一个特定用户的所有技能。我可以通过在原始 sql 查询中使用 join
子句来做到这一点:
SELECT s.skill_name
FROM skills s
JOIN skill_user su ON s.id = su.skill_id
WHERE su.user_id = :user_id
/* output (assuming :user_id is 1)
+------------+
| HTML |
| jQuery |
+------------+
好的,一切都好。现在我想知道,如何通过在 Laravel 框架的模型中添加方法来做到这一点?我要做的就是使用belongsTo()
、hasOne()
、hasMany()
等..
【问题讨论】:
【参考方案1】:要以 Eloquent 方式执行,您需要添加关系。在你的情况下,它是多对多的关系,所以在User.php
,添加这个函数来声明关系:
public function skills()
$this->belongsToMany(\App\Skill::class, 'skill_user', 'user_id', 'skill_id');
那么,
像这样访问它以立即加载它:
$users = \App\User::with('skills')->get();
或
假设你只有一个用户,
$user = User::where('id', 1)->first(); // Get the user with id = 1
并获得该用户的技能:
$user->skills;
或
如果不想使用 Eloquent 方式,可以使用Query Builder。请注意,使用此方法,您基本上是手动加入它,因此您不需要向模型添加任何方法:
\DB::table('users')
->join('skill_user', 'skill_user.user_id','=', 'users.id')
->join('skills', 'skill_user.skill_id', '=', 'skills.id')
->select('*')
->where('users.id', 1)
->get();
【讨论】:
谢谢@stack!我使用查询生成器更新了另一种方式。两种方法都取决于您的喜好。【参考方案2】:您必须使用belongsToMany
关系。假设您将为 Skill_user 表创建 SkillUser 模型。将以下代码添加到用户模型中
public function skills()
$this->belongsToMany('App\SkillUser', 'skill_user', 'user_id', 'skill_id');
现在你可以通过
$users->skills();
【讨论】:
public function skills()
应该写在哪个模型中?
用户模型。放在用户模型中【参考方案3】:
我假设您在谈论Many to Many
用户和技能之间的关系,那么Laravel many-to-many 中给出的示例就说明了这一点。
【讨论】:
以上是关于如何在 Laravel 中的表之间建立关系?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 php Laravel 中的两个表之间创建一对多关系?