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 相关文章推荐
第二节 对象模型 [2]
Oct 09 PHP
PHP开发的一些注意点总结
Oct 12 PHP
ajax在joomla中的原生态应用代码
Jul 19 PHP
屏蔽机器人从你的网站搜取email地址的php代码
Nov 14 PHP
PHP可变函数的使用详解
Jun 14 PHP
Php output buffering缓存及程序缓存深入解析
Jul 15 PHP
ThinkPHP实例化模型的四种方法概述
Aug 22 PHP
php+mysqli使用预处理技术进行数据库查询的方法
Jan 28 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
Jul 01 PHP
php5.3后静态绑定用法详解
Nov 11 PHP
PHP中递归的实现实例详解
Nov 14 PHP
PHP压缩图片功能的介绍
Mar 21 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
1 Tube Radio
2021/03/02 无线电
PHP文件操作实例总结
2016/09/27 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
(仅IE下有效)关于checkbox 三态
2007/05/12 Javascript
非常漂亮的JS代码经典广告
2007/10/21 Javascript
由JavaScript中call()方法引发的对面向对象继承机制call的思考
2011/09/12 Javascript
JS获取当前日期和时间的简单实例
2013/11/19 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
简述JS控制台的使用
2018/07/15 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
Tensorflow简单验证码识别应用
2017/05/25 Python
Python实现控制台中的进度条功能代码
2017/12/22 Python
【python】matplotlib动态显示详解
2019/04/11 Python
用vue.js组件模拟v-model指令实例方法
2019/07/05 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
基于Python测试程序是否有错误
2020/05/16 Python
python中温度单位转换的实例方法
2020/12/27 Python
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
会计电算化应届生求职信
2013/11/03 职场文书
十月份红领巾广播稿
2014/01/22 职场文书
红领巾广播站广播稿
2014/02/01 职场文书
道路建设实施方案
2014/03/18 职场文书
诉前财产保全担保书
2014/05/20 职场文书
个人租房协议书样本
2014/10/01 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫