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 删除记录同时删除图片文件的实现代码
May 12 PHP
一道关于php变量引用的面试题
Aug 08 PHP
windows下升级PHP到5.3.3的过程及注意事项
Oct 12 PHP
解析mysql left( right ) join使用on与where筛选的差异
Jun 18 PHP
php使用ob_flush不能每隔一秒输出原理分析
Jun 02 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
Laravel学习教程之路由模块
Aug 18 PHP
PHP实现生成推广海报的方法详解
Mar 14 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
Apr 27 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 PHP
PHP数组实际占用内存大小原理解析
Dec 11 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开发入门教程之面向对象
2006/12/05 PHP
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
PHP 对象接口简单实现方法示例
2020/04/13 PHP
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
如何使用HTML5地理位置定位功能
2015/04/27 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
javascript中的深复制详解及实例分析
2016/12/29 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
VueJS组件之间通过props交互及验证的方式
2017/09/04 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
2019/04/14 Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
2019/10/24 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
Python functools模块学习总结
2015/05/09 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
OpenCV 轮廓检测的实现方法
2019/07/03 Python
python编写微信公众号首图思路详解
2019/12/13 Python
Python更新所有已安装包的操作
2020/02/13 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
2020/07/20 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
2021/02/16 Python
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
把富文本的回车转为br标签
2019/08/09 HTML / CSS
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
毕业自我鉴定
2013/11/05 职场文书
党员岗位承诺口号大全
2014/03/28 职场文书
2014幼儿园教师个人工作总结
2014/11/08 职场文书
清洁工岗位职责
2015/02/13 职场文书
复试通知单模板
2015/04/24 职场文书
导游词之山东孔庙
2019/11/04 职场文书