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安装全攻略:APACHE
Oct 09 PHP
用PHP和ACCESS写聊天室(四)
Oct 09 PHP
PHP 数组基础知识小结
Aug 20 PHP
PHP学习笔记之一
Jan 17 PHP
PHP应用JSON技巧讲解
Feb 03 PHP
Linux下创建nginx脚本-start、stop、reload…
Aug 03 PHP
PHP中使用xmlreader读取xml数据示例
Dec 29 PHP
php绘制一个扇形的方法
Jan 24 PHP
php实现html标签闭合检测与修复方法
Jul 09 PHP
PHP 7.1新特性的汇总介绍
Dec 16 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
Apr 03 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
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
php公用函数列表[正则]
2007/02/22 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
NodeJS的模块写法入门(实例代码)
2012/03/07 NodeJs
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
JavaScript 闭包机制详解及实例代码
2016/10/10 Javascript
详解开发react应用最好用的脚手架 create-react-app
2018/04/24 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
2018/09/12 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
Python用Jira库来操作Jira
2020/12/28 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
Carolina Lemke Berlin澳大利亚官网:时尚太阳镜品牌
2019/09/17 全球购物
《埃及的金字塔》教学反思
2014/04/07 职场文书
媒矿安全生产承诺书
2014/05/23 职场文书
党员自我评议个人对照检查材料
2014/09/16 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书