ちょっとメモするところがなかったので、Qiitaに書く。
昔Laravelで作ったモノをLaravel11で作り直したけど、マイグレーション忘れてたので備忘録的に書いてみる。
環境:Laravel11 を Docker Installation Using Sail で構築している。
参考:https://laravel.com/docs/11.x#docker-installation-using-sail
phpenvやら色々やろうとしたけど、これが最速で環境壊さないし楽。dockerもAppleシリコン対応したし。
本記事ではローカルにデータを落として、マイグレーションを実行しているが、
そも database を2つ持てるなら config/database.php
に定義してマイグレーション書くでよい。mysqldump やらリストアやらは不要。
事前準備
現状の mysqldump を取得する
それぞれの環境次第だけど、こんな感じ。ホストはおまけ。
mysqldump -h localhost -u root ra > mysqldump_ra_20240702.sql
で、マイグレーションするためのいろいろ
1. 現状の dump を docker の mysql の別 database に入れる
docker ps で mysql の名前を取得し、そこに dump を送る
docker cp mysqldump_ra_20240702.sql ra8-mysql-1:/tmp
2. docker の mysql に入って データベース作って リストアする
入り方は色々あると思うので省略
mysql -u root -p
mysql> create database laravel2;
mysql> GRANT ALL ON `laravel2`.* TO 'sail'@'%';
mysql> exit
mysql -u root -p laravel2 < /tmp/mysqldump_ra_20240702.sql
3. config/database.php に2つ目のmysql定義を作る
1つめからコピーしてきて、定義名とdatabase名のみ変更する
'mysql_old' => [
'driver' => 'mysql',
'url' => env('DB_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE2', 'laravel2'),
4. 2つめからデータを取得して1つ目にデータを入れるコマンドを作成する
参考: https://laravel.com/docs/11.x/artisan#generating-commands
php artisan make:command MigrateData
5. コマンドを作成する
DB:connection で過去のやつを引っ張ってきて新しいModelに入れてく感じ
public function handle()
{
$users = DB::connection('mysql_old')->table('users')->get();
foreach ($users as $old_user) {
$user = new User();
$user->name = $old_user->name;
$user->email = $old_user->email;
$user->password = $old_user->password;
$user->save();
6. DBを初期化して実行する
DBはfreshしたほうが色々楽。テストデータ消したくない場合は気をつけてね。
php artisan migrate:fresh
php artisan app:migrate-data
7. マイグレーションが終わったら dump 取得する
mysqldump -u root -p laravel > /tmp/mysqldump_ra_20240708.sql
8. docker からデータ持ってくる
docker cp ra8-mysql-1:/tmp/mysqldump_ra_20240708.sql ./
このファイルを本番で使う感じ。
tips
過去の APP_KEY が base64 じゃないので base64化する
base64 じゃない場合だけ。
$ php artisan tinker (動かない場合は composer require laravel/tinker 実行する)
$code = "Laravel6時代のapikey";
base64_encode($code);
コレを .env にセットして config:clear する
php artisan config:clear
その他
どこで何を実行しているのかは読める人を想定。
./vender/bin/sail
が面倒になったので docker 内から直接 php artisan
実行しているとか、書かないでもわかるよね。とか。