• 技术文章 >后端开发 >php教程

    使用Laravel框架的Seeder实现自动填充数据功能

    不言不言2018-06-13 09:26:50原创1028
    这篇文章主要介绍了Laravel框架使用Seeder实现自动填充数据功能,结合实例形式分析了Laravel基于Seeder类实现自动填充数据的相关操作技巧与注意事项,需要的朋友可以参考下

    本文实例讲述了Laravel框架使用Seeder实现自动填充数据功能。分享给大家供大家参考,具体如下:

    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=你要执行的类名称

    以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

    相关推荐:

    关于Laravel框架路由和控制器的绑定操作

    对于Laravel框架的生命周期与原理分析

    Laravel框架的路由设置

    以上就是使用Laravel框架的Seeder实现自动填充数据功能的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:在php中用html_entity_decode实现HTML实体转义 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • PHP编译器BPC6.0已发布,聊聊有哪些新功能吧!• 汇总有关PHP多进程开发面试常见问题(附答案)• php对称加解密的5个问答小结• php里 的 四舍五入_PHP教程• PHP 页面跳转到另一个页面的多种方法方法总结_PHP教程
    1/1

    PHP中文网