iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
1
Software Development

30天完成家庭任務平台系列 第 8

30天完成家庭任務平台:第八天

  • 分享至 

  • xImage
  •  

今天要先來討論Eloquent最直覺易懂的關係One To One/ One To Many/ Many To Many。

  1. 一對一的關係時(One To One):

    • Model關係定義:
    Model 擁有 Model 屬於

    User|hasOne|Profile|belongsTo

    • 程式碼
        class User extends Model
    {
    public function profile()
      {
          return $this->hasOne('App\Profile');
      }
    ...
    }
    
        class Profile extends Model
    {
    protected $fillable=['user_id','avatar'];
     public function user()
    {
        return $this->belongsTo('App\User');
    }
    ...
    }
    
    • 參數設定
      在hasOne與belongsTo方法中需要指定關聯的Model,其他參數都有預設值,如果設定的欄位名稱與預設值不同時,則需要填入參數值推翻預設。Profile和User間用預設值,因此並沒有額外填入其他參數值,但是Project和User是使用owner_id作為外鍵時,會需要另外設定。
      $this->belongsTo($model,$foreign_key,$owner_key);
      $this->hasOne($model,$foreign_key,$localkey);
    參數 預設

    foreign_key| ($model_name)_id =>user_id
    owner_key/local_key|id

  2. 一對多的關係時(One To Many):

    • Model關係定義:
    Model 擁有 Model 屬於

    User|hasMany|Project|belongsTo

    • 程式碼
        class User extends Model
    {
    public function profile()
      {
          return $this->hasMany('App\Project');
      }
    ...
    }
    
        class Project extends Model
    {
      public function owner()
      {
          return $this->belongsTo('App\User', 'owner_id');
      }
    }
    
    • 參數設定:與一對一關係相似。
  3. 多對多的關係時(Many To Many):
    之前說過多對多的關係會需要三個資料表,以多個使用者可以被邀請加入多個計畫中為例,會需要users/projects/project_user(預設值)三個資料表。

    • Model關係定義:
    Model 屬於 Model 屬於

    User|belongsToMany|Project|belongsToMany

    • 程式碼
        class User extends Model
    {
          public function invitedProject()
      {
          return $this->belongsToMany('App\Project', 'member_project', 'member_id', 'project_id');
      }
    
    ...
    }
    
        class Project extends Model
    {
    
         public function members()
      {
          return $this->belongsToMany('App\User','member_project','project_id','member_id');
      }
    }
    
    • 參數設定:
    參數 預設

    $intermediate_table_name|($model_name1)_($model_name2)=>’project_user’(照字母順序)
    $(self_model_name)_id |在User(Model)中規定時,($model_name1)_id =>user_id
    $(other_model_name)_id|另一個外鍵Project(Model),($model_name2)_id =>project_id

    • 中間資料表(intermediate table)
      由於多對多的關係會多產生一個中間資料表(intermediate table),因此Eloquent提供了方法可以利用中間資料表。

    PS:
    我一開始有點搞不清楚$user->projects()和$user->projects差別,常常會弄錯要不要加(),基本上透過Laravel提供的 php artisan tinker 和之前提過的dd(),則可以看出兩者間的差別:

    指令 傳回的型態 篩選的方法

    $user->projects| Illuminate\Database\Eloquent\Collection|用Collection所提供的方法
    $user->projects()|Illuminate\Database\Eloquent\Relations\HasMany|使用Query Builder所提供的方法

    參考文件:
    Eloquent Relationship


上一篇
30天完成家庭任務平台:第七天
下一篇
30天完成家庭任務平台:第九天
系列文
30天完成家庭任務平台30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言