Laravel中数据迁移与数据填充的详细步骤

时间:2017-12-05

如果我们有多个表要进行数据填充,那么不可能在编写完 php 代码之后,逐个的执行 php artisan db:seeder --class=xxxx 来进行填充。有一个简便的方法。在 DatabaseSeeder 的 run 方法中添加一行 $this->call(UserTableSeeder::class);,然后执行 php artisan db:seeder,那么 Laravel 就会执行 DatabaseSeeder 中的 run 方法,然后逐个执行迁移。

和 migration 不同,如果多次执行 php artisan db:seeder 就会进行多次数据填充。

加入你想一次性插入大量的测试数据 ,那么在 run 方法中使用 DB facade 来逐个插入显然不是一个好的方法。Laravel 中提供了一种模型工厂的方式来创建创建大量的数据。

模型工厂

模型工厂,意味着本质其实是一个工厂模式。那么,在使用模型工厂创建数据需要做两件事情

  • 创建工厂,定义好工厂要返回的数据。
  • 调用工厂获取数据。

Laravel 中通过执行 php artisan make:factory UserFactory --model=User 来为 User Model 创建一个工厂类,该文件会放在 database/factory 目录下。打开该文件可以看到如下代码:

$factory->define(App\User::class, function (Faker $faker) {
 return [
  //
 ];
});

这里, return 的值就是我们第 2 步调用工厂获取到的数据。生成数据的逻辑也只需要写在闭包函数中就可以。这里需要提一下 Faker 这个类。这是一个第三方库,Laravel 集成了这个第三方库。这个库的作用很好玩:**用于生成假数据。**假设 User 表需要插入 100 个用户,那么就需要 100 个 username,那么你就不必自己写逻辑生成大量的 test01,test02 这样子幼稚的假数据,直接使用 Faker 类,会替你生成大量逼真的 username。(我也不知道这个算不算无聊了 :)。。。)。

现在假设 User 表有 id, email, username 三个字段,那么我要生成 100 个用户,首先在工厂类中实现逻辑。

$factory->define(App\Models\User::class, function (Faker $faker) {
 return [
  // 直接调用 faker API 生成假数据,更多 faker 相关查看 文档。
  'username' => $faker->name,
  'email' => $faker->unique()->safeEmail,
 ];
});

现在,我们已经定义好了工厂,现在我们就要在 UserSeeder@run 函数中使用模型工厂来生成测试数据。

class UserTableSeeder extends Seeder
{

 public function run()
 {
  factory(App\User::class)->times(10)->make()->each(function($user,$index){
   $user->save();
  });
 }
}

run 函数中这一波行云流水的链式调用在我刚刚开始接触 Laravel 的时候也是一脸黑线,不过习惯之后感觉这代码可读性确实很强

  • factory(App\User::class) 指明返回哪个工厂,参数 App\User::class 就是工厂的唯一标识。这里我们在定义工厂的时候 define 的第一个参数已经指明了。
  • ->times(10) 指明需要工厂模式生成 10 个 User 数据。即会调用 10 次 define 函数的第二个参数。
  • ->make() 把生成的 10 个 User 数据封装成 Laravel 中的集合对象。
  • ->each() 是 Laravel 集合中的函数,each 函数会针对集合中的每个元素进行操作。这里直接把数据保存到数据库。

好了,数据迁移和数据填充的基本操作也就这些了。更多复杂的用法。。。。也不一定能用上。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

  • 共3页:
  • 上一页
  • 3/3下一篇
    上一篇:PHP 闭包获取外部变量和global关键字声明变量的区别讲解 下一篇:linux下的php-fpm参数配置介绍与参数优化说明

    相关文章

    最新文章