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在程序中将网页生成word文档并提供下载的代码
Oct 09 PHP
PHP中构造函数和析构函数解析
Oct 10 PHP
php抽象类用法实例分析
Jul 07 PHP
PHP使用正则表达式获取微博中的话题和对象名
Jul 18 PHP
php无限分类使用concat如何实现
Nov 05 PHP
深入解析PHP的Yii框架中的event事件机制
Mar 17 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
Mar 18 PHP
PHP使用内置函数生成图片的方法详解
May 09 PHP
详细解读php的命名空间(一)
Feb 21 PHP
PHP设计模式之原型设计模式原理与用法分析
Apr 25 PHP
php curl获取到json对象并转成数组array的方法
May 31 PHP
PHP如何使用array_unshift()在数组开头插入元素
Sep 01 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 生成唯一id的几种解决方法
2013/03/08 PHP
PHP实现把数字ID转字母ID
2013/08/12 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
点评js异步加载的4种方式
2015/12/22 Javascript
jQuery 移动端artEditor富文本编辑器
2016/01/11 Javascript
原生js实现addClass,removeClass,hasClass方法
2016/04/27 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
ant design 日期格式化的实现
2020/10/27 Javascript
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python爬取京东的商品分类与链接
2016/08/26 Python
python实现在pandas.DataFrame添加一行
2018/04/04 Python
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
澳洲Chemist Direct药房中文网:澳洲大型线上直邮药房
2019/11/04 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
一些Solaris面试题
2015/12/22 面试题
解释i节点在文件系统中的作用
2013/11/26 面试题
销售自荐信
2013/10/22 职场文书
学生手册评语
2014/05/05 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
商业计划书范文
2019/04/24 职场文书
CSS变量实现主题切换的方法
2021/06/23 HTML / CSS
浅谈Node的内存泄露问题
2022/05/06 NodeJs