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文件操作实例代码
May 10 PHP
php中将字符串转为HTML的实体引用的一个类
Feb 03 PHP
PHP 实现explort() 功能的详解
Jun 20 PHP
ThinkPHP独立分组使用的注意事项
Nov 25 PHP
ecshop后台编辑器替换成ueditor编辑器
Mar 03 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
Sep 20 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
Jun 28 PHP
WordPress中调试缩略图的相关PHP函数使用解析
Jan 07 PHP
Zend Studio使用技巧两则
Apr 01 PHP
php常用正则函数实例小结
Dec 29 PHP
PHP实现普通hash分布式算法简单示例
Aug 06 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
Mar 09 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字符串处理的10个简单方法
2010/06/30 PHP
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
YII框架常用技巧总结
2019/04/27 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
2012/03/01 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
2013/12/04 Javascript
当达到输入长度时表单自动切换焦点
2014/04/06 Javascript
JavaScript动态创建div等元素实例讲解
2016/01/06 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
JavaScript的ExtJS框架中表格的编写教程
2016/05/21 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
js实现弹窗居中的简单实例
2016/10/09 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
python中ConfigParse模块的用法
2014/09/29 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
详解Python with/as使用说明
2018/12/13 Python
Python 使用matplotlib模块模拟掷骰子
2019/08/08 Python
Python 绘制可视化折线图
2020/07/22 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
幼儿园元旦家长感言
2014/02/27 职场文书
地陪导游欢迎词
2015/01/26 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
培训讲师开场白
2015/06/01 职场文书
2016年教师学习教师法心得体会
2016/01/20 职场文书
java版 联机五子棋游戏
2022/05/04 Java/Android
HTML页面中使两个div并排显示的实现
2022/05/15 HTML / CSS