【问题标题】:How can I make a relation between tables in Laravel?如何在 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() 等..

【问题讨论】:

    标签: php mysql laravel join


    【解决方案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 中给出的示例就说明了这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 2023-03-18
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      相关资源
      最近更新 更多