1
0

More than 1 year has passed since last update.

Laravelのルートモデル結合(ルートモデルバインディング)でid以外のカラムを使用する

Last updated at Posted at 2022-04-26

ルートモデル結合の基本的な使い方

ルートモデル結合とは

モデルを取得する際に必要な定型処理のコードを減らすためのLaravelの機能です。

前提

以下の様なusersテーブルがあり、EloquentモデルのUserモデルを作成してあるものとします。

users
id - integer
name - string

ルートモデル結合の利用方法

ルートモデル結合を利用してUserモデルをidカラムの値で取得したい場合は以下のようなコードになります。
URLのルートパラメータの値{user}とクロージャの引数の変数名$userを一致させ、引数の型にEloquentモデルの型を指定します。

web.php
Route::get('users/{user}', function (User $user) {
    return $user; // idカラムの値で取得
});

そうすると、URLのパラメータの値と一致するidカラムの値を持ったUserモデルを簡単に取得出来るようになります。


/users/1と指定した場合は、idカラムの値が1のuserモデルを取得出来ます。

id以外のカラムを使用したい場合

idではなくnameカラムの値でモデルを取得したい場合、コードが少し長くなってしまいます。

web.php
Route::get('users/{name}', function (String $name) {
    $user = User::where('name', $name)->firstOrFail();
    return $user; // nameカラムの値で取得
});

ですが、Laravel7以降にはカラム名を変更できる便利な機能が用意されています。
{変数名:カラム名}といった形でURLのルートパラメータの値にカラム名を指定するだけです。

web.php
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メソッドを定義する方法もあります。

User.php
public function getRouteKeyName()
{
    return 'name'; // カラム名
}
web.php
Route::get('users/{user}', function (User $user) {
    return $user; // nameカラムの値で取得
});

Route::get('posts/{user}', function (User $user) {
    return $user; // nameカラムの値で取得
});

注意点

  • URLのルートパラメータの値とクロージャ(アクションメソッド)の引数の変数名を一致させる事が必要です。

  • nameカラムの値がユニークではない場合は、最初に見つかったUserモデルのみを取得します。
    ユニークキー制約を設定することを忘れないようにしましょう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0