阅读(1068) (11)

Laravel 8 一对一

2021-07-07 11:41:17 更新

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

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

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

hasOne 方法的第一个参数是关联模型的类名。一旦定义了模型关联,我们就可以使用 Eloquent 的动态属性获得相关的记录。动态属性允许你访问关联方法就像访问模型中定义的属性一样:

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

Eloquent 会基于模型名决定外键名称。在这种情况下,会自动假设 Phone 模型有一个 user_id 外键。如果你想覆盖这个约定,可以传递第二个参数给 hasOne 方法:

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

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

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