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实现的MySQL数据浏览器
Mar 11 PHP
一家之言的经验之谈php+mysql扎实个人基本功
Mar 27 PHP
php读取html并截取字符串的简单代码
Nov 30 PHP
收藏的PHP常用函数 推荐收藏保存
Feb 21 PHP
新浪微博API开发简介之用户授权(PHP基础篇)
Sep 25 PHP
php数据结构与算法(PHP描述) 快速排序 quick sort
Jun 21 PHP
php define的第二个参数使用方法
Nov 04 PHP
php定义数组和使用示例(php数组的定义方法)
Mar 29 PHP
php Session无效分析资料整理
Nov 29 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
浅谈laravel orm 中的一对多关系 hasMany
Oct 21 PHP
php中使用array_filter()函数过滤数组实例讲解
Mar 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开发大型项目的一点经验
2006/10/09 PHP
php 中英文语言转换类
2011/09/07 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
php 判断是否是中文/英文/数字示例代码
2013/09/30 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
php实现httpRequest的方法
2015/03/13 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
2020/04/29 PHP
js 面向对象的技术创建高级 Web 应用程序
2010/02/25 Javascript
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
react 生命周期实例分析
2020/05/18 Javascript
详解Vue的七种传值方式
2021/02/08 Vue.js
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
Python里隐藏的“禅”
2014/06/16 Python
python中threading超线程用法实例分析
2015/05/16 Python
基于Python实现一个简单的银行转账操作
2016/03/06 Python
window下eclipse安装python插件教程
2017/04/24 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
python数据处理 根据颜色对图片进行分类的方法
2018/12/08 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
Python2与Python3的区别详解
2020/02/09 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
荷兰皇家航空公司官方网站:KLM Royal Dutch Airlines
2017/12/07 全球购物
东方通信股份有限公司VC面试题
2014/08/27 面试题
SQL Server数据库笔试题和答案
2016/02/04 面试题
环境工程大学生自荐信
2013/10/21 职场文书
小学教师工作总结2015
2015/04/07 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
cypress测试本地web应用
2022/06/01 Javascript