本文實例講述了Laravel框架使用Seeder實現自動填充數據功能。分享給大家供大家參考,具體如下:
Laravel自動填充數據使用的是Seeder類
?phpuse Illuminate/Database/Seeder;use Illuminate/Database/Eloquent/Model;html' target='_blank'>class DatabaseSeeder extends Seeder * Run the database seeds. public function run()class MyTableSeeder extends Seeder public function run()}
你自定義的Seeder只有一個run函數,里面寫你的自動填充步驟
大家會注意到這兩個函數
Model::unguard();//你的填充操作Model::reguard();
曾經對這兩個函數非常疑惑,到底是干什么用的,只能推測是一對互為反作用的函數。于是去查了下源代碼。
在目錄/vendor/laravel/framework/src/Illuminate/Database/Eloquent下的Model.php下定義了這兩個函數
/*** Disable all mass assignable restrictions.* @param bool $state* @return voidpublic static function unguard($state = true) static::$unguarded = $state;* Enable the mass assignment restrictions.* @return voidpublic static function reguard() static::$unguarded = false;}
看Laravel作者的注釋可以知道,是對數據填充限制的操作。
所以unguard在前,reguard在后,unguard負責解除自動填充操作限制,reguard負責恢復限制。
在填充操作之前,建議使用模型的成員函數
Model::truncate();
這個函數會清空這個模型所對應的數據表,所以請慎重使用。
?phpuse 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 voidpublic 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 mixedpublic function create($class, array $attributes = []) return $this- of($class)- create($attributes);}
開始填充數據,我們還是使用artisan命令行
php artisan db:seed
這個命令會執行你寫在DatabaseSeeder.php里面所有的類的run函數,如果以后項目復雜了,沒有必要執行已經執行過的,所以在命令行后面加參數,只要執行某個類的run函數即可
php artisan db:seed -- >以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !
相關推薦:
關于Laravel框架路由和控制器的綁定操作
對于Laravel框架的生命周期與原理分析
Laravel框架的路由設置
以上就是使用Laravel框架的Seeder實現自動填充數據功能的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答