Laravel 學習筆記(8) - Migration 和 Model

Migration & Model

要讓 Model 可以和資料庫溝通,得先把資料庫建起來,有幾個步驟:
  1. app/config/database.php 配置資料庫連線設定
  2. 建立資料庫
  3. 產生資料庫遷移檔
  4. 使用 migrate 指令建立資料表
  5. 建立 Model

步驟 1: 配置資料庫連線設定

你可以參考基本配置及設定的說明,依環境設定不同的配置,這裡為了簡化說明,請直接開啟 app/config/database.php 檔。

我們使用 MySQL 做為資料庫,所以確定 default 的值為 mysql。在之後的 connections 項目中,在 mysql 項,修改 database 的名稱為 blog (或自訂),username、password 請自行設定,通常會是 root。

步驟 2: 建立資料庫

你可以透過 phpMyAdmin 或 Sequel Pro 來建立。資料庫名稱要和前面設定檔的 database 名稱相同。

步驟 3: 產生資料庫遷移檔

通常建好資料庫後,接著就要建立資料表。不過你可以使用 Laravel 來幫你完成這些事。

我們使用 artisan 來產生遷移檔。在終端機中進入網站目錄,輸入:
php artisan migrate:make create_posts_table
如果成功,會產生一個 2014_12_11_081527_create_posts_table.php 的遷移檔。這個檔案會放在 app/database/migrations 目錄下。(前面的日期及數字依每次建立而不同)

開啟它,你會看到它是一個繼承 Migration 的類別,其中只有兩個方法:up() 及 down()。

當你在終端機輸入
php artisan migrate
會執行 up() 方法來建立資料表。而輸入
php artisan migrate:rollback
時,則會執行 down() 來移除這個資料表。所以要把建立資料表的程式寫在 up() 方法裡,而把移除寫在 down() 裡。程式碼如下:
public function up()
{
    Schema::create('posts', function($table){
        $table->increments('id');
        $table->string('title');
        $table->string('content');
        $table->timestamps();
    });
}

public function down()
{
    Schema::drop('posts');
}
Schema 類別可以管理資料表,create 建立,drop 移除。

create 的第一個參數是資料表的名稱 posts。第二參數則是要建立的欄位。

increments 是唯一值的遞增數字,就是主鍵,名稱叫 id。string 在資料表轉換為 VARCHAR 型態,title 及 content 都是欄位名稱。timestamps 是時間戳記,在 Laravel 中預設是開啟的,可以關閉。

整個動作以相同的 SQL 語言來表示如下:
CREATE TABLE `posts` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `content` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
是不是頭很痛呢?你只是寫了幾行程式外加一行指令就完成了這見鬼的SQL碼。

步驟 4: 使用 migrate 指令建立資料表

當你完成遷移檔後,就可以使用指令來建立資料表
php artisan migrate
查看一下資料庫管理程式,你應該可以看到 posts 資料表被建立了。

接著
php artisan migrate:rollback
資料表就消失了。記得再把它建立回來。

步驟 5: 建立 Model

終於可以建立 Model 了。在 Laravel 中,資料庫中的每個資料表都會有一個對應的 Model。

接下來在 app/models 下新增一個 Post.php 檔,內容如下:
<?php

class Post extends Eloquent{

}
Post 類別繼承 Eloquent, 完成!這裡有個要注意的細節。你不用告訴 Eloquent 這個 Model 代表哪個資料表,它會自動將類別名稱以 字母小寫、複數 的名稱來取得對應的資料表,所以 Post 類別對應的資料表會是 posts,這也是為什麼前面我們所建立的資料表會命名為 posts 的原因。

當然,你也可以使用 $table 屬性,特別去指定它的資料表名稱。前面提到的時間戳記也可以在使用 $timestamps 屬性取消。
class Post extends Eloquent{
    protected $table = "posts ";
    public $timestamps = false;
}
如果把 $timestamps 設為 false,記得要把遷移檔中的
$table->timestamps();
刪掉,否則會出現找不到欄位的錯誤。

Model 己經建立完成。我們先來看看怎麼用它。

新增資料

如果要新增一筆文章到 posts 資料表:
$post = new Post;
$post->title = 'Laravel 學習筆記';
$post->content = 'Laravel 是一個 PHP Web 開發框架。';
$post->save();
以上程式碼的等效SQL:
insert into `posts` (title, content) values('Laravel 學習筆記', 'Laravel 是一個 PHP Web 開發框架。')
在 PHP 中,變數名稱由 $ 字號開始,所以 $post 就是用來儲存新產生的 Post Model 物件的變數。

資料表中的每一個欄位都等同於物件的屬性,因此我們給屬性一些資料。最後的 save() 方法會正式執行新增的動作。

刪除資料

$post = Post::find(1);
$post->delete();
等效SQL:
delete from `posts` where id = 1;
find() 方法的參數是 id 的值,通常會由前端送來一個準備要刪除的資料的 id,以這個 id 去找到這列 post,然後 delete() 刪除它。

更新資料

$post = Post::find(1);
$post->content = '修改後的內容';
$post->save();
等效SQL:
update `posts` set content = '修改後的內容' where id = 1;
更新的動作和新增差不多,只是從 new 一個新的 Post 改為以 id 去找到已存在的資料列,針對需要修改的欄位,去更新相對應的屬性,最後 save() 就完成了。

查詢資料

查詢的會複雜一點,依不同需求會有不同的表達方法。

取得整個 posts 資料表

$posts = Post::all();
等效SQL:
select * from `posts`;
all() 會傳回整個 posts 資料表的資料,所以 $posts 中儲存的會是一個陣列集合,而非單一物件。

如果要查詢某一筆資料

Post::where('id','=',1)->get();
等效SQL:
select * from `posts` where id=1;
這行程式碼和 Post::find(1) 類似,但它回傳的是集合(陣列),因為後面用的是 get(),如果要和 find(1) 相同結果,可以這樣寫:
Post::where('id','=',1)->first();
這行只會取第一筆資料,行為如同 find(1)。實際上 find() 就是用來簡化這個動作。

以上就是操作資料庫最常使用的4大行為:Create、Read、Update、Delete (CRUD),現在你已經知道如何和資料庫互動了,之後的範例會真正的使用這些程式碼。
本文網址:http://blog.tonycube.com/2015/01/laravel-8-migration-model.html
Tony Blog 撰寫,轉載時請註明出處及文章連結,謝謝 😀

4 則留言

  1. 抱歉,請教一下,如果今天MySQL上面的表通通都建立完畢了,artisan有辦法直接從MySQL抓欄位到Migration裡嗎?

    回覆刪除
    回覆
    1. 用這個
      https://github.com/Xethron/migrations-generator

      刪除
  2. 請問一下

    新增資料
    $post = new Post;
    $post->title = 'Laravel 學習筆記';
    $post->content = 'Laravel 是一個 PHP Web 開發框架。';
    $post->save();

    是要打在 哪一個 php檔案

    回覆刪除
    回覆
    1. 你可以寫在 controller 裡面,
      可以看這篇 http://blog.tonycube.com/2015/01/laravel-10.html
      整個重頭到尾比較清楚

      刪除

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。