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 相关文章推荐
优化NFR之一 --MSSQL Hello Buffer Overflow
Oct 09 PHP
Adodb的十个实例(清晰版)
Dec 31 PHP
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
Feb 08 PHP
php SQL Injection with MySQL
Feb 27 PHP
PHP--用万网的接口实现域名查询功能
Dec 13 PHP
php使用异或实现的加密解密实例
Sep 04 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
PHP 二维数组和三维数组的过滤
Mar 16 PHP
功能强大的PHP POST提交数据类
Jul 15 PHP
php中分页及SqlHelper类用法实例
Jan 12 PHP
PHP检测数据类型的几种方法(总结)
Mar 04 PHP
自制PHP框架之模型与数据库
May 07 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
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
php技术实现加载字体并保存成图片
2015/07/27 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
laravel model 两表联查示例
2019/10/24 PHP
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
JavaScript面向对象编程
2008/03/02 Javascript
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
THREE.JS入门教程(5)你应当知道的十件事
2013/01/24 Javascript
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
Bootstrap基本组件学习笔记之分页(12)
2016/12/08 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
vue实现手机号码抽奖上下滚动动画示例
2017/10/18 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
2019/06/20 jQuery
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
python BeautifulSoup使用方法详解
2013/11/21 Python
如何清空python的变量
2020/07/05 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
Java的基础面试题附答案
2016/01/10 面试题
一篇.NET面试题
2014/09/29 面试题
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
化工机械应届生求职信
2013/11/04 职场文书
2014年党员公开承诺践诺书
2014/03/25 职场文书
艺术教育实施方案
2014/05/03 职场文书
2014年财政所工作总结
2014/11/22 职场文书
先进党支部申报材料
2014/12/24 职场文书
初中军训感想
2015/08/07 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书