VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
.env の有効な DB_CONNECTION 行の直下に、コメントアウトされた MySQL の接続ブロックが付属しています。あらゆる MySQL クライアントが期待するのと同じ、ホスト、ポート、データベース、ユーザー名、パスワードの形です。このコメントを外して実際の値を入れることが、統合のすべてです。このガイドでは、そのセットアップを最初から最後まで順に進めます。接続し、マイグレーションを実行し、Eloquent を通して読み書きします。
プロジェクトの作成
brew install php composer で両方がインストールされます。Homebrew の PHP 8.5 ビルドにはデフォルトで pdo_mysql と mysqli が含まれるため、MySQL 用の追加の拡張機能のセットアップは不要です。
データベースとユーザーの作成
アプリケーションをroot に向けるのではなく、専用のデータベースと範囲を絞ったユーザーを作成します。
接続の設定
.env を開き、DB_CONNECTION を sqlite から mysql に切り替えてから、接続の詳細を入れます。
127.0.0.1 に接続します。これは、上の CREATE USER ステートメントが権限を付与したのと同じホストです。VillageSQL は MySQL のドロップイン代替であるため、config/database.php にも .env のキーにも変更はありません。
config/database.php は、デフォルトで mysql 接続に 'strict' => true を設定します。これによりセッションは MySQL の標準的な strict SQL モードになります。
マイグレーションの実行
Laravel のデフォルトのマイグレーションは、users、cache、および jobs テーブルを作成します。設定した接続に対して実行します。
posts テーブル用に、独自のマイグレーションを持つモデルを生成します。
title 列と body 列を追加します。
Eloquent とマスアサインメント保護
Laravel の Eloquent モデルは、フィールドが$fillable に列挙されていない限り、デフォルトでマスアサインメントをブロックします。
id、created_at、および updated_at は意図的に除外されています。create() に id を渡してもエラーにはならず、値も上書きされません。Eloquent は $fillable にないキーを黙って捨てます。
999 ではなく、次の auto-increment 値を受け取りました。これは、store() メソッドがリクエストボディを直接受け取る場合に重要です。$fillable で列を絞らないと、クライアントが id やタイムスタンプのフィールドを渡し、それがそのまま受け入れられる可能性があります。$fillable はモデルを守ります。リクエストのバリデーションは別の関心事で、入ってくるデータの形を検査します。
ルートとコントローラー
Laravel 12 のデフォルトのスケルトンは、ルーティングを最小限に保ちます。routes/web.php がルートを持ち、bootstrap/app.php が、以前の Http/Kernel.php ファイルなしでミドルウェアと例外処理を設定します。コントローラーを生成します。
routes/web.php は Laravel のセッションベースの CSRF ミドルウェアの背後で動くため、プレーンな curl -X POST は、リクエストが CSRF トークンを持たないので 419 Page Expired で拒否されます。ブラウザ向けのフォームのルートでは、これは想定どおりです。実際のフォームは、hidden フィールドでトークンを送信します。フォームもトークンもなしで直接呼び出すためのルートでは、bootstrap/app.php でそのルートを除外します。
エンドツーエンドの検証
組み込みサーバーを起動し、両方のルートを試します。テーブルには上の$fillable のデモで作った行がすでにあるため、index ルートはそれを返します。
よくある質問
Laravel はなぜ MySQL ではなく SQLite をデフォルトにするのですか?
最近の Laravel バージョンは、php artisan serve が設定なしで直ちに動くように、新しいプロジェクトのデフォルトを SQLite にしています。.env ファイルは、有効な DB_CONNECTION 行の直下に、コメントアウトされた MySQL の接続キーをそのまま持っています。MySQL への切り替えは、コメントを外して 5 つの値を入れるだけで、新しい設定セクションを書くことではありません。
Eloquent が VillageSQL で動くために特別な設定は必要ですか?
いいえ。VillageSQL は MySQL のドロップイン代替であり、同じワイヤプロトコルを話すため、Laravel のmysql ドライバー、その strict SQL モードの設定、およびそのクエリ文法はすべて変更なしで動きます。
$fillable とリクエストのバリデーションの違いは何ですか?
$request->validate() は、入ってくるリクエストからどのフィールドを受け入れるかを決め、不正な入力を 422 レスポンスで拒否します。モデルの $fillable は、create() または fill() に渡したフィールドのうち、どれが実際にデータベースに書き込まれるかを決めます。$request->validate() だけでは、別の場所のコントローラーが Post::create($request->all()) を呼ぶと、モデルはマスアサインメントに対して無防備なままです。$fillable は、どのコントローラーが呼んでもモデルを守ります。
トラブルシューティング
関連項目
- ORM で MySQL を使う: Django、Rails、および Prisma — 同じ接続レベルの設定と N+1 パターンを、ORM に依存しない視点から
- MySQL のスキーママイグレーション — Laravel のマイグレーションファイルが
ALTER TABLEの下でテーブルに行っていること - MySQL のコネクションプーリング — 実際のトラフィック下の Laravel アプリで永続接続を設定する