Skip to content

Laravel 模型工厂类 批量生成数据 ​

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

之前写了一篇Laravel提高DB查询效率的文章,转发到群里后竟然有人质疑我说“Laravel是他好几年前用的框架,没想到现在还有人在用。”

纳尼,什么意思嘛?别忘了PHP是最好的语言!

个人认为Laravel是非常优雅的开发框架:优雅的设计模式、强大的功能实现、各种方便的扩展、持续的版本更新,更主要的是迄今为止我认为最优秀的技术开发社区。

我必须为Laravel打Call。

2020年9月8号,Laravel发布了8.0版本。 Laravel计划于2022年1月25日发布9.0版本。

下面我介绍一下目前Laravel最新版(8.0版本)的新特性:

Laravel 8 通过引入 Laravel Jetstream,模型工厂类,迁移压缩,队列批处理,改善速率限制,队列改进,动态 Blade 组件,Tailwind 分页视图, 时间测试助手,artisan serve 的改进,事件监听器的改进,以及各种其他错误修复和可用性改进,对 Laravel 7.x 继续进行了改善。

Laravel Jetstream ​

Laravel Jetstream 是为 Laravel 设计的精美的应用程序脚手架。Jetstream 为你的下一个项目提供了完美的起点,包括登录、注册、电子邮件验证、双因子认证、会话管理、通过 Laravel Sanctum 提供的 API 支持以及可选的团队管理。Laravel Jetstream 替代并改进了可用于早期版本的 Laravel 的旧式身份验证 UI 支架。 Jetstream 是使用 Tailwind CSS 设计的,你可以选择 Livewire 或 Inertia 脚手架。

模型类目录 ​

由于压倒性的社区需求,现在默认的 Laravel 框架包含一个 app/Models 目录。我们希望你喜欢 Eloquent 的新家!所有相关的生成器命令均已更新,假定模型存在于 app/Models 目录(如果存在)。如果该目录不存在,则框架将假定你的模型应放置在 app 目录。

模型工厂类 ​

模型工厂类由泰勒・奥特威尔(Taylor Otwell)贡献。 Eloquent 模型工厂 已完全重写为基于类的工厂,并有完美的关联支持。 例如 Laravel 中的 UserFactory 是这样写的:

php
<?php namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
class UserFactory extends Factory {     /**      * 工厂对应模型的名称。      *      * @var string      */     protected $model = User::class;
/**      * 定义模型的默认状态。      *      * @return array      */     public
function definition()     {
return [             'name' => $this->faker->name,             'email' => $this->faker->unique()->safeEmail,             'email_verified_at' => now(),             'password' => 'xxxxxxxxx', // password             'remember_token' => Str::random(10),         ];
}
}

由于在生成模型时可以使用新的 HasFactory trait,因此可以像以下方式使用模型工厂:

css
use App\Models\User; User::factory()->count(50)->create();

因为模型工厂现在是简单的 PHP 类,状态转换可以直接写成一个方法。除此之外,你也可以给你的 Eloquent 模型工厂添加任意你需要的工具类。

例如,你的 User 模型 有个 suspended 属性,现在你想修改它的一个默认的属性值,你可以使用基类工厂类的 state 方法来完成。方法名字可以随意设置,毕竟这是个很典型的 PHP 方法。

php
/**  * 表示这个用户处于禁止状态  *  * @return \Illuminate\Database\Eloquent\Factories\Factory  */ public
function suspended() {
return $this->state([         'account_status' => 'suspended',     ]);
}

定义好我们就可以这样使用:

css
use App\Models\User; User::factory()->count(5)->suspended()->create();

像之前说到的,Laravel 8 的模型工厂包含了对模型关联的完美支持。现在假定我们的 User 模型有一个 posts 关联方法,我们只需要执行下面的代码就可以生成一个有 3 篇文章的用户。

css
$users = User::factory()             ->hasPosts(3, [                 'published' => false,             ])             ->create();

为了简化升级过程,我们发布了一个 laravel/legacy-factories 扩展包,可以在 Laravel 8 中支持以前的模型工厂。

新版的模型工厂还包含了很多特性,想了解更多的话,请查看我后面更新的文档。

华丽的分割线 ​

要了解更多有关在Laravel的知识点,请查看我的专栏: 服务端开发从入门到精通

推荐阅读 ​

  1. 竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。(1)Laravel如何优雅的设置全局变量

  2. 竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。(2)Laravel Jetstream和模型工厂类

  3. 竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。(3)迁移压缩,队列批处理,改善速率限制

  4. 竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。(4)维护模式优化

  5. 竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。(5) 动态Blade 事件监听器优化 事件测试助手

  6. 竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。(6)

  7. 竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。(7)Laravel安装指南

  8. 竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。(8) 目录结构介绍

  9. 竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。(9) Laravel的部署

Last but not least ​

技术交流群请到 这里来。 或者添加我的微信 wangzhongyang0601 ,一起学习。

AI 应用开发训练营 · 现在开始

别只收藏 AI 文章,今天就做出第一个能上线的项目

文章解决认知,项目才证明能力。把 Agent、RAG、MCP 变成可运行、可展示、可面试表达的成果,现在就从一次岗位准备度自测开始。

立即开始 AI 岗位准备度自测 查看训练营路线
真实学员成果先看成果,再决定是否开始 →
  1. 01选方向
  2. 02做项目
  3. 03出成果
  4. 04拿面试