Laravel 8 远程一对一
远程一对一关联通过一个中间关联模型实现。
例如,一个车辆维修应用中,每个修理工「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' // 汽车表本地键...
);
}
}