Laravel使用Seeder自動填充數據


要查看代碼,可以點擊

或者轉到鏈接:https://github.com/laravel/framework

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

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

大家會注意到這兩個函數

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();

這個函數會清空這個模型所對應的數據表,所以請慎重使用。

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

  

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM