Laravel 中的模型关联 (一)

一对一关联

一对一关联是最基本的关联关系。主要有以下两种实现方式

  • hasOne()
  • belongsTo()

1. hasOne() 使用

例如,一个 User 模型可能关联一个 Phone 模型。为了定义这个关联,我们要在 User 模型中写一个 phone 方法,在 phone 方法内部调用 hasOne 方法并返回其结果:



namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 获得与用户关联的电话记录。
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

其实很好理解, hasOne 字面意思就是有一个,一个用户有一个手机号(这里不考虑一个用户有多个手机号的情况?)

hasOne 方法的第一个参数是关联模型的类名(这里是 User 模型关联 Phone 模型)。关联关系定义好后,我们就可以使用 Eloquent 动态属性获得相关的记录。您可以像在访问模型中定义的属性一样,使用动态属性:

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

注意这里的 phone 是没有括号的.不要写成 phone()

Eloquent 会基于父级模型名决定外键名称。在当前场景中,Eloquent 假设 Phone 模型有一个 user_id 外键(这里的 user 就是父级模型 User),如果外键名不是这个,可以通过给 hasOne 方法传递第二个参数覆盖默认使用的外键名:

return $this->hasOne('App\Phone', 'foreign_key');

此外,Eloquent 假定外键值是与父级模型 id(或自定义 $primaryKey)列的值相匹配的。 换句话说,Eloquent 将在 Phone 记录的 user_id 列中查找与用户表的 id 列相匹配的值。 如果您希望该关联使用 id 以外的自定义键名,则可以给 hasOne 方法传递第三个参数:

return $this->hasOne('App\Phone', 'foreign_key', 'local_key');

这里的**父级模型 id**指的就是 User 模型,当然也很好理解,因为 hasOne() 方法时 User 模型类中的一个方法,User 模型相对于 hasOne() 方法当然就是所谓的父级了.

2. belongsTo() 使用

belongsTo 官方文档把它叫做定义反相关联,其实也很容易 belong to 的英文就是属于的意思,手机号当然是 属于用户的啦。

刚才已经能从 User 模型访问到 Phone 模型了。现在,再在 Phone 模型中定义一个关联,此关联能让我们访问到拥有此电话的 User 模型。这时,使用的是与 hasOne 方法对应的 belongsTo 方法:



namespace App;

use Illuminate\Database\Eloquent\Model;

class Phone extends Model
{
    /**
     * 获得拥有此电话的用户。
     */
    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

在上面的例子中,Eloquent 会尝试匹配 Phone 模型上的 user_idUser 模型上的 id。 它是通过检查关系方法的名称并使用 _id 作为后缀名来确定默认外键名称的。 但是,如果 Phone 模型的外键不是 user_id,那么可以将自定义键名作为第二个参数传递给 belongsTo方法:

/**
 * 获得拥有此电话的用户。
 */
public function user()
{
    return $this->belongsTo('App\User', 'foreign_key');
}

如果父级模型没有使用 id 作为主键,或者是希望用不同的字段来连接子级模型,则可以通过给 belongsTo 方法传递第三个参数的形式指定父级数据表的自定义键:

/**
 * 获得拥有此电话的用户。
 */
public function user()
{
    return $this->belongsTo('App\User', 'foreign_key', 'other_key');
}

转自
https://laravel-china.org/docs/laravel/5.5/eloquent-relationships/1333

你可能感兴趣的:(Laravel 中的模型关联 (一))