メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
新しい Laravel 12 プロジェクトには、.env の有効な DB_CONNECTION 行の直下に、コメントアウトされた MySQL の接続ブロックが付属しています。あらゆる MySQL クライアントが期待するのと同じ、ホスト、ポート、データベース、ユーザー名、パスワードの形です。このコメントを外して実際の値を入れることが、統合のすべてです。このガイドでは、そのセットアップを最初から最後まで順に進めます。接続し、マイグレーションを実行し、Eloquent を通して読み書きします。

プロジェクトの作成

これは Laravel 12 とその依存関係をインストールし、アプリケーションキーを生成し、デフォルトの SQLite データベースを作成します。そのため、アプリは設定なしで直ちに動きます。バージョンを確認します。
Laravel 12 には PHP 8.2 以降が必要です。PHP がまだインストールされていない macOS では、brew install php composer で両方がインストールされます。Homebrew の PHP 8.5 ビルドにはデフォルトで pdo_mysql と mysqli が含まれるため、MySQL 用の追加の拡張機能のセットアップは不要です。

データベースとユーザーの作成

アプリケーションを root に向けるのではなく、専用のデータベースと範囲を絞ったユーザーを作成します。

接続の設定

.env を開き、DB_CONNECTION を sqlite から mysql に切り替えてから、接続の詳細を入れます。
ここで Laravel は TCP で 127.0.0.1 に接続します。これは、上の CREATE USER ステートメントが権限を付与したのと同じホストです。VillageSQL は MySQL のドロップイン代替であるため、config/database.php にも .env のキーにも変更はありません。 config/database.php は、デフォルトで mysql 接続に 'strict' => true を設定します。これによりセッションは MySQL の標準的な strict SQL モードになります。
このモードの組み合わせは、VillageSQL に対して変更なしで動きます。互換性のために無効化したり回避したりする strict モードのフラグはありません。

マイグレーションの実行

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 ルートはそれを返します。
JSON レスポンスだけを信頼するのではなく、データベースに直接クエリして、両方の行が入ったことを確認します。

よくある質問

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 は、どのコントローラーが呼んでもモデルを守ります。

トラブルシューティング

関連項目