詳細解析Laravel Model模型關聯

2022-05-26 14:02:00
本篇文章給大家帶來了關於的相關知識,其中主要介紹了關於Model模型關聯的相關問題,包括了一對一、一對多、多對多等內容,下面一起來看一下,希望對大家有幫助。

【相關推薦:】

定義關聯關係

資料庫表通常相互關聯。
例如,一篇部落格文章可能有許多評論,或者一個訂單對應一個下單使用者。Eloquent 讓這些關聯的管理和使用變得簡單,並支援多種型別的關聯:常見的為前三種,在此我們也只講解前三種關聯

  • 一對一
  • 一對多
  • 多對多
  • 遠端一對多
  • 遠端一對一
  • 一對一(多型關聯)
  • 一對多(多型關聯)
  • 多對多

建立模型關聯

一對一

範例:
兩個資料表:guest 使用者表和guestinfo使用者資訊
其中guest表中的主鍵id欄位對應著guestinfo中的外來鍵user_id欄位
首先建立兩個model檔案:
php artisan make:model Guest
php artisan make:model Guestinfo
Guest model檔案:

class Guest extends Model{
    use HasFactory;
    // 設定Guest模型對應的資料表
    protected $table = 'guest';
    // 關閉create_time和update_time欄位自動管理
    public $timestamps = false;
    // 設定與guestinfo的關聯方法,方法名建議使用被關聯表的名字
    public function guestinfo(){
    // hasOne(被關聯的名命空間,關聯外來鍵,關聯的主鍵)
        return $this->hasOne('App\Models\Guestinfo','user_id','id');
    }}

Guestinfo model檔案:

class Guestinfo extends Model{
    use HasFactory;
    // 設定Guest模型對應的資料表
    protected $table = 'guestinfo';
    // 關閉create_time和update_time欄位自動管理
    public $timestamps = false;
    // 設定與guestinfo的關聯方法,方法名建議使用被關聯表的名字
    public function guest(){
    // hasOne(被關聯的名命空間,關聯外來鍵,關聯的主鍵)
        return $this->belongsTo('App\Models\Guest','user_id','id');
    }}

建立一個控制器將兩個model檔案連線起來:
php artisan make:controller Controllers
內容:

class Controllers extends Controller{
    //
    public function getOne(){
    // 通過關聯方法獲取guest表中username = admin記錄在guestinfo對應的記錄
    // ->guestinfo 是Guest模型檔案裡面定義的guestinfo方法
        $guestInfo = Guest::firstWhere('username','admin')->guestinfo;
	// 通過關聯方法獲取guestinfo中id=3 記錄在guest表中的對應記錄
        $data = Guestinfo::find(3)->guest;
        
        dump($guestInfo);
        // 將模型轉換成陣列
        dump($data->toArray());
    }}

建立控制器的路由:
Route::get('relative/getOne',[Controllers::class,'getOne']);
存取路由:
結果為:
在這裡插入圖片描述

一對多

範例:
兩個資料表:guest 使用者表和article文章表
其中guest表中的主鍵id欄位對應著guestinfo中的外來鍵user_id欄位
建立articlemodel檔案:
php artisan make:model Article

class Article extends Model{
    use HasFactory;
    // 設定Guest模型對應的資料表
    protected $table = 'article';
	// 關閉create_time和update_time欄位自動管理    
    public $timestamps = false;
    public function guest(){
    // 設定與guest的關聯方法,與一對一的從表設定一樣
        return $this->belongsTo('App\Models\April\Guest','user_id','id');
    }}

Guest model檔案中新增一個article 方法

class Guest extends Model{
    use HasFactory;
    // 設定Guest模型對應的資料表
    protected $table = 'guest';
    // 關閉create_time和update_time欄位自動管理
    public $timestamps = false;
    // 設定與guestinfo的關聯方法,方法名建議使用被關聯表的名字
    public function guestinfo(){
    // hasOne(被關聯的名命空間,關聯外來鍵,關聯的主鍵)
        return $this->hasOne('App\Models\Guestinfo','user_id','id');
    }
    // 設定與article的關聯:hasmany 有很多
     public function article(){
        return $this->hasMany('App\Models\April\Article','user_id','id');
    }}

Controllers 控制器檔案中測試一下:
範例1:查詢某一個使用者發表的所有文章:

 		// 查詢某個使用者發表的所有文章
        $article = Guest::find(1)->article;
        // 返回為資料集,需要遍歷
        foreach ($article as $v){
            dump($v->toArray());
        }

在這裡插入圖片描述

範例2:查詢某個使用者最新發表的一篇文章

		// 查詢某個使用者最新發表的一篇文章
        // article()生成一個構造器,可以進行篩選
        $article = Guest::find(1)->article()->orderby('created_at','desc')->first();
        dump($article->toArray());

在這裡插入圖片描述
範例3:通過關聯查詢某篇文章的發表人的姓名

		//  通過article和guest關聯,再通過guest關聯的guestinfo獲取姓名
        $name = Article::find(2)->guest->guestinfo;
        dump($name->name);

範例4:通過關聯查詢某篇文章的評論資訊
建立Comment評論模型:
php artisan make:model Comment
Comment 模型程式碼:

class Comment extends Model{
    use HasFactory;
    // 設定Comment模型對應的資料表
    protected $table = 'comment';
    // 關閉create_time和update_time欄位自動管理
    public $timestamps = false;
    // 設定與article的關聯方法,方法名建議使用被關聯表的名字
    public function article(){
        return $this->belongsTo('App\Models\April\Article','article_id','id');
    }}

在Article模型中新增方法comment:

public function comment(){
        return $this->hasMany('App\Models\April\Comment','article_id','id');
    }

controller控制器程式碼:

$info = Article::find(2)->comment;
        foreach ($info as $v){
            dump($v->toArray());
        }

在這裡插入圖片描述

【相關推薦:】

以上就是詳細解析Laravel Model模型關聯的詳細內容,更多請關注TW511.COM其它相關文章!