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
Nov 25 PHP
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
Apr 16 PHP
php下使用以下代码连接并测试
Apr 09 PHP
Zend framework处理一个http请求的流程分析
Feb 08 PHP
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
Aug 12 PHP
PHP实现单例模式最安全的做法
Jun 13 PHP
php用ini_get获取php.ini里变量值的方法
Mar 04 PHP
php实现mysql数据库分表分段备份
Jun 18 PHP
提交表单后 PHP获取提交内容的实现方法
May 25 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
Jul 04 PHP
php插件Xajax使用方法详解
Aug 31 PHP
thinkPHP事务操作简单案例分析
Oct 17 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
CI框架中redis缓存相关操作文件示例代码
2016/05/17 PHP
PHP ob缓存以及ob函数原理实例解析
2020/11/13 PHP
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
JQuery live函数
2010/12/24 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
js中的布尔运算符使用介绍
2013/11/20 Javascript
jquery实现无限分级横向导航菜单的方法
2015/03/12 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
jQuery利用sort对DOM元素进行排序操作
2016/11/07 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
js实现抽奖效果
2017/03/27 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
2020/08/27 Javascript
pygame学习笔记(4):声音控制
2015/04/15 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
CSS3 分类菜单效果
2019/05/27 HTML / CSS
拉斯维加斯酒店、演出、旅游、俱乐部及更多:Vegas.com
2019/02/28 全球购物
中软国际Java程序员笔试题
2014/07/19 面试题
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
校长岗位职责
2013/11/26 职场文书
服务中心夜班服务员岗位职责
2013/11/27 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书
执法作风整顿剖析材料
2014/10/11 职场文书
西安兵马俑导游词
2015/02/02 职场文书
2015年导购员工作总结
2015/04/25 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
法院执行局工作总结
2015/08/11 职场文书
运动会广播稿100字
2015/08/19 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python