Laravel 8 遠程一對多關聯(lián)

2021-07-19 11:35 更新

遠程「一對多」關聯(lián)提供了方便、簡短的方式通過中間的關聯(lián)來獲得遠層的關聯(lián)。例如,一個 Country 模型可以通過中間的 User 模型獲得多個 Post 模型。在這個例子中,你可以輕易地收集給定國家的所有博客文章。讓我們來看看定義這種關聯(lián)所需的數據表:

countries
    id - integer
    name - string

users
    id - integer
    country_id - integer
    name - string

posts
    id - integer
    user_id - integer
    title - string 

雖然 posts 表中不包含 country_id 字段,但 hasManyThrough 關聯(lián)能讓我們通過 $country->posts 訪問到一個國家下所有的用戶文章。為了完成這個查詢,Eloquent 會先檢查中間表 userscountry_id 字段,找到所有匹配的用戶 ID 后,使用這些 ID,在 posts 表中完成查找。

現在,我們已經知道了定義這種關聯(lián)所需的數據表結構,接下來,讓我們在 Country 模型中定義它:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Country extends Model
{
    /**
     * 當前國家所有文章
     */
    public function posts()
    {
        return $this->hasManyThrough('App\Models\Post', 'App\Models\User');
    }
} 

hasManyThrough 方法的第一個參數是我們最終希望訪問的模型名稱,而第二個參數是中間模型的名稱。

當執(zhí)行關聯(lián)查詢時,通常會使用 Eloquent 約定的外鍵名。如果你想要自定義關聯(lián)的鍵,可以通過給 hasManyThrough 方法傳遞第三個和第四個參數實現,第三個參數表示中間模型的外鍵名,第四個參數表示最終模型的外鍵名。第五個參數表示本地鍵名,而第六個參數表示中間模型的本地鍵名:

class Country extends Model
{
    public function posts()
    {
        return $this->hasManyThrough(
            'App\Models\Post',
            'App\Models\User',
            'country_id', // 國家表外鍵...
            'user_id', // 用戶表外鍵...
            'id', // 國家表本地鍵...
            'id' // 用戶表本地鍵...
        );
    }
} 
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號