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 相关文章推荐
php 日期和时间的处理-郑阿奇(续)
Jul 04 PHP
浅析PHP递归函数返回值使用方法
Feb 18 PHP
深入eAccelerator与memcached的区别详解
Jun 06 PHP
php+mysqli实现批量替换数据库表前缀的方法
Dec 29 PHP
php面向对象中static静态属性与方法的内存位置分析
Feb 08 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
Dec 10 PHP
变量在 PHP7 内部的实现(二)
Dec 21 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
Jun 28 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
Feb 04 PHP
PHP 年月日的三级联动实例代码
May 24 PHP
PHP实现权限管理功能示例
Sep 22 PHP
laravel ajax curd 搜索登录判断功能的实现
Apr 17 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
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
浅析PHP编程中10个最常见的错误
2014/08/08 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
PHP实现页面静态化的超简单方法
2016/09/06 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
ie 调试javascript的工具
2009/04/29 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
javascript中typeof的使用示例
2013/12/19 Javascript
jQuery使用post方法提交数据实例
2015/03/25 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
js实现微博发布小功能
2017/01/12 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
2018/12/07 Javascript
小程序转发探索示例
2019/02/19 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
python计算书页码的统计数字问题实例
2014/09/26 Python
Python 迭代器工具包【推荐】
2016/05/06 Python
Python编程在flask中模拟进行Restful的CRUD操作
2018/12/28 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
OpenCV+face++实现实时人脸识别解锁功能
2019/08/28 Python
基于python实现从尾到头打印链表
2019/11/02 Python
python 实现绘制整齐的表格
2019/11/18 Python
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
说出一些常用的类,包,接口
2014/09/22 面试题
面向对象编程是如何提高软件开发水平的
2014/05/06 面试题
什么是.net
2015/08/03 面试题
合作投资意向书
2014/04/01 职场文书
责任书格式
2019/04/18 职场文书
承诺书应该怎么写?
2019/09/10 职场文书
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
2021/06/09 Python