溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Laravel Model模型關(guān)聯(lián)怎么建立

發(fā)布時(shí)間:2022-05-26 14:00:20 來源:億速云 閱讀:140 作者:iii 欄目:編程語言

這篇文章主要介紹“Laravel Model模型關(guān)聯(lián)怎么建立”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Laravel Model模型關(guān)聯(lián)怎么建立”文章能幫助大家解決問題。

定義關(guān)聯(lián)關(guān)系

數(shù)據(jù)庫表通常相互關(guān)聯(lián)。
例如,一篇博客文章可能有許多評(píng)論,或者一個(gè)訂單對(duì)應(yīng)一個(gè)下單用戶。Eloquent 讓這些關(guān)聯(lián)的管理和使用變得簡單,并支持多種類型的關(guān)聯(lián):常見的為前三種,在此我們也只講解前三種關(guān)聯(lián)

  • 一對(duì)一

  • 一對(duì)多

  • 多對(duì)多

  • 遠(yuǎn)程一對(duì)多

  • 遠(yuǎn)程一對(duì)一

  • 一對(duì)一(多態(tài)關(guān)聯(lián))

  • 一對(duì)多(多態(tài)關(guān)聯(lián))

  • 多對(duì)多

建立模型關(guān)聯(lián)

一對(duì)一

示例:
兩個(gè)數(shù)據(jù)表:guest 用戶表和guestinfo用戶信息
其中guest表中的主鍵id字段對(duì)應(yīng)著guestinfo中的外鍵user_id字段
首先創(chuàng)建兩個(gè)model文件:
php artisan make:model Guest
php artisan make:model Guestinfo
Guest model文件:

class Guest extends Model{
    use HasFactory;
    // 設(shè)置Guest模型對(duì)應(yīng)的數(shù)據(jù)表
    protected $table = 'guest';
    // 關(guān)閉create_time和update_time字段自動(dòng)管理
    public $timestamps = false;
    // 設(shè)置與guestinfo的關(guān)聯(lián)方法,方法名建議使用被關(guān)聯(lián)表的名字
    public function guestinfo(){
    // hasOne(被關(guān)聯(lián)的名命空間,關(guān)聯(lián)外鍵,關(guān)聯(lián)的主鍵)
        return $this->hasOne('App\Models\Guestinfo','user_id','id');
    }}

Guestinfo model文件:

class Guestinfo extends Model{
    use HasFactory;
    // 設(shè)置Guest模型對(duì)應(yīng)的數(shù)據(jù)表
    protected $table = 'guestinfo';
    // 關(guān)閉create_time和update_time字段自動(dòng)管理
    public $timestamps = false;
    // 設(shè)置與guestinfo的關(guān)聯(lián)方法,方法名建議使用被關(guān)聯(lián)表的名字
    public function guest(){
    // hasOne(被關(guān)聯(lián)的名命空間,關(guān)聯(lián)外鍵,關(guān)聯(lián)的主鍵)
        return $this->belongsTo('App\Models\Guest','user_id','id');
    }}

創(chuàng)建一個(gè)控制器將兩個(gè)model文件連接起來:
php artisan make:controller Controllers
內(nèi)容:

class Controllers extends Controller{
    //
    public function getOne(){
    // 通過關(guān)聯(lián)方法獲取guest表中username = admin記錄在guestinfo對(duì)應(yīng)的記錄
    // ->guestinfo 是Guest模型文件里面定義的guestinfo方法
        $guestInfo = Guest::firstWhere('username','admin')->guestinfo;
	// 通過關(guān)聯(lián)方法獲取guestinfo中id=3 記錄在guest表中的對(duì)應(yīng)記錄
        $data = Guestinfo::find(3)->guest;
        
        dump($guestInfo);
        // 將模型轉(zhuǎn)換成數(shù)組
        dump($data->toArray());
    }}

創(chuàng)建控制器的路由:
Route::get('relative/getOne',[Controllers::class,'getOne']);

一對(duì)多

示例:
兩個(gè)數(shù)據(jù)表:guest 用戶表和article文章表
其中guest表中的主鍵id字段對(duì)應(yīng)著guestinfo中的外鍵user_id字段
創(chuàng)建articlemodel文件:
php artisan make:model Article

class Article extends Model{
    use HasFactory;
    // 設(shè)置Guest模型對(duì)應(yīng)的數(shù)據(jù)表
    protected $table = 'article';
	// 關(guān)閉create_time和update_time字段自動(dòng)管理    
    public $timestamps = false;
    public function guest(){
    // 設(shè)置與guest的關(guān)聯(lián)方法,與一對(duì)一的從表設(shè)置一樣
        return $this->belongsTo('App\Models\April\Guest','user_id','id');
    }}

Guest model文件中添加一個(gè)article 方法

class Guest extends Model{
    use HasFactory;
    // 設(shè)置Guest模型對(duì)應(yīng)的數(shù)據(jù)表
    protected $table = 'guest';
    // 關(guān)閉create_time和update_time字段自動(dòng)管理
    public $timestamps = false;
    // 設(shè)置與guestinfo的關(guān)聯(lián)方法,方法名建議使用被關(guān)聯(lián)表的名字
    public function guestinfo(){
    // hasOne(被關(guān)聯(lián)的名命空間,關(guān)聯(lián)外鍵,關(guān)聯(lián)的主鍵)
        return $this->hasOne('App\Models\Guestinfo','user_id','id');
    }
    // 設(shè)置與article的關(guān)聯(lián):hasmany 有很多
     public function article(){
        return $this->hasMany('App\Models\April\Article','user_id','id');
    }}

Controllers 控制器文件中測(cè)試一下:
實(shí)例1:查詢某一個(gè)用戶發(fā)表的所有文章:

 		// 查詢某個(gè)用戶發(fā)表的所有文章
        $article = Guest::find(1)->article;
        // 返回為數(shù)據(jù)集,需要遍歷
        foreach ($article as $v){
            dump($v->toArray());
        }

實(shí)例2:查詢某個(gè)用戶最新發(fā)表的一篇文章

		// 查詢某個(gè)用戶最新發(fā)表的一篇文章
        // article()生成一個(gè)構(gòu)造器,可以進(jìn)行篩選
        $article = Guest::find(1)->article()->orderby('created_at','desc')->first();
        dump($article->toArray());


實(shí)例3:通過關(guān)聯(lián)查詢某篇文章的發(fā)表人的姓名

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

實(shí)例4:通過關(guān)聯(lián)查詢某篇文章的評(píng)論信息
創(chuàng)建Comment評(píng)論模型:
php artisan make:model Comment
Comment 模型代碼:

class Comment extends Model{
    use HasFactory;
    // 設(shè)置Comment模型對(duì)應(yīng)的數(shù)據(jù)表
    protected $table = 'comment';
    // 關(guān)閉create_time和update_time字段自動(dòng)管理
    public $timestamps = false;
    // 設(shè)置與article的關(guān)聯(lián)方法,方法名建議使用被關(guān)聯(lián)表的名字
    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());
        }

關(guān)于“Laravel Model模型關(guān)聯(lián)怎么建立”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI