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 源代码压缩小工具
Dec 22 PHP
PHP array_flip() 删除重复数组元素专用函数
May 16 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
Nov 07 PHP
php和js如何通过json互相传递数据相关问题探讨
Feb 26 PHP
19个超实用的PHP代码片段
Mar 14 PHP
PHP实现自动识别Restful API的返回内容类型
Feb 07 PHP
PHP调用Linux命令权限不足问题解决方法
Feb 07 PHP
php图像处理函数imagecopyresampled用法详解
Dec 02 PHP
PHP策略模式定义与用法示例
Jul 27 PHP
PHP实现的AES加密、解密封装类与用法示例
Aug 02 PHP
利用PHP扩展Xhprof分析项目性能实践教程
Sep 05 PHP
PHP8.0新功能之Match表达式的使用
Jul 19 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/11/19 PHP
PHP+MySQL5.0中文乱码解决方法
2006/11/20 PHP
基于MySQL分区性能的详细介绍
2013/05/02 PHP
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
JavaScript面向对象的实现方法小结
2015/04/14 Javascript
angularjs学习笔记之简单介绍
2015/09/26 Javascript
浅谈String.valueOf()方法的使用
2016/06/06 Javascript
AngularJS ng-blur 指令详解及简单实例
2016/07/30 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
JS实现Cookie读、写、删除操作工具类示例
2018/08/28 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
Python实现在线音乐播放器
2017/03/03 Python
python简单鼠标自动点击某区域的实例
2019/06/25 Python
Python使用sklearn实现的各种回归算法示例
2019/07/04 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
pytorch中index_select()的用法详解
2021/01/06 Python
医学生实习自我鉴定
2013/09/27 职场文书
国际经济与贸易专业大学生职业规划书
2014/03/01 职场文书
党员个人自我剖析材料
2014/10/08 职场文书
2015年酒店工作总结范文
2015/04/07 职场文书
《蓝鲸的眼睛》读后感5篇
2020/01/15 职场文书
Python必备技巧之函数的使用详解
2022/04/04 Python
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android