Posted in Laravel 5 筆記

Laravel 5 – Eloquent Relationships

https://laracasts.com/series/laravel-5-fundamentals/episodes/14
http://laravel.com/docs/5.0/eloquent#relationships

Eloquent model之間可以把table的關聯關係寫到類別中。影片中舉個例子很好理解,一位user會寫很多篇article,這是one to many個關係,在user model定義這關係,可以把屬於特定user的所有文章撈出來。底下跟影片順序顛倒。

重新定義schema:實體table(users跟articles)尚未定義關聯(foreign key),利用migrations檔案定義並重產生table。

laravel5_eloquent_relationships_1

laravel5_eloquent_relationships_2

依據migration的foreign key定義的外部索引。MySQL的cascade作用laravel5_eloquent_relationships_3

定義models關聯:一對一、一對多、多對多,等等。

//User.php
public function articles() {  //method名稱取什麼都可以, 好辨別就可.
    return $this->hasMany('App\Article');  //hasMany帶的參數是關聯model的名稱
}

//Article.php
public function user() {
    return $this->belongsTo('App\User');  //article屬於一位user
}

新增user跟article:先做資料到users跟articles table,接著再利用上述的關聯讀取資料。

1. 利用tinker新增一位user。
laravel5_eloquent_relationships_4

 2. 使用form新增一筆article。
Article.php的fillable變數增加user_id欄位讓store()可以儲存。
laravel5_eloquent_relationships_5

form.blade.php增加user_id hidden欄位,因為沒有登入機制,所以先用指定的(上頭新增的John Doe)。
laravel5_eloquent_relationships_6

底下是用新的form所insert的article。
laravel5_eloquent_relationships_7

測試model關聯:使用tinker測試User.php與Article.php所定義的關聯。

  1. 查看articles的第一筆資料。
laravel5_eloquent_relationships_8

2. 首先,先實例化id=1的$user物件(first),接著$user->articles,它會返回user_id=1的所有articles的集合。這就是User.php定義public function articles() { …. }。
laravel5_eloquent_relationships_9

//User.php (User類別)
public function articles() {
    return $this->hasMany('App\Article');
}

$user = App\User::first(),產生id=1(Key)的$user物件,至於$user->articles(),laravel怎知道撈什麼?hasMany(‘App\Article’),是要撈articles table,並且是撈foreign key等於1的。至於foreign key怎知道是user_id,laravel預設用model名稱_id,所以是user_id。

 

 

 

 

One thought on “Laravel 5 – Eloquent Relationships

Leave a comment