codecamp

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' // 汽车表本地键...
        );
    }
} 


Laravel 8 带有递增 ID 的自定义中继模型
Laravel 8 远程一对多关联
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Laravel 8 入门指南

Laravel 8 基础功能

Laravel 8 前端开发

Laravel 8 安全相关

Laravel 8 综合话题

数据库

Eloquent ORM

测试相关

官方拓展包

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }