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 文件上传源码分析(RFC1867)
Oct 30 PHP
php 模拟POST|GET操作实现代码
Jul 20 PHP
php从右向左/从左向右截取字符串的实现方法
Nov 28 PHP
php 带逗号千位符数字的处理方法
Jan 10 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
Oct 22 PHP
php switch语句多个值匹配同一代码块的实现
Mar 03 PHP
JavaScript创建命名空间的5种写法
Jun 24 PHP
PHP中基本HTTP认证技巧分析
Mar 16 PHP
php中smarty区域循环的方法
Jun 11 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
学习PHP Cookie处理函数
Aug 09 PHP
php中访问修饰符的知识点总结
Jan 27 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/04 PHP
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
2012/03/01 PHP
PHP5各个版本的新功能和新特性总结
2014/03/16 PHP
mac下Apache + MySql + PHP搭建网站开发环境
2014/06/02 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
二级域名转向类
2006/11/09 Javascript
JavaScript高级程序设计
2006/12/29 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
简单的js表单验证函数
2013/10/28 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
vue.js 实现点击按钮动态添加li的方法
2018/09/07 Javascript
微信小程序实现点击效果
2019/06/21 Javascript
JavaScript中Dom操作实例详解
2019/07/08 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
python将字符串转换成数组的方法
2015/04/29 Python
python抓取百度首页的方法
2015/05/19 Python
python开发之字符串string操作方法实例详解
2015/11/12 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
2016/12/27 Python
Python实现复杂对象转JSON的方法示例
2017/06/22 Python
浅谈django rest jwt vue 跨域问题
2018/10/26 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
详解numpy矩阵的创建与数据类型
2019/10/18 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
世界上最受欢迎的钓鱼诱饵:Rapala
2019/05/02 全球购物
运动会开幕式主持词
2015/07/01 职场文书
酒店宣传语大全
2015/07/13 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书