胎嘎侯~
今天終於進入Many to Many 的關係綁定,先回到Day23-Eloquent: Many to Many (前言:創建多對多資料表,踩坑大全),複習一下實作的例子。
一個user會有多個video的借閱紀錄,而且每個video都與多個用戶有關。
分解Eloquent的多對多關係,多對多皆使用belongsToMany
方法。
昨天建立的測試數據-user資料、video資料及借閱紀錄,現在可以實際派上用場。
把下列資料分別輸入至User.php、Video.php
User.php
public function videos()
{
//每個用戶有數個video的紀錄
return $this->belongsToMany('App\Video')->withPivot('days'); //綁定與Video的關係
}
希望顯示'days'的值,這裡增加withPivot方法定義特定欄位。
Video.php
class Video extends Model
{
protected $fillable = ['name'];
public function users()
{
//video的紀錄屬於多個用戶
return $this->belongsToMany('App\User'); //綁定與User的關係
}
}
php artisan make:controller UserVideoController
記得要在上方引入3個Model名稱哦!
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User;
use App\Video;
use App\UserVideo;
class UserVideoController extends Controller
{
public function index()
{
$records = User::with('videos')->get();
return $records;
}
}
同場加映:Eager Loading
預設情況下的Eloquent是消極式的載入,當我們載入了一個模型實例,與他相關的模型不會被載入,被呼叫才會被載入。如果使用消極式的載入,多對多關係綁定就不是那麼必須,因為多數時間我們會希望能帶出關係載入的模型。使用積極載入with()方法與get函式可以帶出與項目有關的項目。
$records = User::with('videos')->get();
從User模型帶出videos表,使用with方法指定要加載哪些關係,get為取得查詢的所有結果。
Route::get('/records','UserVideoController@index');
進到Postman測試
耶,成功!花了三天的Many to Many 說明終於結束啦~~
明天見