欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Laravel学习记录--数据填充

程序员文章站 2022-05-18 20:58:04
...

Laravel可以用seed类为数据库填充测试数据。所有的seed类被存放在database\seeds目录下。你可以任意为seed命名,但应该遵守类似UsersTableSeeder的命名规范。Laravel默认定义的一个DatabaseSeeder类,可以在这个类中使用call方法来运行其他的seed类,从而控制数据填充顺序
生成Seeder
使用命令 php artisan make:seeder MuserTableSeeder
Laravel学习记录--数据填充

一个seeder类只包含一个默认方法:run。这个方法会在Atrisan命令db:seed被执行时调用,在run方法里你可以根据需要在数据库中插入数据,你也可以有查询构造器或模型工厂来手动插入数据
运行填充命令
php artisan db:seed运行DatabaseSeeder类
php artisan db:seed --class=MuserTableSeeder运行独立的填充类
有些时候你希望在运行迁移命令时填充测试数据,这可以通过不指定值的 --seed选项实现
php artisan migrate --seed
php artisan migrate:refresh --seed
第一条命令会在执行迁移命令时运行填充器类DatabaseSeeder填充数据,第二条命令用于回滚所有迁移并重新运行迁移的同时填充初始化数据。

注意 在数据填充期间,批量赋值保护会被自动禁用

编辑填充器
通过命令创建填充器后,我们需要编辑其run方法设置要填充的数据,正如上面提到的可以使用查询构造器,也可使用模型工厂,这里我们先以查询构造器演示
1.设置Muser的填充器

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class MusersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('musers')->insert([
            'uname' => str_random(10),
            'unick' => bcrypt('secret'),
            'country_id'=>mt_rand(30,90)
        ]);
       
    }
}

2.DatabaseSeederrun方法使用call调用填充器

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

3.运行命令
php artisan db:seed
查看数据库
Laravel学习记录--数据填充
确实被填充了一条数据

使用模型工厂
每一次插入一条记录都要编写一条语句,或者手动插入数据是不是很麻烦?数据量小还好,如果数据量成千上万怎么办?显然上面的方法已经不能满足我们的需求,这里就出现了模型工厂,通过模型工厂可以自定义填充规则,自定义填充的记录数。
创建模型工厂
模型工厂存放在database/factories目录下,Laravel自带了一个用于填充User模型的模型工厂UserFactory

<?php

use Faker\Generator as Faker;

/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/

$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => str_random(10),
    ];
});

在这个模型工厂中通过$factory->define方法来定义User模型的模型工厂。该方法的第一个参数是模型类,第二个参数是一个匿名函数,在函数中通过Faker类提供的方法来自定义字段规则,$faker->name,生成用户名,$faker->unique()->safeEmail生成唯一的邮箱,最后将这些字段返回(更多Faker的字段规则)
调用模型工厂
在seed类中调用模型工厂使用辅助函数factory()指定模型类和填充次数,最后链式调用create()方法即可
该函数第一个参数为使用模型类,为哪一个模型填充数据,第二个参数为填充的次数
简单案例
通过模型工厂填充我们的tests表
1.通过迁移文件创建tests表(表结构如下)
Laravel学习记录--数据填充
2.创建模型工厂
database/factories 下创建一个关于Test模型的模型工厂,命名规则为 驼峰法(模型名Factory
如这里我们创建的TestModel的模型工厂那他的名称应该为TestFactory

<?php

use Faker\Generator as Faker;

/*


$factory->define(App\Test::class, function (Faker $faker) {
    return [
        'Ip'=>$faker->ipv4,
        'name'=>$faker->name,
        'sex'=>$faker->randomElement($array = array('男','女')),//随机取性别
        'email'=>$faker->email,
        'phone'=>$faker->phoneNumber,
        'city'=>$faker->city,
        'company'=>$faker->randomElement($array = array('华为','小米','乐视','网易')),//随机取公司
        'con'=>$faker->realText
        
    ];
});

3.调用模型工厂
database/seeds/DatabaseSeeder类的run方法使用factory调用对应的模型工厂
factory(模型类名,填充次数)由于我们遵从了他的命名规则,当我们输入第一个参数模型类名时,Laravel会自动加载该模型的模型工厂

public function run()
    {
    	factory(\App\Test::class,20)->create();
    }

4.运行填充命令,并查看数据库结果
php artisan db:seed

Laravel学习记录--数据填充

相关标签: laravel php