学習用に所持しているサイトがあるのですが、最近そちらのインフラをconohaからAWSに移行したのち、PHPのバージョンを7.4 > 8.2へ、併せてLaravelのバージョンを6.xから11.xへと引き上げました。
とある作業でSeederを作成し、実行しようと思ったのですがうまく動作しなかったのでその備忘録となります。
なぜ動作しないか
Laravelのバージョンを11.xに引き上げたことで、周辺コードの記述が昔と変わっていることが原因の1つです。
下記は各バージョンで存在するDatabaseSeeder
に関するファイルですが、
ファイルの内容が異なるのはもちろん、Seederファイルを格納するためのフォルダ名にも違いがあります(.../seeds/
と.../seeders/
)。
最初からLaravel11.xをインストールした場合はこの部分で齟齬が発生することはないかと思いますが、バージョンを古いものから引き上げた際に作業に見落としがあった場合(自分です…)正しくSeederが実行できない挙動に遭遇するケースがあるようです。
動作するようにする
まずはフォルダの名前をseeds
からseeders
に変更します。
その後、DatabaseSeeder.php
の内容も上記URLを参考に11.xのものに上書きしましょう。
次にcomposer.json
も調整します。
"autoload": {
"psr-4": {
"App\\": "app/"
},
"classmap": [
↓古いバージョンだと "database/seeds"になっているので併せて直す
"database/seeders",
"database/factories"
]
},
調整後はcomposer dump-autoload
を実行して情報を更新してください。
実行後、作ったSeederがあるならphp artisan db:seed
で実行テストをします。
php artisan db:seed
INFO Seeding database.
Database\Seeders\thread\ReactionIconTableSeeder ............................................................ RUNNING
Database\Seeders\thread\ReactionIconTableSeeder ........................................................ 117 ms DONE
無事に動作しました!
備考
自分のファイルのメモです。名前空間で少し迷ったので改修などの参考になれば。
# database/seeders/DatabaseSeeder.php
<?php
namespace Database\Seeders;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*/
public function run(): void
{
// 自作したSeeder
$this->call(\Database\Seeders\thread\ReactionIconTableSeeder::class);
}
}
# database/seeders/thread/ReactionIconTableSeeder.php
<?php
namespace Database\Seeders\thread;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\ReactionIcon;
class ReactionIconTableSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
ReactionIcon::truncate(); // 指定モデルの情報を全て削除
$reaction_icons = [
[
// tableに入れたいものを書いていく
],
[
// ....
],
];
foreach ($reaction_icons as $reaction_icon) {
ReactionIcon::create($reaction_icon);
}
}
}
namespace
の変更やSeeder
を新規作成した場合、composer dump-autoload
で読み込みを忘れないよう!
コメント