首页 > 解决方案 > 导入外部种子数据

问题描述

我希望将大量种子文件拆分为外部文件。

我如何 a) 设置外部文件和 b) 导入该文件。

我已经尝试对外部文件进行命名空间,但这似乎不起作用。

该文件位于我的种子目录中的一个文件夹内。

标签: laravel

解决方案


命名空间实际上是解决方案,但仅限于拆分文件。您仍然需要一个播种机来呼叫其他播种机。默认情况下,Laravel 有DatabaseSeeder.php

<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder {
  public function run() {
    $this->call(ExampleSeeder::class);
    ...
  }
}

ExampleSeeder是一个非命名空间文件,位于database/seeds/ExampleSeeder.php.

运行该命令php artisan db:seed将使用DatabaseSeeder.php该类来运行public function run(). 现在我们了解了这一点,我们可以添加“外部”种子。给定结构:

- database
  - seeds
    - external
      - ExternalExampleSeeder.php
  - DatabaseSeeder.php
  - ExampleSeeder.php

如果您尝试添加$this->call(ExternalExampleSeeder::class);,您将收到错误消息:

目标类 [ExternalExampleSeeder] 不存在。

要解决这个问题,您需要命名空间并导入种子:

// ExternalExampleSeeder.php
<?php
namespace App\Database\Seeds\External;
use Illuminate\Database\Seeder;
class ExternalExampleSeeder extends Seeder {
  ...
}

// DatabaseSeeder.php
<?php
use Illuminate\Database\Seeder;
use App\Database\Seeds\External\ExternalExampleSeeder;
class DatabaseSeeder extends Seeder {
  public function run() {
    $this->call(ExampleSeeder::class);
    $this->call(ExternalExampleSeeder::class);
    ...
  }
}

然后运行php artisan db:seed,那么它应该没有问题。

因此,解决方案是将DatabaseSeeder.php种子和默认种子保留为非命名空间,并在命名空间中导入这些种子database/seeds/external(或任何您的目录)。


推荐阅读