要讓 Model 可以和資料庫溝通,得先把資料庫建起來,有幾個步驟:
- app/config/database.php 配置資料庫連線設定
- 建立資料庫
- 產生資料庫遷移檔
- 使用 migrate 指令建立資料表
- 建立 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 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀
由 Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀
抱歉,請教一下,如果今天MySQL上面的表通通都建立完畢了,artisan有辦法直接從MySQL抓欄位到Migration裡嗎?
回覆刪除用這個
刪除https://github.com/Xethron/migrations-generator
請問一下
回覆刪除新增資料
$post = new Post;
$post->title = 'Laravel 學習筆記';
$post->content = 'Laravel 是一個 PHP Web 開發框架。';
$post->save();
是要打在 哪一個 php檔案
你可以寫在 controller 裡面,
刪除可以看這篇 http://blog.tonycube.com/2015/01/laravel-10.html
整個重頭到尾比較清楚