3分钟短文:看傻眼!Laravel给数据库造假竟成工具链

简介: 一刀99999条数据

引言

上一章我们了解了使用laravel迁移功能创建数据库表,把DBA的工作挪到开发端,这样把岗位都省出来了。
但是只有光秃秃的数据库表,有个壳子没有数据确实没啥用。本文为大家讲讲laravel怎么给数据库造假数据,堂而皇之地假装生产。

img

本文使用的构建方式都是写脏数据,乱数据,无实质意义的数据,只对应用程序和数据库有用,别的嘛用没有!

代码时间

就好比说种地要有种子,有了种子就可以长出庄稼和粮食;子子孙孙无穷尽也。
数据库也一样,数据库表就好比是地,种地我们得有种子,才能在命令行这样使用:

php artisan migrate --seed

或者让数据库一切从头开始,旧的数据清空,然后填充:

php artisan migrate:fresh --seed

这是针对所有的迁移和所有的种子文件而言的,如单独指定种子文件,可以这样做:

php artisan db:seed
php artisan db:seed --class=VotesTableSeeder

上一章我们算是把地给准备好了,下面就开始准备一袋种子,使用命令行脚手架指令:

php artisan make:seeder ContactsTableSeeder

上述指令会生成文件 database/seeds/ContactsTableSeeder.php

为了把种子文件引入使用,在 database/seeds/DatabaseSeeder.php 文件内添加如下代码:

public function run()
{
    $this->call(ContactsTableSeeder::class);
}

然后手动实现 ContactsTableSeeder 类的 run() 方法:

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class ContactsTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('contacts')->insert([
            'name' => 'Tom Hanks'
            'email' => 'tomhanks@gmail.com',
        ]);
    }
}

看到这儿大家应该熟悉了吧,原生的数据库CRUD操作,直接指定表名,并 insert 插入一条新的数据。就这么简单,就这么一个动作。
但是,上面的方式,只能创建一条数据,我们要造假,怎么也得大规模造假,大规模的数据吧。

模型工厂

说一个高深玄乎的概念吧,听上去高大上,其实用法超简单。

模型工厂!

这个是啥,就是生产模型的工厂。模型好比一个模具,有了模具,在工厂里可以加工出来数以千计数以万计的产品。
模型工厂就是这么个用法。

还是使用命令行脚手架创建:

php artisan make:factory ContactFactory --model=Contact

上述指令会在 database/factories 目录下创建一个php文件 ContactFactory.php,我们指定是给 contacts 表
对应的 Contact 模型文件生产数据的。

在文件内添加如下代码:

use APP\Contact;
use Faker\Generator as Faker;

$factory->define(Contact::class, function (Faker\Generator $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->email,
    ];
});

这个文件为啥长这样?为什么这么写?类不类,方法不方法,函数不函数的!没错,就是一个代码片段,laravel约定的东西,
你这么写,在执行数据填充和测试的时候,它就起作用!就这么神奇。

那如何控制填充条数呢?只要在需要填充数据的地方调用工厂类即可:

$contact = factory(Contact::class)->create();

这是一条数据,可以指定创建 500 条:

factory(Contact::class, 500)->create();

怎么理解呢,就是我们创建了模型工厂类 ContactFactory,然后使用 factory 快捷函数进行实例化调用,并使用工厂类内的数据,
对每个模型发起N次指定方法的调用。

OK,模型工厂有很多奇思妙想的玩法,对于本文就简单说到这儿吧。

写在最后

本文介绍了使用laravel的Seeder进行数据填充,为了高效填充,我们介绍了工厂模式,这个高级玩意儿,确实用法有点偏,本不在五行八卦之列。希望大家用的开心。

Happy coding :-)

我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者

相关文章
|
4月前
|
NoSQL 关系型数据库 MySQL
|
JSON PHP 数据库
PHP:Laravel cast array json数据存数据库时unicode 编码问题和update更新不触发数据转换
PHP:Laravel cast array json数据存数据库时unicode 编码问题和update更新不触发数据转换
166 0
|
SQL 关系型数据库 程序员
|
SQL 关系型数据库 MySQL
|
2天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
10 3
|
2天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
13 3
|
2天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
18 2
|
15天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
101 15
|
9天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。