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 相关文章推荐
一个程序下载的管理程序(二)
Oct 09 PHP
php预定义常量
Dec 25 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 PHP
PHP连接sql server 2005环境配置及问题解决
Aug 08 PHP
php计算2个日期的差值函数分享
Feb 02 PHP
php替换字符串中间字符为省略号的方法
May 04 PHP
再推荐十款免费的php开发工具
Nov 09 PHP
PHP数据库连接mysql与mysqli对比分析
Jan 04 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
Sep 22 PHP
php获取微信基础接口凭证Access_token
Aug 23 PHP
PHP递归算法的简单实例
Feb 28 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.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
Yii框架表单模型和验证用法
2016/05/20 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
2013/02/06 Javascript
Javascript 浮点运算精度问题分析与解决
2014/03/26 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
JS动态添加Table的TR,TD实现方法
2015/01/28 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
2016/11/21 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
2018/08/13 Javascript
JavaScript数组去重的几种方法
2019/04/07 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
2019/10/30 Javascript
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
在nodejs中创建child process的方法
2021/01/26 NodeJs
python支持断点续传的多线程下载示例
2014/01/16 Python
Python 内置函数complex详解
2016/10/23 Python
Python简单实现socket信息发送与监听功能示例
2018/01/03 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
Python换行与不换行的输出实例
2020/02/19 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
基于Python实现体育彩票选号器功能代码实例
2020/09/16 Python
购买大码女装:Lane Bryant
2016/09/07 全球购物
微软新西兰官方网站:Microsoft New Zealand
2018/08/17 全球购物
二年级评语大全
2014/04/23 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
mybatis使用oracle进行添加数据的方法
2021/04/27 Oracle
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电