要查看代碼,能夠點擊php
或者轉到連接:https://github.com/laravel/frameworklaravel
Laravel自動填充數據使用的是Seeder類git
<?php use Illuminate\Database\Seeder; use Illuminate\Database\Eloquent\Model; class DatabaseSeeder extends Seeder { /** * Run the database seeds. */ public function run() { // } } class MyTableSeeder extends Seeder { public function run() { // } }
你自定義的Seeder只有一個run函數,裏面寫你的自動填充步驟github
你們會注意到這兩個函數bash
Model::unguard(); //你的填充操做 Model::reguard();
曾經對這兩個函數很是疑惑,究竟是幹什麼用的,只能推測是一對互爲副作用的函數。因而去查了下源代碼。函數
在目錄\vendor\laravel\framework\src\Illuminate\Database\Eloquent下的Model.php下定義了這兩個函數this
/** * Disable all mass assignable restrictions. * * @param bool $state * @return void */ public static function unguard($state = true) { static::$unguarded = $state; } /** * Enable the mass assignment restrictions. * * @return void */ public static function reguard() { static::$unguarded = false; }
看Laravel做者的註釋能夠知道,是對數據填充限制的操做。spa
因此unguard在前,reguard在後,unguard負責解除自動填充操做限制,reguard負責恢復限制。命令行
在填充操做以前,建議使用模型的成員函數 rest
Model::truncate();
這個函數會清空這個模型所對應的數據表,因此請慎重使用。
<?php use Illuminate\Database\Seeder; use Illuminate\Database\Eloquent\Model; class DatabaseSeeder extends Seeder { /** * Run the database seeds. */ public function run() { Model::unguard(); $this->call('PostTableSeeder'); Model::reguard(); } } class PostTableSeeder extends Seeder { public function run() { App\Post::truncate(); factory(App\Post::class, 1000)->create(); } }
這裏有讀者會問:爲何咱們不把填充操做都寫在自帶的DatabaseSeeder的run函數裏呢?
由於咱們開發一個完整的系統時,可能要填充的數據表有不少張,不但願每次都要大量修改這個run函數。咱們還但願每次填充都能保留下這個填充的過程,因此咱們寧願新寫一個類,而後用$this->call()函數來調用。
接下來咱們來談談factory。
文件目錄\database\factories\ModelFactory.php
$factory->define(App\Post::class, function ($faker) { return [ 'title' => $faker->sentence(mt_rand(3, 10)), 'content' => join("\n\n", $faker->paragraphs(mt_rand(3, 6))), 'published_at' => $faker->dateTimeBetween('-1 month', '+3 days'), ]; });
雖然能看懂,可是不知道這個$factory變量是什麼?所以去查Factory類找。
在目錄\vendor\laravel\framework\src\Illuminate\Database\Eloquent的Factory.php找到源代碼
/** * Define a class with a given set of attributes. * * @param string $class * @param callable $attributes * @param string $name * @return void */ public function define($class, callable $attributes, $name = 'default') { $this->definitions[$class][$name] = $attributes; }
/** * Create an instance of the given model and persist it to the database. * * @param string $class * @param array $attributes * @return mixed */ public function create($class, array $attributes = []) { return $this->of($class)->create($attributes); }
開始填充數據,咱們仍是使用artisan命令行
php artisan db:seed
這個命令會執行你寫在DatabaseSeeder.php裏面全部的類的run函數,若是之後項目複雜了,沒有必要執行已經執行過的,因此在命令行後面加參數,只要執行某個類的run函數便可
php artisan db:seed --class=你要執行的類名稱