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 相关文章推荐
第三节 定义一个类 [3]
Oct 09 PHP
php+dbfile开发小型留言本
Oct 09 PHP
用PHP函数解决SQL injection
Oct 09 PHP
PHP6 先修班 JSON实例代码
Aug 23 PHP
elgg 获取文件图标地址的方法
Mar 20 PHP
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
Aug 12 PHP
php使用$_POST或$_SESSION[]向js函数传参
Sep 16 PHP
windows中为php安装mongodb与memcache
Jan 06 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
Apr 15 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 PHP
PHP+MySQL之Insert Into数据插入用法分析
Sep 27 PHP
PHP+MySQL实现模糊查询员工信息功能示例
Jun 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
php 远程关机操作的代码
2008/12/05 PHP
PHP获取文件后缀名的三个函数
2012/10/15 PHP
smarty模板引擎基础知识入门
2015/03/30 PHP
学习ExtJS border布局
2009/10/08 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
JavaScript中调用函数的4种方式代码实例
2015/07/08 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
2015/09/15 Javascript
js显示当前日期时间和星期几
2015/10/22 Javascript
jQuery控制元素隐藏和显示
2017/03/03 Javascript
vue-swiper的使用教程
2018/08/30 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
python使用socket向客户端发送数据的方法
2015/04/29 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
Python搜索引擎实现原理和方法
2017/11/27 Python
python3对接mysql数据库实例详解
2019/04/30 Python
网易有道2017内推编程题 洗牌(python)
2019/06/19 Python
python 动态调用函数实例解析
2019/10/21 Python
解决pycharm 格式报错tabs和space不一致问题
2021/02/26 Python
关于HTML5语义标签的实践(blog页面)
2016/07/12 HTML / CSS
柯基袜:Corgi Socks
2017/01/26 全球购物
Otticanet美国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
英国标志性生活方式品牌:Skinnydip London
2019/12/15 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
Java的类与C++的类有什么不同
2014/01/18 面试题
项目专员岗位职责
2013/12/04 职场文书
2014年中班元旦活动方案
2014/02/14 职场文书
降消项目实施方案
2014/03/30 职场文书
签订劳动合同通知书
2015/04/16 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
小学生班干部竞选稿
2015/11/20 职场文书