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去除重复字的实现代码
Sep 16 PHP
解析php获取字符串的编码格式的方法(函数)
Jun 21 PHP
Php header()函数语法及使用代码
Nov 04 PHP
基于laravel制作APP接口(API)
Mar 15 PHP
PHP身份证校验码计算方法
Aug 10 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
Sep 30 PHP
PHP数组array类常见操作示例
May 15 PHP
PHP 扩展Memcached命令用法实例总结
Jun 04 PHP
深入浅析安装PhpStorm并激活的步骤详解
Sep 17 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开发环境配置记录
2011/01/14 PHP
Yii实现显示静态页的方法
2016/04/25 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
兼容FF和IE的动态table示例自写
2013/10/21 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
JS中取二维数组中最大值的方法汇总
2016/04/17 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:奇迹哥卡尔秀翻全场
2017/03/28 DOTA
[02:00]DAC2018主宣传片——龙征四海,剑问东方
2018/03/20 DOTA
python的id()函数介绍
2013/02/10 Python
合并百度影音的离线数据( with python 2.3)
2015/08/04 Python
基于Django filter中用contains和icontains的区别(详解)
2017/12/12 Python
Pandas读取MySQL数据到DataFrame的方法
2018/07/25 Python
Python对象的属性访问过程详解
2020/03/05 Python
python学习笔记之多进程
2020/08/06 Python
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
物业管理员岗位职责范文
2013/11/25 职场文书
办公室内勤岗位职责范本
2013/12/09 职场文书
会计专业毕业生自荐信范文
2013/12/20 职场文书
材料工程专业毕业生求职信
2014/03/04 职场文书
个人作风建设自查报告
2014/10/22 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
如何使用SQL Server语句创建表
2022/04/12 SQL Server