Twinkle
Laravelデータベースマイグレーション技術
スキーマ変更時のダウンタイム回避テクニック
Laravelのafter()メソッドを使用した段階的なカラム追加は、本番環境でよく発生する問題を解決します。
一般的な問題
本番環境で新しいカラムを追加する際、既存のレコードに対してNOT NULL制約を設定すると、データベースエラーが発生することがあります。
解決方法
// マイグレーション 1: まずNULL許容で追加
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('phone_number')
->nullable()
->after('email');
});
}
// マイグレーション 2: デフォルト値を設定
public function up()
{
DB::table('users')
->whereNull('phone_number')
->update(['phone_number' => '未設定']);
}
// マイグレーション 3: NOT NULL制約を追加
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('phone_number')
->nullable(false)
->change();
});
}
メリット
- ダウンタイムなし: アプリケーションを停止せずにスキーマを変更できます
- データ整合性: 既存データへの影響を最小限に抑えます
- ロールバック可能: 各段階で問題が発生した場合、安全に戻せます
この技術により、大規模なデータベースでも安全にスキーマ変更が可能になります。
laravel/framework v11.47.0
https://github.com/laravel/framework/releases/tag/v11.47.0
JsonSchema Contract を 11.x ブランチにバックポートしました。
--promptモードでもMCPサーバー使えるようになったので結局全部ClaudeデスクトップアプリからCopilot CLIでの作業に変更。
毎日同じ作業なら手順をまとめたカスタムエージェントを作ってコピペするだけ。
copilot --agent=*** -p "..." --allow-all-tools
laravel/boost v1.8.3
https://github.com/laravel/boost/releases/tag/v1.8.3
変更内容
- FluxUIコンポーネントリストを更新
新規コントリビューター
- 初めての貢献がありました
laravel/framework v12.40.2
https://github.com/laravel/framework/releases/tag/v12.40.2
Laravel 12.x リリースノート要約
- 型キャストの最適化
- 欠落属性違反の呼び出し可能な型ヒントの改善
- 破棄属性違反の呼び出し可能な型ヒントの改善
- PostgreSQLの全文検索でnoモードのサポートを追加
- RedisStoreのscan()結果でブール値の失敗に対するガードを追加
- バッチチェーン後のCallQueuedClosureのdisplayNameを修正
- スケジュールタスクでLaravelコンテキストを渡す機能を追加
- テストの改善
- Eloquent Builder: HigherOrderBuilderProxyフィールドの補完機能を追加
- フォールバックルートを返すのではなくルートマッチングを継続するように修正
- 指定秒数だけキューを一時停止する機能を追加
- JSONスキーマコントラクトの追加
laravel/framework v12.40.1
https://github.com/laravel/framework/releases/tag/v12.40.1
- カラムの即座追加のサポートを追加
laravel/framework v12.40.0
https://github.com/laravel/framework/releases/tag/v12.40.0
Laravel 12.x リリースノート要約
新機能:
- スケジュールタスクに特定の日付を指定できる
daysOfMonth()メソッドを追加 - アップロードファイルの文字エンコーディングを検証する
encodingバリデーションルールを追加 Request::fluent()メソッドにデフォルトパラメータのサポートを追加- キュー機能に一時停止/再開機能を追加
- Google Antigravity IDEのサポートを追加
改善:
Str::replace()の戻り値の型を改善CachedStateプロパティをnull許容に変更QueriesRelationshipsの型ヒントを改善- 遅延ロード違反時のコールバック型ヒントを改善
- ルーティング関連のパフォーマンス最適化
Collection::sliding()メソッドにパラメータ検証を追加pathメソッドの戻り値の型を常に非null文字列に更新
バグ修正:
- PHP 8.5の非推奨機能への対応
- Redis Clusterでの
MemoizedStoreの問題を修正 - Redis Clusterでの
RedisTaggedCache関連の複数の問題を修正 - クローンされたメール内の埋め込み画像のContent-IDの不整合を修正
RateLimiterの残数が負の値にならないよう修正RequestException@report()がfalseを返すよう更新- Acceptヘッダー変更時のキャッシュ無効化を修正
- 数値キーと空のプレフィックスでの
MemoizedStore::manyの誤った結果を修正 - 複数の不安定なテストケースを修正
laravel/framework v11.46.2
https://github.com/laravel/framework/releases/tag/v11.46.2
リリースノート要約
- 同期キューでネストされたバッチが失敗した際の、チェーンキャッチの重複を回避
- Symfony 7.4 のサポートを追加
- Symfony 7.4 における
Request::getAcceptableContentTypes()の変更に対応
copilot-cli 0.0.363
--prompt付けるとMCPツールを使ってなかったけど今まで対応してないだけだった。
https://github.com/github/copilot-cli/releases/tag/v0.0.363
Claude Opus 4.5にも対応。安い。プレミアムリクエストがOpus4.1は10だったのがOpus4.5は3。今の使用量なら全部Opus4.5にしても大丈夫そう。
https://github.blog/changelog/2025-11-24-claude-opus-4-5-is-in-public-preview-for-github-copilot/
When using --prompt, it wasn't using MCP tools, but it turns out it just wasn't supported until now.
Now supports Claude Opus 4.5 too. It's cheaper. Premium requests were 10 for Opus 4.1, but only 3 for Opus 4.5. At my current usage level, it looks like I could switch everything to Opus 4.5 without any issues.
PHP8.5
一部のcomposerパッケージやXdebugが対応してないのでまだ待ち。
PHP8.5インストール(macOS/homebrew)
https://github.com/orgs/invokable/discussions/24
Laravel のマクロ機能を使ったコレクションの拡張
多くの開発者が知らない高度なテクニックとして、**Collectionクラスへのカスタムメソッド追加(マクロ)**があります。
実装方法
AppServiceProviderのbootメソッドで、独自のコレクションメソッドを定義できます:
use Illuminate\Support\Collection;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Collection::macro('toUpper', function () {
return $this->map(function ($value) {
return strtoupper($value);
});
});
Collection::macro('takeWhileInclusive', function ($callback) {
$result = collect();
foreach ($this as $item) {
$result->push($item);
if ($callback($item)) {
break;
}
}
return $result;
});
}
}
使用例
// 通常のコレクションとして使用
$names = collect(['john', 'jane', 'bob']);
$upperNames = $names->toUpper();
// ['JOHN', 'JANE', 'BOB']
// 条件付き取得
$numbers = collect([1, 2, 3, 4, 5, 6]);
$result = $numbers->takeWhileInclusive(fn($n) => $n >= 4);
// [1, 2, 3, 4]
メリット
- コードの再利用性が向上
- チェーンメソッドとして自然に使える
- プロジェクト全体で統一されたロジックを共有できる
- Eloquentのコレクションでも使用可能
この機能により、プロジェクト固有のビジネスロジックをエレガントに実装できます。
livewire/livewire v3.7.0
https://github.com/livewire/livewire/releases/tag/v3.7.0
主な変更点
バグ修正
- view:cache使用時のモーフマーカーの修正
- エラーモーダルをダイアログ要素に変更
- 戻るボタンのキャッシュ無効化がリセットされない問題を修正
- スマートwireキーのスナップショットエラーを修正
- ページネーションパスの修正
- コンポーネントが見つからないエラーを修正
- ネスト構文を使用した配列リセット時のmethod_exists()エラーを修正
- ナビゲーションプログレスバーがページロード時に完了するように修正
- Livewire.dispatch()に単一パラメータがある場合のエラーを修正
- オプションのルートパラメータの修正
- CSP nonceによるAlpine/Livewireインスタンス重複の修正
- カスタムWeb要素内のモーフの修正
- モーフ後のwire:currentの修正
- wire loadingの複数メソッドとパラメータの修正
機能追加・改善
- 公開スタブのドキュメント更新
- Testableのinvade()メソッドに戻り値のdocblockを追加
- withoutLazyLoadingをファサードdocblockに追加
- wire:streamの新しいコンテンツをDOMに挿入
- ナビゲーションのpreserve-scroll機能を追加
- デプロイメント無効化のためのリリーストークンを追加
- S3の一時アップロード/ダウンロードURLの書き換えに対応
- FileUploadControllerにデフォルトミドルウェアを追加
- wire:targetで複数のアクションパラメータをサポート
- wire:navigate.hoverのキャッシュを一時的に変更
- フォームクラス内のフック対応
- Flux用のファイル追加サポート
laravel/boost v1.8.2
https://github.com/laravel/boost/releases/tag/v1.8.2
主な変更点
- テストに不足していたopencodeを追加
- Geminiを追加
- MCP設定でCodex機能を拡張
- READMEを更新
- guzzleバージョンを7.9にダウングレード
- ユーザー定義のガイドラインを最上部に配置
laravel/boost v1.8.1
https://github.com/laravel/boost/releases/tag/v1.8.1
変更内容
- ガイドラインにSailサポートを追加
- CallToolWithExecutorのエラーを修正
新規コントリビューター
- 新たに1名がプロジェクトに初めて貢献
laravel/framework v12.39.0
https://github.com/laravel/framework/releases/tag/v12.39.0
リリースノート要約
ApplicationBuilder@withExceptions()の改善- ジェネレータで
--testオプション使用時に--forceをmake:testに引き継ぐ機能を追加 - Symfony 7.4での
Request::getAcceptableContentTypes()の変更に対応 - give属性で文字列バインディングを受け入れるように修正
- 並列テスト実行時に
WithCachedConfigが正常に動作するよう修正 - Tailwindページネーションのスタイルとアクセシビリティを更新
RequestExceptionでレポート前にメッセージを要約する機能を追加- 新しいBladeディレクティブ
@hasStackを追加 route:listコマンドに--middlewareフィルタを追加- RefreshDatabase使用時のインメモリSQLite接続の古いデータ問題を修正
ResourceCollection::$collectionプロパティをnullable型ヒントに変更Factory@insert()で配列キャストを許可するよう修正Http::pool()の型ヒントを改善