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 开源AJAX框架14种
Aug 24 PHP
php 文件上传系统手记
Oct 26 PHP
一个PHP分页类的代码
May 18 PHP
php mysql 判断update之后是否更新了的方法
Jan 10 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
Jul 02 PHP
查找mysql字段中固定字符串并替换的几个方法
Sep 23 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
Jun 28 PHP
浅析php变量作用域的一些问题
Aug 08 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
Mar 28 PHP
php中二维数组排序问题方法详解
Aug 28 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
Jan 20 PHP
php 删除一维数组中某一个值元素的操作方法
Feb 01 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
检查url链接是否已经有参数的php代码 添加 ? 或 &amp;
2010/02/09 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
php实现的日历程序
2015/06/18 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
让你的CSS像Jquery一样做筛选的实现方法
2011/07/10 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
微信小程序 setData的使用方法详解
2017/04/20 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
基于ES6作用域和解构赋值详解
2017/11/03 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
linux 后台运行node服务指令方法
2018/05/23 Javascript
在vue中给列表中的奇数行添加class的实现方法
2018/09/05 Javascript
使用JS监听键盘按下事件(keydown event)
2019/11/07 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
[23:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
[01:07:34]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第二场 1月9日
2021/03/11 DOTA
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
文秘自荐信
2013/10/20 职场文书
环境日宣传活动总结
2014/07/09 职场文书
求职意向书
2014/07/29 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
销售2014年度工作总结
2014/12/08 职场文书
让子弹飞观后感
2015/06/11 职场文书
解除合同协议书范本
2016/03/21 职场文书
Meta增速拉垮,元宇宙难当重任
2022/04/29 数码科技