【Laravel】ルートモデル結合でid以外のキーを使う

こんにちは。今回はルートモデル結合でid以外のキーを使用する方法を解説します。ルートモデル結合の基礎知識がある前提で記述してます。ルートモデル結合とは何かを知りたい方は次の記事を参照してください。【Laravel 】ルーティングで全て完結?超速でAPI開発 ルートモデル結合

ルートの定義

ルートの定義方法を説明します。ルートパラメータを{モデル名:キー名}の形式で記述します。Userモデルのuser_cdをキーとして使用したい場合は{User:user_cd}と記述します。

// user_cdでUserのモデルを取得しメールアドレスを返す
Route::get('/users/{user:user_cd}', function(User $user) {
    return $user->email;
});

注意点 ユニーク制約以外の項目を指定する場合

実際にこのようなケースがあるか判りませんが、ユニーク制約以外の項目を検索キーに指定するとどうなるか実験してみました。今回はUserモデルのname項目を検索キーとして指定します。

// nameでUserのモデルを取得しメールアドレスを返す
Route::get('/users/{user:name}', function(User $user) {
	return $user->email;
});

artisan serveでローカルサーバーを立ち上げ、次のURLでアクセスしてみます。http://localhost:8000/usres/bob

結論から言うとbobは2人登録してありましたが、その内の1件取得できました。取得できたのはidが若いbobでした。どのような基準で取得できるのかは判りませんが、何度やっても同じ結果でした。おそらく内部的にfirstメソッドを使用しているような動きをしています。

ユニークキー制約以外の項目には使わないのが懸命ですね。

まとめ

モデル結合でid以外のキーを使用してモデルを取得するのは簡単です。ただしユニークキー制約を設定しているキーを使うようにしましょう。

Laravel

Posted by kobainmac