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 相关文章推荐
浅谈apache和nginx的rewrite的区别
Feb 22 PHP
php中simplexml_load_string使用实例分享
Feb 13 PHP
PHP base64编码后解码乱码的解决办法
Jun 19 PHP
PHP实现对站点内容外部链接的过滤方法
Sep 10 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
Sep 22 PHP
php中实现记住密码下次自动登录的例子
Nov 06 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
Feb 12 PHP
微信 开发生成带参数的二维码的实例
Nov 23 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
May 11 PHP
PHP+RabbitMQ实现消息队列的完整代码
Mar 20 PHP
解决laravel 出现ajax请求419(unknown status)的问题
Sep 03 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-fpm 参数的深入理解
2013/06/03 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
详谈PHP文件目录基础操作
2014/11/11 PHP
smarty模板引擎之分配数据类型
2015/03/30 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
[41:52]2018DOTA2亚洲邀请赛3月29日 小组赛A组 TNC VS OpTic
2018/03/30 DOTA
Python运算符重载用法实例分析
2015/06/01 Python
python实现用户登陆邮件通知的方法
2015/07/09 Python
python实现批量按比例缩放图片效果
2018/03/30 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
Pycharm设置去除显示的波浪线方法
2018/10/28 Python
python执行精确的小数计算方法
2019/01/21 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
Python中读取文件名中的数字的实例详解
2020/12/25 Python
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
工业自动化专业毕业生推荐信
2013/11/18 职场文书
自我评价优秀范文分享
2013/11/30 职场文书
大四本科生的自我评价
2013/12/30 职场文书
《最可爱的人》教学反思
2014/02/14 职场文书
代理人委托书
2014/08/01 职场文书
股东授权委托书范本
2014/09/13 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
2014年项目经理工作总结
2014/11/24 职场文书
金融专业银行实习证明模板
2014/11/28 职场文书
小学班主任自我评价
2015/03/11 职场文书
税务会计岗位职责
2015/04/02 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
javascript中Set、Map、WeakSet、WeakMap区别
2022/12/24 Javascript