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在字符串中查找指定字符串并删除的代码
Oct 02 PHP
PHP数组实例总结与说明
Aug 23 PHP
PHP加密解密字符串汇总
Apr 26 PHP
php+ajax实现无刷新动态加载数据技术
Apr 28 PHP
php中动态变量用法实例
Jun 10 PHP
大家在抢红包,程序员在研究红包算法
Aug 31 PHP
PHP基于单例模式编写PDO类的方法
Sep 13 PHP
Mac系统完美安装PHP7详细教程
Jun 06 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
解决laravel资源加载路径设置的问题
Oct 14 PHP
基于PHP实现短信验证码发送次数限制
Jul 11 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_xmlhttp 乱码问题解决方法
2009/08/07 PHP
全世界最小的php网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
php 5.4 全新的代码复用Trait详解
2017/01/05 PHP
php函数式编程简单示例
2019/08/08 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
jquery.validate使用攻略 第三部
2010/07/01 Javascript
js实现Select下拉框具有输入功能的方法
2015/02/06 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
第十章之巨幕页头缩略图与警告框组件
2016/04/25 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
python基础教程之序列详解
2014/08/29 Python
Python抓取京东图书评论数据
2014/08/31 Python
Python异常处理操作实例详解
2018/05/10 Python
对python多线程与global变量详解
2018/11/09 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
2018/12/12 Python
python django model联合主键的例子
2019/08/06 Python
Python list与NumPy array 区分详解
2019/11/06 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
Python通过正则库爬取淘宝商品信息代码实例
2020/03/02 Python
python pandas.DataFrame.loc函数使用详解
2020/03/26 Python
python中添加模块导入路径的方法
2021/02/03 Python
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
电气技术员岗位职责
2013/11/19 职场文书
销售文员岗位职责
2013/11/29 职场文书
党支部书记岗位责任制
2014/02/11 职场文书
租车协议书范本
2014/04/22 职场文书
监察局领导班子四风问题整改措施思想汇报
2014/10/05 职场文书
三下乡活动心得体会
2016/01/23 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
javascript实现计算器功能详解流程
2021/11/01 Javascript
详细聊聊vue中组件的props属性
2021/11/02 Vue.js