阅读(2144) (10)

Laravel 8 远程一对一

2021-07-08 09:15:54 更新

远程一对一关联通过一个中间关联模型实现。

例如,一个车辆维修应用中,每个修理工「Mechanic」负责一辆汽车「Car」, 并且每辆汽车「Car」属于一个车主「Owner」。虽然修理工「Mechanic」和车主「Owner」没有直接联系,但是修理工「Mechanic」可以通过汽车「Car」本身对应车主「Owner」。让我们看一下定义此关系所需的表:

mechanics
    id - integer
    name - string

cars
    id - integer
    model - string
    mechanic_id - integer

owners
    id - integer
    name - string
    car_id - integer 

现在,我们已经确定了表的关系结构,让我们在 Mechanic 模型上定义关系:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Mechanic extends Model
{
    /**
     * 获取车主信息
     */
    public function carOwner()
    {
        return $this->hasOneThrough('App\Models\Owner', 'App\Models\Car');
    }
} 

传递给 hasOneThrough 方法的第一个参数是我们希望访问的最终模型的名称,而第二个参数是中间模型的名称。

执行关联关系查询时,将使用典型的 eloquent 外键约定。如果您想自定义关系的键,可以将它们作为 hasOneThrough 方法的第三个和第四个参数传递。第三个参数是中间模型上外键的名称。第四个参数是最终模型上外键的名称。第五个参数是本地键,而第六个参数是中间模型的本地键:

class Mechanic extends Model
{
    /**
     * 获取车主信息
     */
    public function carOwner()
    {
        return $this->hasOneThrough(
            'App\Models\Owner',
            'App\Models\Car',
            'mechanic_id', // 汽车表外键...
            'car_id', // 车主表外键...
            'id', // 修理工表本地键...
            'id' // 汽车表本地键...
        );
    }
}