業務システムの PHP と Laravel のバージョンアップの調査・実装を 10 日間でやってみた 🚀

# はじめに

こんにちは！今回は、業務システムの **PHP 7.4 → 8.2**、**Laravel 6.x → 9.x** のバージョンアップを **10 日間で** 完了させた話を共有します。

業務システムのバージョンアップといえば **「工数がかかる」「影響範囲が広い」「テストが大変」** というイメージですが、**ChatGPT の活用、シェルスクリプトの自動化、効率的なテスト** によって、短期間での移行を実現しました！ 🎉

## **1. バージョンアップの目的**
- **PHP 7.4 の EOL（サポート終了）対応**
- **Laravel 6.x の LTS 期間終了に伴う移行**
- **最新のセキュリティ対策とパフォーマンス改善**
- **開発効率の向上（PHP 8.2 の新機能活用、型安全性の向上）**

## **2. 移行プロセス（10 日間のスケジュール）**
### **🗓 1～2日目：移行計画の策定**
1. **影響範囲を洗い出し**
   - コードベースの調査
   - 使用しているライブラリのバージョン確認（`composer outdated`）
   - PHP 8.2 / Laravel 9.x で非推奨・変更された機能のリストアップ

2. **移行方針を決定**
   - **モデル・ファクトリ・テストコードの変換をスクリプト化**
   - **Laravel 9.x で推奨される書き方に統一**
   - **影響範囲が大きい部分は段階的に適用**
   - **ChatGPT を活用し、Laravel 9.x の新しい仕様に即した変換ルールを整理**

### **🗓 3～5日目：コード変換**
**🛠 ChatGPT を活用しながら、シェルスクリプトで変換作業を効率化！**

#### **✅ `database/factories` の変換**
Laravel 6.x のファクトリ（クラスベースでない）を **Laravel 9.x の新しいファクトリに変換**。
- database/factories の convert 用のシェルスクリプトの実装と実行

#### **✅ `ModelClass` の変換**
- `fillables` や `casts` の整理
- **`hasOne` に複数の外部キー制約を適用**
- `awobaz/compoships` の導入により **複合キーのリレーションを簡単に管理**
- ModelClass の convert 用のシェルスクリプトの実装と実行

#### **✅ `TestClass` の変換**
- **`assertDeleted` の仕様変更**
- **型宣言の強化（`int` → `float` など）**
- **PHP 8.2 の新しい型チェックの適用**
- TestClass の syntaxChange 用のシェルスクリプトの実装と実行


### **🗓 6～7日目：リファクタリング**
#### **📌 メソッドの引数・返却値の型を厳格化**
```php
// 変更前（Laravel 6.x）
public function calculatePrice($amount) {
    return $amount * 1.1;
}

// 変更後（Laravel 9.x）
public function calculatePrice(float $amount): float {
    return $amount * 1.1;
}
```
**→ テスト時のエラーを未然に防ぎ、コードの安全性を向上！**

#### **📌 ChatGPT を活用**
- **`whereHas` & `with` の組み合わせ最適化**
- **Eloquent リレーションの変更点を整理**
- **データベースファクトリの `afterCreating` と `afterMaking` の挙動確認**
- **メソッドの引数順序の変更が必要な箇所をリストアップ**

### **🗓 8～9日目：テスト & デバッグ**
#### **📌 ChatGPT でエラーの原因を特定**
- `assertDeleted` が **テスト環境で正しく動作しない問題** を修正  
- `whereHas` の仕様変更に対応し、**条件付きリレーションの取得方法を整理**


### **🗓 10日目：最終確認**
#### **📌 主要な修正点**
- **ファクトリの `setConnection()` の適用**  
- **データベースファクトリの `afterCreating` と `afterMaking` の修正**  
- **リレーションの修正（`hasOne` の複合キー対応）**  
- **`whereHas` & `with` の組み合わせ最適化**  

## **3. ChatGPT の活用ポイント**
- **Laravel 6.x → 9.x の非互換リストを整理し、修正方針を策定**  
- **シェルスクリプトの変換ルールを定義し、自動化を効率化**  
- **Eloquent のリレーション設定を見直し、パフォーマンス最適化**  
- **テストエラーの原因特定 & 修正方法のアドバイスを取得**  
-  **最終的なコードレビューのポイントを整理し、修正の優先度を決定**  

## **4. 最終的なコミット一覧**
1. **設定ファイルの変更**  
1. **ModelClass の convert 用のシェルスクリプトの実装**
1. **ModelClass の convert 用のシェルスクリプトの実行**
1. **複数カラムの値の組み合わせに対して IN 句を使用できる機能を実装**  
1. **ファクトリの名前解決を行う拡張機能の追加**  
1. **database/factories の convert 用のシェルスクリプトの実装**
1. **database/factories の convert 用の修正**    
1. **database/factories の convert 用のシェルスクリプトの実行**  
1. **TestClass の syntaxChange 用のシェルスクリプトの実装**  
1. **TestClass の syntaxChange 用のシェルスクリプトの実行**  
1. **テストエラーの修正（UT/FT）**  
1. **メソッドの型チェックとリレーション最適化**
1. **convert 用のシェルスクリプトの削除**

**👉 結果、Laravel 6.x から Laravel 9.x への移行が完了！**

## **5. 最後に**
業務システムの Laravel のバージョンアップは **工数がかかる作業** ですが、**ChatGPT の活用、スクリプトの自動化（対象コードの8割が自動変換）、段階的な適用** によって、**10日間で移行完了** することができました！

もし、Laravel のバージョンアップを検討している方は、ぜひこの手法を参考にしてみてください！ 🚀🔥

この記事が役に立ったら、ぜひ「LGTM」してくれると嬉しいです！ 💖  
では、また次回の記事でお会いしましょう👋