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 相关文章推荐
PHP4之真OO
Oct 09 PHP
风格模板初级不完全修改教程
Oct 09 PHP
表单复选框向PHP传输数据的代码
Nov 13 PHP
php开发过程中关于继承的使用方法分享
Jun 17 PHP
浅析php中抽象类和接口的概念以及区别
Jun 27 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
Jun 19 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
php获取从html表单传递数组的方法
Mar 20 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
Dec 21 PHP
详解PHP对象的串行化与反串行化
Jan 24 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
Apr 02 PHP
laravel框架邮箱认证实现方法详解
Nov 22 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下的权限算法的实现
2007/04/28 PHP
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
JQuery从头学起第一讲
2010/07/04 Javascript
js网页中的(运行代码)功能实现思路
2013/02/04 Javascript
利用webqq协议使用python登录qq发消息源码参考
2013/04/08 Javascript
JS 两个字符串时间的天数差计算
2013/08/25 Javascript
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
2015/12/10 Javascript
vue2滚动条加载更多数据实现代码
2017/01/10 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
pace.js和NProgress.js两个加载进度插件的一点小总结
2018/01/31 Javascript
20行JS代码实现粘贴板复制功能
2018/02/06 Javascript
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
2018/06/13 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
2018/09/14 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
python3+PyQt5使用数据库表视图
2018/04/24 Python
老生常谈python中的重载
2018/11/11 Python
python自带tkinter库实现棋盘覆盖图形界面
2019/07/17 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
基于python实现计算且附带进度条代码实例
2020/03/31 Python
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
电焊工岗位工作职责
2014/07/09 职场文书
介绍信模板
2015/01/31 职场文书
幼儿园三八妇女节活动总结
2015/02/06 职场文书
红楼梦读书笔记
2015/06/25 职场文书
100句人生哲理语录集锦:强者征服今天,懒汉坐等明天
2019/10/18 职场文书