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 相关文章推荐
经典的PHPer为什么被认为是草根?
Apr 02 PHP
discuz Passport 通行证 整合笔记
Jun 30 PHP
php学习笔记之 函数声明
Jun 09 PHP
php编程实现获取excel文档内容的代码实例
Jun 28 PHP
php数组转换js数组操作及json_encode的用法详解
Oct 26 PHP
PHP中的reflection反射机制测试例子
Aug 05 PHP
在Mac上编译安装PHP7的开发环境
Jul 28 PHP
PHP json_encode() 函数详解及中文乱码问题
Nov 05 PHP
Yii框架弹出框功能示例
Jan 07 PHP
PHP 中使用ajax时一些常见错误总结整理
Feb 27 PHP
laravel框架邮箱认证实现方法详解
Nov 22 PHP
php将字符串转换为数组实例讲解
May 05 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
深入PHP5中的魔术方法详解
2013/06/17 PHP
PHP实现扎金花游戏之大小比赛的方法
2015/03/10 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
JavaScript仿支付宝密码输入框
2015/12/29 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
深入剖析javascript中的exec与match方法
2016/05/18 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
2016/08/20 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
JavaScript中常见内置函数用法示例
2018/05/14 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
Python 常用的安装Module方式汇总
2017/05/06 Python
使用python实现个性化词云的方法
2017/06/16 Python
SVM基本概念及Python实现代码
2017/12/27 Python
python图像和办公文档处理总结
2019/05/28 Python
python绘制评估优化算法性能的测试函数
2019/06/25 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
2020/04/21 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
keras实现多种分类网络的方式
2020/06/11 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
奥地利度假券的专家:we-are.travel
2019/04/10 全球购物
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
在Oracle表中进行关键词搜索的过程
2022/06/10 Oracle