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桌面中心(一) 创建数据库
Mar 11 PHP
两个开源的Php输出Excel文件类
Feb 08 PHP
php 无法载入mysql扩展
Mar 12 PHP
PHP 登录记住密码实现思路
May 07 PHP
php用正则表达式匹配中文实例详解
Nov 06 PHP
Opcache导致php-fpm崩溃nginx返回502
Mar 02 PHP
CI框架中数据库操作函数$this-&gt;db-&gt;where()相关用法总结
May 17 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 PHP
详解Laravel5.6 Passport实现Api接口认证
Jul 27 PHP
实例讲解PHP表单
Jun 10 PHP
WordPress多语言翻译插件 - WPML使用教程
Apr 01 PHP
Memcached介绍及php-memcache扩展安装
Apr 01 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
第九节--绑定
2006/11/16 PHP
PHP Pear 安装及使用
2009/03/19 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
php获取访问者IP地址汇总
2015/04/24 PHP
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
javascript 表单规则集合对象
2009/07/21 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
jQuery中:reset选择器用法实例
2015/01/04 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
详解vue中axios的封装
2018/07/18 Javascript
JavaScript创建对象的常用方式总结
2018/08/10 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
Python线程中对join方法的运用的教程
2015/04/09 Python
python使用post提交数据到远程url的方法
2015/04/29 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
Python学习之time模块的基本使用
2021/01/17 Python
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
Athleta官网:购买女士瑜伽服、技术运动服和休闲运动服
2020/11/12 全球购物
施工安全责任书
2014/04/14 职场文书
责任胜于能力演讲稿
2014/05/20 职场文书
停课通知书
2015/04/24 职场文书
Python编程super应用场景及示例解析
2021/10/05 Python