如何在 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 中的两个表之间创建一对多关系?

Laravel - 我有一个具有不同角色的用户模型。如何在具有特定角色的用户之间建立关系? [关闭]

我如何在 laravel 中建立深层关系?

记录多对多关系 Laravel 8

如何建立两个excel工作表之间的关系

如何定义来自不同来源的表之间的关系?