iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
1
Software Development

後端新手 使用laravel 從零開始 到開出api系列 第 13

Day13 laravel 使用 model 下篇

Day13 laravel 使用 model 下篇

上回我們介紹過最基本的model用法,這次我打算以我的簡易trello專案做例子,講解如何在model中設置關聯資料,這可以讓各個model關聯起來,相當好用。

我們先來回顧一下我的專案table關聯

  1. user以及card為多對多
  2. task以及card為一對多

下面是我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');
    }
}

一對多 one to many

以上面的code為範例,我先介紹一對多的function

    public function ShowTasks()
    {
        return $this->hasMany('App\Task');
    }

我們知道card跟task是一對多的關係。

one card has many task !

所以使用hasMany這個函式,很好記對吧。這樣當我們使用model時呼叫該函式,就可以關聯到task這張table,相當好用

一對多逆關聯 one to many(Inverse)

laravel可以使用逆關聯,以我的例子,task跟card是一對多的關係,而你使用task這個model時,你也可以關聯到card去

    public function ShowCard()
    {
        return $this->belongsTo('App\Card', 'card_id');
    }

後面加的參數是task的關聯用的外鍵(forign key),讓laravel利用他找到關聯的card

多對多關聯 many to many

若要直接關聯多對多的關係,我們可以使用:

    public function ShowUsers()
    {
        return $this->belongsToMany('App\Users', 'groups');
    }

'groups'是Users和Card之間的橋樑,他是為了多對多關聯而建立的,這個前面的章節講過,
多對多由時候會關聯不到,可能是你中間的table外鍵名稱和要關聯的table名稱對不上,laravel可無法自動幫你找到,舉例來說:

  • Users和card是多對多關聯,中間的樞紐是Groups這張表,那Groups的外鍵儘量設成,user_id和card_id,這會使laravel自動幫你找到關聯的資料表

若是laravel真的無法幫你找到關聯的table,這時就要在後面加上幾個參數:

    public function ShowUsers()
    {
        return $this->belongsToMany('App\Users', 'groups', 'card_id', 'users_id');
    }

直接加上Groups表的兩個外鍵名稱即可。

使用model 關聯

若你要測試model,可以再終端機下指令

php artisan tinker

然後你就可以在terminal使用Eloquent語法,直接讀取資料庫
例如:

Users::find(2)->ShowCards;

上面的code會顯示你要找User資料表的id=2欄位,然後使用你在model剛剛設置的關聯,他會回覆你該user以及相關連的card。

Eloquent語法是laravel的ORM語法,可以代替複雜的sql原生語法,這再後面的章節會講到。model設定就講到這邊,明天見!


上一篇
Day12 laravel 使用 model 上篇
下一篇
Day14 laravel Eloquent語法介紹
系列文
後端新手 使用laravel 從零開始 到開出api30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言