而是将所有新的播种器文件逐个手动添加到DatabaseSeeder.php文件中,是否可以自动运行种子目录中的所有文件。这可能吗?
PS:当然(正如@DissidentRage所提到的)在这种情况下我们 考虑自动化此类流程可以使您的播种机独立并且也会造成很多麻烦。答案 0 :(得分:4)
我在那个问题中运行,发现这是一个简单的答案。
您可以轻松地使用scandir()将所有文件名放入数组中,然后使用foreach循环遍历它们。然后自动调用/运行它们。这样,每次创建(主要使用run()
)播种器时,您都不需要将新类添加到php artisan make:seeder SomeTableSeeder
方法。
所以相反:
// database/seeds/DatabaseSeeder.php
class DatabaseSeeder extends Seeder
{
public function run() {
$this->call(UsersTableSeeder::class);
$this->call(AnotherTableSeeder::class);
...
}
}
只需使用:
// database/seeds/DatabaseSeeder.php
class DatabaseSeeder extends Seeder
{
public function run(){
$files_arr = scandir( dirname(__FILE__) ); //store filenames into $files_array
foreach ($files as $key => $file){
if ($file !== 'DatabaseSeeder.php' && $file[0] !== "." ){
$this->call( explode('.', $file)[0] );
}
}
}
}
PS:如果要从此自动运行过程中排除播种器文件,只需在文件名的开头添加一个点。
PS2 :如果您因任何原因想更改排除字符点。只需在if表达式前加上你想要的排除字符(比如下划线字符前置&& $file[0] !== "_"
)。 不要更改$file[0] !== "."
表达式,因为它扩展了scandir()方法。和..文件夹。
答案 1 :(得分:1)
这是我用来自动执行修订的DatabaseSeeder.php
代码段,它允许您通过在类名前面添加数字版本来操纵顺序。
使用php artisan make:seeder
创建种子后,您可以重命名种子文件
<orginal-classname>.php
####-<orginal-classname>.php
不需要更改播种机的实际类名。
$seedFilePattern = '/([0-9]+)\-([a-z0-9_\-]+)\.php/i';
$files = scandir(dirname(__FILE__)); // Alphabetically sorted
foreach ($files as $key => $file) {
if (!in_array($file, ['.', '..', 'DatabaseSeeder.php', 'BaseSeeder.php'])) {
if (preg_match($seedFilePattern, $file, $matches)) {
[, $version, $class] = $matches;
$this->call($class);
} else {
echo '[WARNING] The file "' . $file . '" does not match the seeding pattern "' . $seedFilePattern . '", rename it accordingly to seed it automagically' . PHP_EOL;
}
}
}
给定项目的种子目录
0001-abcSeeder.php
0002-defSeeder.php
0003-ghiSeeder.php
...
0008-xyzSeeder.php
BaseSeeder.php
DatabaseSeeder.php
如果在开发期间需要在两者之间添加一些内容,则只需增加该版本的大小即可:00021
0001-abcSeeder.php
0002-defSeeder.php
00021-ForgotSomethingSeeder.php
0003-ghiSeeder.php
...
0008-xyzSeeder.php
BaseSeeder.php
DatabaseSeeder.php