Laravel 实战经验分享 - Day27 Eloquent 的关联

今天来补充之前没有提到的 Eloquent 关联绑定,我们在 Day7 的时候曾规划过资料库关联,Day10-Day12 也曾聊过 Eloquent ORM 的一些用法,而资料库的关联模型也可以在 Laravel 用来绑定 Model 物件间的关联。
定义关联关系的时候,预设会自动找你在关联资料表的外键 OOXX_id,但如果你的外键是自行设定的名称,则需覆盖原本写法。

一对一关系

一对一的关系是最单纯的,我们举个例子,一个 user 只有一个帐号,我们就可以在 app\Models\User.php 内这样写。

class User extends Model{
//需有另一个 Model Account 关联至此
    public function account()
    {
        // 三种写法
        // 1. Account 模型对应的资料表要有一个栏位 user_id 纪录外键
        return $this->hasOne('App\Models\Account'); 
        // 2. 外键应该在这边有一个对应的id
        // return $this->hasOne('App\Models\Account', 'user_id');
        // 3. 用 User 模型的 id,对应 Account 的外键
        // return $this->hasOne('App\Models\Account', 'user_id', 'id');
    }
}

因此我们即可透过这个定义的关系查到相对应的模型资料。

$account = User::find(1)->account;

相对的,我们也能够从 Account 反查回 User 表,打开 app/Models/Account.php

class Account extends Model{
    public function user()
    {
        return $this->belongsTo('App\Models\User');
        // return $this->belongsTo('App\Models\User', 'user_id', 'id');
    }
}
$user = Account::find(1)->user;

一对多

一对多,我们以一个主管会有多位部属的关系来举例。

class Manager extends Model {

    public function employees()
    {
        // 同样写法,只是改用 hasMany
        return $this->hasMany('App\Models\Employee');
        // return $this->hasMany('App\Models\Employee', 'manager_id', 'id');
    }
}

透过关联取得资料

$employees = Post::find(1)->employees;

foreach ($employees as $employee) {
//
}

反向查询

class Employee extends Model{

    public function manager()
    {
        return $this->belongsTo('App\Models\Manager');
    }
}
$manager_email = Employee::find(1)->manager->email;

多对多

多对多的关联我们以前几天提到的权限操作为例,一位使用者可以有多种权限,而每一个权限也会有多个使用者,於是我们在两个资料表中间需要再建一张对应表纪录彼此多对多的关联。
可以参考我在 Day24 的文章

class User extends Model{

    public function roles()
    {
        // 说明
        // $this->belongsToMany('欲产生关联的模型', '对应表', '外键 1', '外键 2');
        $this->belongsToMany('App\Models\Role', 'user_roles', 'user_id', 'role_id');
    }
}

取得该使用者的权限。

$roles = User::find(1)->roles();

反向查询

class Role extends Model{

    public function users()
    {
        return $this->belongsToMany('App\User', 'user_roles', 'user_id', 'role_id');
    }
}

在多对多关联中,查询到的资料会多一个 pivot 的属性纪录两个关联间对应的那张表。


以上就是 Eloquent 关联模型简单的例子。
这边建议大家,在实作这个功能前,请先将资料表的关联先建立起来,因为他多一层资料库关联的建立,才不会让你在设定模型关联时没删/误删重要资料,我之前曾 maintain 过没有建资料库关联的专案,他并没有 onDelete = cascade 的设定,Laravel 的程序关联逻辑也有 bug,导致多对多中间的对应表多了一笔不存在的对应关系。
除此之外,在设定两个资料间的关联时,我也建议将外键、主键写在对应的函数(hasOne, hasMany...等)中,才不会有无法关联的状况。


<<:  [Day28] Room | 坑要来了

>>:  个人or团队这回事(上)

Day 27 初学者补给站 学习方向讨论

大家好~~欢迎来到第二十七篇 学习方向讨论 上一篇跟大家说到程序,如何自我学习,找寻方法,今天来讲别...

Day20 - 使用 Hash 实作资料查询

GitHub 网址:https://github.com/ Heroku 网址:https://w...

Day 30 |> 完赛心得

这是第一次铁人赛完赛,很开心可以督促自己连续30天写文章(虽然写的都是些不完整的东西XD) 这 30...

[机派X] Day 10 - 寒酸的无人机介绍

引言 今天是机派X系列文章的第十天。 昨天介绍了关於 Bash 的几个实用案例,也是 Linux 系...

Html基础介绍(DAY2)

首先,我们先接续昨天的,建立一个html的撰写页面,从html开始下手,把一些基本观念先建立好,日後...