国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

Laravel框架使用Seeder實現自動填充數據功能

2024-05-05 00:04:08
字體:
來源:轉載
供稿:網友

本文實例講述了Laravel框架使用Seeder實現自動填充數據功能。分享給大家供大家參考,具體如下:

要查看代碼,可以點擊鏈接:https://github.com/laravel/framework

Laravel自動填充數據使用的是Seeder類

<?phpuse 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函數,里面寫你的自動填充步驟

大家會注意到這兩個函數

Model::unguard();//你的填充操作Model::reguard();

曾經對這兩個函數非常疑惑,到底是干什么用的,只能推測是一對互為反作用的函數。于是去查了下源代碼。

在目錄/vendor/laravel/framework/src/Illuminate/Database/Eloquent下的Model.php下定義了這兩個函數

/*** 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作者的注釋可以知道,是對數據填充限制的操作。

所以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 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=你要執行的類名稱

希望本文所述對大家基于Laravel框架的PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 潍坊市| 漯河市| 嘉义市| 渑池县| 金坛市| 固安县| 巴里| 陆河县| 龙岩市| 巴楚县| 鸡泽县| 陈巴尔虎旗| 泸定县| 买车| 和硕县| 宜宾县| 闽清县| 岚皋县| 泰兴市| 芷江| 利川市| 日照市| 文昌市| 洞头县| 水富县| 萍乡市| 尼勒克县| 泰安市| 昭通市| 白山市| 长葛市| 定日县| 马公市| 台南县| 景谷| 山阳县| 大丰市| 酒泉市| 宝丰县| 德清县| 米易县|