Laravel 之 Seeders添加数据

2018-10-28  本文已影响0人  IT小池

Laravel 可以用 seed 类轻松地为数据库填充测试数据。所有的 seed 类都存放在 database/seeds 目录下。你可以任意为 seed 类命名,但是应该遵守类似 UsersTableSeeder 的命名规范。Laravel 默认定义了一个 DatabaseSeeder 类。可以在这个类中使用 call 方法来运行其它的 seed 类来控制数据填充的顺序。

注意 laravel常用函数文件 :
  1. vendor/laravel/framework/src/Illuminate/Foundation/helpers.php
  2. vendor/laravel/framework/src/Illuminate/Support/helpers.php
命令

在laravel项目根目录下,执行如下:
php artisan 查看所有命令
php artisan help make:seeder 如:查看 Seeder 命令参数帮助

1.创建Seeders

可以通过运行 make:seeder [Artisan 命令]来生成一个 Seeder,如

php artisan make:seeder UsersTableSeeder

生成之后的文件存放在 database / seeds目录下。

2.factories / ModelFactory模型工厂

Faker是一个为您生成虚假数据的PHP库,Faker 官网:https://github.com/fzaninotto/Faker#populating-entities-using-an-orm-or-an-odm
使用 database / factories / ModelFactory 目录下的 ModelFactory文件模型工厂 文件模型工厂生成随机数据,如:

// 设置添加到数据库的随机数据
$factory->define(App\Users::class, function (Faker\Generator $faker) {
    return [
        'title' => $faker->sentence(2),
        'content' => $faker->paragraph(10),
        'user_id' => floor(mt_rand())
    ];
});

其中 App\Users::class 的 Users 是模型。

3.调用模型工厂

在步骤1生成的 seeder 文件中,进行调用步骤2编写好模型工厂,如:

public function run()
{
    factory(App\Users::class,50)->create();
}
4.调用 Seed

database / seeds 下的 DatabaseSeeder 类中调用编写好的 UsersTableSeeder,如:

public function run()
{
     $this->call(UersTableSeeder::class);
}
5.执行添加数据

在项目根目录下,打开 cmd ,执行

php artisan db:seed

也可以用 --class 选项来单独运行一个特定的 seeder 类:

php artisan db:seed --class=UsersTableSeeder

不知道命令,可以查看本文开头的命令,执行一下,看到 Seeding: PostsTableSeeder ,就添加数据成功了。

注意:

描述一个问题:
1.我先调用:
php artisan make:seeder AdminUserTableSeeder
2.生成一个 'AdminUserTableSeeder' 类,但是发现,应该命名为'AdminUsersTableSeeder',用户应该为复数。然后我就手动修改了文件&文件内部的类名。
3.执行:
php artisan db:seed
直接报错:
[ReflectionException] Class AdminUsersTableSeeder does not exist
解决方法:
composer dump-autoload或者,清除缓存 php artisan cache:clear / php artisan config:clear

随即想到,php artisan 命名,可能生成了一些 composer 相关的缓存,去 'vendor/composer/' 发现了几个autoload_xx.php文件,这里就是 composer 自动加载的文件列表!也同 'composer.json' 中的 'autoload' 的配置,有很大关联

上一篇下一篇

猜你喜欢

热点阅读