將所有新的播種器文件逐個手動添加到DatabaseSeeder.php文件中,是否可以自動運行種子目錄中的所有文件。那可能嗎?如何在laravel中自動運行數據庫/種子文件夾中的所有播種器?
PS:當然,在這種情況下(如@DissidentRage提到的),我們應該考慮是自動化這樣的過程可以讓你的播種機獨立,會導致很多麻煩了。
將所有新的播種器文件逐個手動添加到DatabaseSeeder.php文件中,是否可以自動運行種子目錄中的所有文件。那可能嗎?如何在laravel中自動運行數據庫/種子文件夾中的所有播種器?
PS:當然,在這種情況下(如@DissidentRage提到的),我們應該考慮是自動化這樣的過程可以讓你的播種機獨立,會導致很多麻煩了。
我在這個問題中運行,發現這種方式作爲一個簡單的答案。
您可以輕鬆使用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:如果您想更改排除字符dot出於任何原因。只需在if表達式前添加所需的排除字符(如下劃線字符prepend && $file[0] !== "_"
)。 不要更改$file[0] !== "."
表達式,因爲它擴展了scandir()方法。和..文件夾以及。
我不是一個downvoters,但我想象一個人不贊成的原因是因爲自動化你的播種列表意味着你冒着運行相互依賴的播種機失序的風險。需要考慮的事情。 –
謝謝@DissidentRage至少有人給出了反對票的理由。你其實是對的。一般來說,自動執行這些進程是件壞事,但我認爲這是因爲它處於開發模式,而且它實際上處於控制之下,我的意思是當您使用種子重置或重新創建數據庫時,您可以刪除最後一個文件並刷新。再次感謝您的評論。 – Skeletor