Laravel使用Seeder自動填充數據

要查看代碼,能夠點擊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=你要執行的類名稱
相關文章
相關標籤/搜索