[Laravel 學習筆記] Eloquent 操作資料庫與 Model Binding 教學

本系列 Laravel 教學筆記將參酌 Laravel 4 From ScratchLaravel 5 From ScratchLaravel  官網和 Laravel 中文官網 相關資訊進行撰寫(以 Laravel 4 From Scratch 為主)。本篇將記錄使用 Eloquent 操作資料庫與 Model Binding 教學。

Eloquent 是 Laravel 的 ORM(物件關聯對映 Object Relational Mapping,簡稱ORM)元件,負責與資料庫溝通,讓我們可以用物件導向的語法操作資料庫。


在上一篇文章我們先使用 Hard Coding 的方式(DB::table())和資料庫互動,現在我們要使用 Eloquent 用更簡潔的方式和資料庫互動,將資料庫的取出,並完成 Model Binding 效果。


在 Laravel 4 中的 app/models 資料夾下新增 Model.php 的檔案,內含 Model class,檔案內容如下(特別需注意的是 namespace 的使用):


<?php namespace App\Models;


use Illuminate\Database\Eloquent\Model as Eloquent;


class Blog extends Eloquent {

  // 先保持空白

}

我們再回到 app/controllers/MainController.php 中設定:

use App\Models\Blog;


class MainController extends \BaseController {


public function show() {
$blogs = Blog::get();
return View::make('blog.index', compact('blogs'));
}

public function showBlog($id) {

$blog = Blog::find($id);
return View::make('blog.blog', compact('blog'));
}
}

是不是發現簡潔許多?此時再打開瀏覽器:http://homestead.app:8000/blog,就可以看到同樣的結果!


接下來我們將在資料庫中加入 slug 這個欄位並進行 Model Bining 的教學。


首先,我們使用 php artisan migrate:rollback drop 掉原來的 table 

並且在 migrate 檔案中新增 $table->string('slug')->unique();
然後重新使用 php artisan migrate 產生 table

此時我們再重新連回 vagrant ssh 虛擬機,使用 php artisan tinker,重新產生測試資料。然而目前我們已經有了 Eloquent Model ,所以可以不用再使用 DB::table('blogs')->insert([]); 方法。可以改用 App\Models\Blog::create([]); 或是 $blog = new App\Models\Blog(); 就可以動態新增屬性:

$blog.title = 'facebook worth billion dollars';
$blog.content = 'Mark is awesome';
$blog.slug = 'facebook-worth-billion-dollars';
$blog->toArray();
$blog->save();

App\Models\Blog::all()->toArray();

App\Models\Blog::all()->toJson();

更改 controller 和 routes 的 id 為 slug,並改為用 slug 擷取資料

$blog = Blog::whereSlug($slug)->first();

 Route::model('blog', 'App\Models');


關於 Model Binding 中文官網更進一步說明:

路由模型綁定

模型綁定提供一個方便的方式將模型實體注入到你的路由中。例如,要注入一個使用者 ID 你可以注入符合給定 ID 的整個使用者模型實體。首先,使用 Route::model 方法可以指定作為參數的模型:

綁定參數至模型

Route::model('user', 'User');
接著,定義一個路由並包括一個 {user} 參數:
Route::get('profile/{user}', function(User $user)
{
    //
});
既然我們綁定了 {user} 參數到 User 模型,則 User 實體就會被注入到路由內。因此,假定有一個請求送至 profile/1 則會注入一個 ID 為 1 的 User 實體。

參考文件:

1. Laravel 中文官網
2. Laravel  官網
3. Laravel 4 From Scratch
4. Laravel 5 From Scratch
5. Using namespaces in Laravel 4
6. 設定 TABLE 之間 ONE TO ONE 的關係
7. Laravel-Eloquent ORM(上)
8. Laravel-Eloquent ORM(下)


贊助本站 (Donate)