一對一關聯是一個很是簡單的關聯關係,例如,一個 User
模型有一個與之關聯的 Phone
模型,一我的對應一個手機,一個手機對應一我的!php
user表:id,user_name;數據庫
phone表:id,phone_name,user_id;數組
主表:user表,從表:phone表;閉包
正向關聯post
return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
1 <?php 2 3 namespace App; 4 5 use Illuminate\Database\Eloquent\Model; 6 7 class User extends Model{ 8 /** 9 * 獲取關聯到用戶的手機 10 */ 11 public function phone() 12 { 13 return $this->hasOne('App\Phone', 'user_id', 'id'); 14 } 15 } 16
咱們能夠從 User
中訪問 Phone
模型,相應地,也能夠在 Phone
模型中定義關聯關係從而讓咱們能夠擁有該手機的 User
。咱們可使用 belongsTo
方法定義與 hasOne
關聯關係相對的關聯:this
反向關聯:belongTospa
return $this->belongsTo('App\User', 'foreign_key', 'other_key');
1 <?php 2 3 namespace App; 4 5 use Illuminate\Database\Eloquent\Model; 6 7 class Phone extends Model{ 8 /** 9 * 獲取擁有該手機的用戶 10 */ 11 public function user() 12 { 13 return $this->belongsTo('App\User', 'user_id', 'id'); 14 } 15 } 16
一個博客文章有多個評論,一個評論只屬於某一個文章code
博客文章 post:id,title,author,content,對象
評論:comment:id,post_id,blog
return $this->hasMany('App\Comment', 'foreign_key', 'local_key');
return $this->belongsTo('App\Post', 'foreign_key', 'other_key');
1 <?php 2 3 namespace App; 4 5 use Illuminate\Database\Eloquent\Model; 6 7 class Post extends Model{ 8 /** 9 * 獲取博客文章的評論 10 */ 11 public function comments() 12 { 13 return $this->hasMany('App\Comment', 'post_id', 'id'); 14 } 15 }
1 <?php 2 3 namespace App; 4 5 use Illuminate\Database\Eloquent\Model; 6 7 class Comment extends Model{ 8 /** 9 * 獲取評論對應的博客文章 10 */ 11 public function post() 12 { 13 return $this->belongsTo('App\Post', 'post_id', 'id'); 14 } 15 }
withDefault?這個是啥玩意?幹嗎用的?
在 Laravel 5.4 中新增長的一個方法
在實際的過程當中,有可能會出現這種狀況,某個用戶刪除了,可是這個用戶對應的Phone記錄沒有刪除,或者某個文章刪除了,可是這個文章對應的評論沒有刪除,當咱們用Phone Model查詢用戶的時候,或者用評論查詢文章的時候,(用belongTo查詢的),就會返回一個null值,有時候這個null值會引起一些問題,如今有點頭緒了吧?withDefault()應運而生。
1 /** 2 * 獲取文章做者 3 */ 4 public function user() 5 { 6 return $this->belongsTo('App\User')->withDefault(); 7 }
這種狀況下,withDefault
會返回一個 User Model 實例,從而避免了 null
引起的問題。withDefault
方法還支持接收參數, 爲生成的實例對象填充數據,參數類型能夠是數組或者閉包。
return $this->belongsTo(User::class)->withDefault([ 'name' => '我是xzj', ]); return $this->belongsTo(User::class)->withDefault(function ($user) { $user->name = '我是xzj'; });
多對多關聯比 hasOne
和 hasMany
關聯關係要稍微複雜一些。這種關聯關係的一個例子就是在權限管理中,一個用戶可能有多個角色,同時一個角色可能被多個用戶共用。例如,不少用戶可能都有一個「Admin」角色。要定義這樣的關聯關係,須要三張數據表:users
、roles
和 role_user
,role_user
表按照關聯模型名的字母順序命名,而且包含 user_id
和 role_id
兩個列。
多對多關聯經過編寫調用 belongsToMany
方法返回結果的方式來定義,例如,咱們在 User
模型上定義 roles
方法:
users表:id,......;
roles表:id,.....;
role_user表:user_id,role_id
1 <?php 2 3 namespace App; 4 5 use Illuminate\Database\Eloquent\Model; 6 7 class User extends Model{ 8 /** 9 * 用戶角色 10 */ 11 public function roles() 12 { 13 //這裏要注意,Role前必須加APP\,還有就是第二個參數是表名,數據庫裏那個表叫啥,他就叫啥,第三個參數是本類的字段,第四個參數是要查找的字段 14 return $this->belongsToMany('App\Role','role_user','user_id','role_id'); 15 } 16 }
$userinfo = $user->find($id);
$return_data = $userinfo->with('roles')->get();
$return_data = $userinfo->roles()->get();
接着你就可使用獲得的數據了!