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


Posted in PHP onJune 13, 2018

本文实例讲述了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框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP iconv 函数转gb2312的bug解决方法
Oct 11 PHP
PHP输出缓冲控制Output Control系列函数详解
Jul 02 PHP
PHP加密解密实例分析
Dec 25 PHP
高质量PHP代码的50个实用技巧必备(上)
Jan 22 PHP
Symfony2函数用法实例分析
Mar 18 PHP
laravel5.4生成验证码的实例讲解
Aug 05 PHP
PHP设计模式之观察者模式定义与用法分析
Apr 04 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
Oct 08 PHP
laravel通用化的CURD的实现
Dec 13 PHP
PHP如何开启Opcache功能提升程序处理效率
Apr 27 PHP
php封装实现钉钉机器人报警接口的示例代码
Aug 08 PHP
深入解析PHP底层机制及相关原理
Dec 11 PHP
PHP实现打包zip并下载功能
Jun 12 #PHP
PHPUnit测试私有属性和方法功能示例
Jun 12 #PHP
PHP+redis实现的悲观锁机制示例
Jun 12 #PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 #PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 #PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 #PHP
Laravel框架路由设置与使用示例
Jun 12 #PHP
You might like
php获取文件大小的方法
2014/02/26 PHP
PHP实现的DES加密解密实例代码
2016/04/06 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
2016/07/21 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
不得不看之JavaScript构造函数及new运算符
2017/08/21 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
2018/05/08 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
2018/05/16 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
2020/05/06 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
2020/06/05 Javascript
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
Python基于DES算法加密解密实例
2015/06/03 Python
Django实现自定义404,500页面教程
2017/03/26 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
配置python的编程环境之Anaconda + VSCode的教程
2020/03/29 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
浅谈CSS3特性查询(Feature Query: @supports)功能简介
2017/07/31 HTML / CSS
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
PacSun官网:加州生活方式服装、鞋子和配饰
2018/03/10 全球购物
如何在.net Winform里面显示PDF文档
2012/09/11 面试题
总经理任命书范本
2014/06/05 职场文书
个人剖析材料范文
2014/09/30 职场文书
代办出身证明书
2014/10/21 职场文书
2014年财政工作总结
2014/12/10 职场文书
结婚老公保证书
2015/02/26 职场文书
超市啤酒狂欢夜策划方案范文!
2019/07/03 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
PHP中多字节字符串操作实例详解
2021/08/23 PHP
基于redis+lua进行限流的方法
2022/07/23 Redis