[TOC]
### **1、簡介**
[Laravel](http://laravelacademy.org/tags/laravel "View all posts in Laravel")?包含了一個簡單方法來填充[數據庫](http://laravelacademy.org/tags/%e6%95%b0%e6%8d%ae%e5%ba%93 "View all posts in 數據庫")——使用填充類和測試數據。所有的填充類都位于`database/seeds`目錄。填充類的類名完全由你自定義,但最好還是遵循一定的規則,比如可讀性,例如`UserTableSeeder`等等。安裝完 Laravel 后,會默認提供一個`DatabaseSeeder`類。從這個類中,你可以使用`call`方法來運行其他填充類,從而允許你控制填充順序。
### **2、編寫[填充器](http://laravelacademy.org/tags/%e5%a1%ab%e5%85%85%e5%99%a8 "View all posts in 填充器")**
要生成一個填充器,可以通過 Artisan 命令`make:seeder`。所有框架生成的填充器都位于`database/seeders`目錄:
~~~
php artisan make:seeder UserTableSeeder
~~~
一個填充器類默認只包含一個方法:`run`。當Artisan命令`db:seed`運行時該方法被調用。在`run`方法中,可以插入任何你想插入數據庫的數據,你可以使用[查詢構建器](http://laravelacademy.org/post/2956.html)手動插入數據,也可以使用 Eloquent?[模型工廠](http://laravelacademy.org/tags/%e6%a8%a1%e5%9e%8b%e5%b7%a5%e5%8e%82 "View all posts in 模型工廠")。
舉個例子,讓我們修改 Laravel 安裝時自帶的`DatabaseSeeder`類,添加一個數據庫插入語句到`run`方法:
~~~
<?php
use DB;
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class DatabaseSeeder extends Seeder{
/**
* 運行數據庫填充
*
* @return void
*/
public function run()
{
DB::table('users')->insert([
'name' => str_random(10),
'email' => str_random(10).'@gmail.com',
'password' => bcrypt('secret'),
]);
}
}
~~~
#### **使用模型工廠**
當然,手動指定每一個模型填充的屬性是很笨重累贅的,取而代之的,我們可以使用模型工廠來方便的生成大量的數據庫記錄。首先,查看[模型工廠文檔](http://laravelacademy.org/post/238.html#model-factories)來學習如何定義工廠,定義工廠后,可以使用幫助函數`factory`來插入記錄到數據庫。
舉個例子,讓我們創建50個用戶并添加關聯關系到每個用戶:
~~~
/**
* 運行數據庫填充
*
* @return void
*/
public function run(){
factory('App\User', 50)->create()->each(function($u) {
$u->posts()->save(factory('App\Post')->make());
});
}
~~~
#### **調用額外的填充器**
在`DatabaseSeeder`類中,你可以使用`call`方法執行額外的填充類,使用`call`方法允許你將數據庫填充分解成多個文件,這樣單個填充器類就不會變得無比巨大,只需簡單將你想要運行的填充器類名傳遞過去即可:
~~~
/**
*?運行數據庫填充
*
*?@return?void
*/
public?function?run(){
Model::unguard();
$this->call(UserTableSeeder::class);
$this->call(PostsTableSeeder::class);
? ? $this->call(CommentsTableSeeder::class);
? ??Model::reguard();
}
~~~
### **3、運行填充器**
編寫好填充器類之后,可以使用 Artisan 命令`db:seed`來填充數據庫。默認情況下,`db:seed`命令運行可以用來運行其它填充器類的`DatabaseSeeder`類,但是,你也可以使用`--class`?選項來指定你想要運行的獨立的填充器類:
~~~
php artisan db:seed
php artisan db:seed --class=UserTableSeeder
~~~
你還可以使用`migrate:refresh`命令來填充數據庫,該命令還可以回滾并重新運行遷移,這在需要完全重建數據庫時很有用:
~~~
php?artisan?migrate:refresh?--seed
~~~
- 序言
- 發行版本說明
- 升級指南
- 貢獻代碼
- 開始
- 安裝
- 配置
- Laravel Homestead
- 基礎
- HTTP 路由
- HTTP 中間件
- HTTP 控制器
- HTTP 請求
- HTTP 響應
- 視圖
- Blade 模板引擎
- 架構
- 一次請求的生命周期
- 應用目錄結構
- 服務提供者
- 服務容器
- 門面(Facades)
- 數據庫
- 起步
- 查詢構建器
- 遷移
- 填充數據
- Eloquent ORM
- 起步
- 關聯關系
- 集合
- 訪問器&修改器
- 序列化
- 服務
- 用戶認證
- 用戶授權
- Artisan Console
- 訂閱支付實現:Laravel Cashier
- 緩存
- 集合
- 集成前端資源:Laravel Elixir
- 加密
- 錯誤&日志
- 事件
- 文件系統/云存儲
- 哈希
- 輔助函數
- 本地化
- 郵件
- 包開發
- 分頁
- Redis
- 隊列
- Session
- Envoy Task Runner
- 任務調度
- 測試
- 驗證
- 新手入門指南
- 簡單任務管理系統
- 帶用戶功能的任務管理系統