laravel 模型中的一對一,一對多,多對多的關聯


一對一

一對一關聯是一個非常簡單的關聯關系,例如,一個 User 模型有一個與之關聯的 Phone 模型,一個人對應一個手機,一個手機對應一個人!

user表:id,user_name;

phone表:id,phone_name,user_id;

主表:user表,從表:phone表;

正向關聯

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 關聯關系相對的關聯:

反向關聯:belongTo

    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     

一對多

一個博客文章有多個評論,一個評論只屬於某一個文章

博客文章 post:id,title,author,content,

評論:comment:id,post_id,

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”角色。要定義這樣的關聯關系,需要三張數據表:usersroles 和 role_userrole_user 表按照關聯模型名的字母順序命名,並且包含 user_id 和 role_id 兩個列。

多對多關聯通過編寫調用 belongsToMany 方法返回結果的方式來定義,例如,我們在 User 模型上定義 roles 方法:

users表:id,......;

roles表:id,.....;

role_user表:user_idrole_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();

接着你就可以使用得到的數據了!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM