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切割页面div内容的实现代码分享
Jul 31 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
Sep 07 PHP
探讨:如何使用PhpDocumentor生成文档
Jun 25 PHP
php ZipArchive压缩函数详解实例
Nov 06 PHP
PHP图片裁剪函数(保持图像不变形)
May 04 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
Jul 25 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
Nov 06 PHP
PHP使用GETDATE获取当前日期时间作为一个关联数组的方法
Mar 19 PHP
php生成curl命令行的方法
Dec 14 PHP
php中namespace use用法实例分析
Jan 22 PHP
PHP生成图片验证码功能示例
Jan 12 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 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
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
PHP使用者状态管理功能的应用
2006/10/09 PHP
PHP6 先修班 JSON实例代码
2008/08/23 PHP
利用PHP制作简单的内容采集器的原理分析
2008/10/01 PHP
ecshop 批量上传(加入自定义属性)
2012/03/20 PHP
php上传文件常见问题总结
2015/02/03 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
PHP进阶学习之垃圾回收机制详解
2019/06/18 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
JavaScript内核之基本概念
2011/10/21 Javascript
jquery遍历checkbox介绍
2014/02/21 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
JavaScript深拷贝和浅拷贝概念与用法实例分析
2018/06/07 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
[40:10]2015国际邀请赛全明星表演赛
2015/08/07 DOTA
python实现从字典中删除元素的方法
2015/05/04 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
Python TCP通信客户端服务端代码实例
2019/11/21 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
商务日语毕业生自荐信范文
2013/11/14 职场文书
《维生素c的故事》教学反思
2014/02/18 职场文书
党校个人自我鉴定范文
2014/03/28 职场文书
模具设计与制造专业自荐书
2014/07/01 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
家长评语怎么写
2014/12/30 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers