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

 更新时间:2018年06月13日 08:44:10   作者:编程老头  
这篇文章主要介绍了Laravel框架使用Seeder实现自动填充数据功能,结合实例形式分析了Laravel基于Seeder类实现自动填充数据的相关操作技巧与注意事项,需要的朋友可以参考下

本文实例讲述了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=你要执行的类名称

更多关于Laravel相关内容感兴趣的读者可查看本站专题:《Laravel框架入门与进阶教程》、《php优秀开发框架总结》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

相关文章

  • NativePHP使用PHP创建桌面应用程序

    NativePHP使用PHP创建桌面应用程序

    这篇文章主要为大家介绍了NativePHP使用PHP创建桌面应用程序,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Yii2实现ajax上传图片插件用法

    Yii2实现ajax上传图片插件用法

    这篇文章主要介绍了Yii2实现ajax上传图片插件用法,结合实例形式分析了Yii上传图片插件的具体使用方法,需要的朋友可以参考下
    2016-04-04
  • PHP加密技术的简单实现

    PHP加密技术的简单实现

    下面小编就为大家带来一篇PHP加密技术的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • laravel 获取某个查询的查询SQL语句方法

    laravel 获取某个查询的查询SQL语句方法

    今天小编就为大家分享一篇laravel 获取某个查询的查询SQL语句方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • 用HTML/JS/PHP方式实现页面延时跳转的简单实例

    用HTML/JS/PHP方式实现页面延时跳转的简单实例

    下面小编就为大家带来一篇用HTML/JS/PHP方式实现页面延时跳转的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • laravel-admin 实现在指定的相册下添加照片

    laravel-admin 实现在指定的相册下添加照片

    今天小编就为大家分享一篇laravel-admin 实现在指定的相册下添加照片,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • django中的ajax组件教程详解

    django中的ajax组件教程详解

    Ajax(Asynchronous Javascript And XML)翻译成英文就是“异步Javascript和XML”。这篇文章主要介绍了django中的ajax组件的教程 ,需要的朋友可以参考下
    2018-10-10
  • ThinkPHP实现多数据库连接的解决方法

    ThinkPHP实现多数据库连接的解决方法

    这篇文章主要介绍了ThinkPHP实现多数据库连接的解决方法,需要的朋友可以参考下
    2014-07-07
  • PHP设计模式入门之状态模式原理与实现方法分析

    PHP设计模式入门之状态模式原理与实现方法分析

    这篇文章主要介绍了PHP设计模式入门之状态模式,结合实例形式分析了PHP状态模式基本概念、原理、实现方法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • CI框架实现框架前后端分离的方法详解

    CI框架实现框架前后端分离的方法详解

    这篇文章主要介绍了CI框架实现框架前后端分离的方法,结合实例形式较为详细的分析了CI框架前后端分离的相关视图、控制器设置与扩展等操作技巧,需要的朋友可以参考下
    2016-12-12

最新评论