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初学入门
Nov 19 PHP
PHP在字符串中查找指定字符串并删除的代码
Oct 02 PHP
php gzip压缩输出的实现方法
Apr 27 PHP
php_screw 1.5:php加密: 安装与使用详解
Jun 20 PHP
PHP与Java进行通信的实现方法
Oct 21 PHP
PHP使用redis实现统计缓存mysql压力的方法
Nov 14 PHP
PHP自定义函数获取URL中一级域名的方法
Aug 23 PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 PHP
PHP用户注册邮件激活账户的实现代码
May 31 PHP
laravel 关联关系遍历数组的例子
Oct 10 PHP
tp5框架使用cookie加密算法实现登录功能示例
Feb 10 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 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
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
完美解决PHP中的Cannot modify header information 问题
2013/08/12 PHP
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
利用Query+bootstrap和js两种方式实现日期选择器
2017/01/10 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
2017/05/26 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
2017/12/29 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
js实现双人五子棋小游戏
2020/05/28 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
python常见数制转换实例分析
2015/05/09 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
python递归函数绘制分形树的方法
2018/06/22 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
python 获得任意路径下的文件及其根目录的方法
2019/02/16 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
python中time、datetime模块的使用
2020/12/14 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
外贸英语毕业生自荐信
2013/11/14 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
详解Vue的sync修饰符
2021/05/15 Vue.js
教你怎么用Python操作MySql数据库
2021/05/31 Python
alibaba seata服务端具体实现
2022/02/24 Java/Android
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫