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中empty is_null和isset的测试
Jun 29 PHP
PHPThumb图片处理实例
May 03 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
May 12 PHP
改写ThinkPHP的U方法使其路由下分页正常
Jul 02 PHP
全面解析PHP操作Memcache基本函数
Jul 14 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
Dec 25 PHP
Yii框架实现多数据库配置和操作的方法
May 25 PHP
Redis在Laravel项目中的应用实例详解
Aug 11 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
php微信开发之谷歌测距
Jun 14 PHP
laravel中的一些简单实用功能
Nov 03 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 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
flash用php连接数据库的代码
2011/04/21 PHP
PHP 时间日期操作实战
2011/08/26 PHP
解析php如何将日志写进syslog
2013/06/28 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
javascript检查浏览器是否支持flash的实现代码
2014/08/14 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
2015/03/03 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
2017/02/16 Javascript
浅谈angularjs依赖服务注入写法的注意点
2017/04/24 Javascript
javascript编程开发中取色器及封装$函数用法示例
2017/08/09 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
jQuery实现checkbox全选功能完整实例
2018/07/12 jQuery
基于three.js实现的3D粒子动效实例代码
2019/04/09 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
使用python分析git log日志示例
2014/02/27 Python
Python Trie树实现字典排序
2014/03/28 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
ansible作为python模块库使用的方法实例
2017/01/17 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
Windows下安装Scrapy
2018/10/17 Python
python实现图片筛选程序
2018/10/24 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
Python 获取numpy.array索引值的实例
2019/12/06 Python
python实现随机加减法生成器
2020/02/24 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
竞选副班长演讲稿
2014/04/24 职场文书
大学生英语演讲稿
2014/04/24 职场文书
反邪教宣传工作方案
2014/05/07 职场文书
好听的队名和口号
2014/06/09 职场文书
投标授权委托书范文
2014/08/02 职场文书
求职自我推荐信
2015/03/24 职场文书