ルートモデル結合の基本的な使い方
ルートモデル結合とは
モデルを取得する際に必要な定型処理のコードを減らすためのLaravelの機能です。
前提
以下の様なusersテーブルがあり、EloquentモデルのUserモデルを作成してあるものとします。
- users
- id - integer
- name - string
ルートモデル結合の利用方法
ルートモデル結合を利用してUserモデルをidカラムの値で取得したい場合は以下のようなコードになります。
URLのルートパラメータの値{user}
とクロージャの引数の変数名$user
を一致させ、引数の型にEloquentモデルの型を指定します。
Route::get('users/{user}', function (User $user) {
return $user; // idカラムの値で取得
});
そうすると、URLのパラメータの値と一致するidカラムの値を持ったUserモデルを簡単に取得出来るようになります。
例
/users/1と指定した場合は、idカラムの値が1のuserモデルを取得出来ます。
id以外のカラムを使用したい場合
idではなくnameカラムの値でモデルを取得したい場合、コードが少し長くなってしまいます。
Route::get('users/{name}', function (String $name) {
$user = User::where('name', $name)->firstOrFail();
return $user; // nameカラムの値で取得
});
ですが、Laravel7以降にはカラム名を変更できる便利な機能が用意されています。
{変数名:カラム名}
といった形でURLのルートパラメータの値にカラム名を指定するだけです。
Route::get('users/{user:name}', function (User $user) {
return $user; // nameカラムの値で取得
});
Route::get('posts/{user}', function (User $user) {
return $user; // カラム名を指定していないのでidカラムの値で取得
});
Laravel7以降のバージョンでは無い場合や、常にnameカラムの値で取得したい場合は、
UserモデルでgetRouteKeyNameメソッドを定義する方法もあります。
public function getRouteKeyName()
{
return 'name'; // カラム名
}
Route::get('users/{user}', function (User $user) {
return $user; // nameカラムの値で取得
});
Route::get('posts/{user}', function (User $user) {
return $user; // nameカラムの値で取得
});
注意点
-
URLのルートパラメータの値とクロージャ(アクションメソッド)の引数の変数名を一致させる事が必要です。
-
nameカラムの値がユニークではない場合は、最初に見つかったUserモデルのみを取得します。
ユニークキー制約を設定することを忘れないようにしましょう。