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 相关文章推荐
dedecms模板标签代码官方参考
Mar 17 PHP
PHP简单系统查询模块代码打包下载
Jun 07 PHP
Ajax+PHP边学边练 之五 图片处理
Dec 03 PHP
PHP函数学习之PHP函数点评
Jul 05 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
Jan 19 PHP
Symfony2学习笔记之模板用法详解
Mar 17 PHP
让你的PHP7更快之Hugepage用法分析
May 31 PHP
详谈phpAdmin修改密码后拒绝访问的问题
Apr 03 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 PHP
PHP中md5()函数的用法讲解
Mar 30 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 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的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
getElementByIdx_x js自定义getElementById函数
2012/01/24 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
什么是Node.js?Node.js详细介绍
2014/06/01 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
Javascript之深入浅出prototype
2017/02/06 Javascript
vue.js获取数据库数据实例代码
2017/05/26 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
解决layui使用layui-icon出现默认图标的问题
2019/09/11 Javascript
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
django用户登录验证的完整示例代码
2019/07/21 Python
Pycharm如何运行.py文件的方法步骤
2020/03/03 Python
浅谈对python中if、elif、else的误解
2020/08/20 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
法学毕业生自我鉴定
2013/11/08 职场文书
追悼会主持词
2014/03/20 职场文书
公休请假条
2014/04/11 职场文书
学校与家长安全责任书
2014/07/23 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
opencv读取视频并保存图像的方法
2021/06/04 Python
Kubernetes控制节点的部署
2022/04/01 Servers