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 操作文件的一些FAQ总结
Feb 12 PHP
php trim 去除空字符的定义与语法介绍
May 31 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
Feb 19 PHP
PHP __autoload()方法真的影响性能吗?
Mar 30 PHP
ThinkPHP控制器间实现相互调用的方法
Oct 31 PHP
PHP curl CURLOPT_RETURNTRANSFER参数的作用使用实例
Feb 07 PHP
学习php设计模式 php实现抽象工厂模式
Dec 07 PHP
PHP中file_put_contents追加和换行的实现方法
Apr 01 PHP
老生常谈PHP 文件写入和读取(必看篇)
May 22 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
PHPUnit + Laravel单元测试常用技能
Nov 06 PHP
Laravel5.1 框架路由基础详解
Jan 04 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+SqlServer实现分页显示
2006/10/09 PHP
mysql建立外键
2006/11/25 PHP
Php 构造函数construct的前下划线是双的_
2009/12/08 PHP
PHP的5个安全措施小结
2012/07/17 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
php设置允许大文件上传示例代码
2014/03/10 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
PDO::setAttribute讲解
2019/01/29 PHP
javascript 闭包疑问
2010/12/30 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
2016/07/20 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
JS正则表达式常见用法实例详解
2018/06/19 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
Python 编码处理-str与Unicode的区别
2016/09/06 Python
python中import学习备忘笔记
2017/01/24 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
4s客服专员岗位职责
2013/12/01 职场文书
《燕子专列》教学反思
2014/02/21 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL