上回我們介紹過最基本的model用法,這次我打算以我的簡易trello專案做例子,講解如何在model中設置關聯資料,這可以讓各個model關聯起來,相當好用。
我們先來回顧一下我的專案table關聯
下面是我card的model
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Card extends Model
{
protected $table = 'card';
public $primaryKey = 'id';
protected $fillable = ['card_name', 'create_user',];
public function ShowGroups()
{
return $this->hasMany('App\Groups');
}
public function ShowTasks()
{
return $this->hasMany('App\Task');
}
public function ShowUsers()
{
return $this->belongsToMany('App\Users', 'groups');
}
}
以上面的code為範例,我先介紹一對多的function
public function ShowTasks()
{
return $this->hasMany('App\Task');
}
我們知道card跟task是一對多的關係。
one card has many task !
所以使用hasMany這個函式,很好記對吧。這樣當我們使用model時呼叫該函式,就可以關聯到task這張table,相當好用
laravel可以使用逆關聯,以我的例子,task跟card是一對多的關係,而你使用task這個model時,你也可以關聯到card去
public function ShowCard()
{
return $this->belongsTo('App\Card', 'card_id');
}
後面加的參數是task的關聯用的外鍵(forign key),讓laravel利用他找到關聯的card
若要直接關聯多對多的關係,我們可以使用:
public function ShowUsers()
{
return $this->belongsToMany('App\Users', 'groups');
}
'groups'是Users和Card之間的橋樑,他是為了多對多關聯而建立的,這個前面的章節講過,
多對多由時候會關聯不到,可能是你中間的table外鍵名稱和要關聯的table名稱對不上,laravel可無法自動幫你找到,舉例來說:
若是laravel真的無法幫你找到關聯的table,這時就要在後面加上幾個參數:
public function ShowUsers()
{
return $this->belongsToMany('App\Users', 'groups', 'card_id', 'users_id');
}
直接加上Groups表的兩個外鍵名稱即可。
若你要測試model,可以再終端機下指令
php artisan tinker
然後你就可以在terminal使用Eloquent語法,直接讀取資料庫
例如:
Users::find(2)->ShowCards;
上面的code會顯示你要找User資料表的id=2欄位,然後使用你在model剛剛設置的關聯,他會回覆你該user以及相關連的card。
Eloquent語法是laravel的ORM語法,可以代替複雜的sql原生語法,這再後面的章節會講到。model設定就講到這邊,明天見!