Laravel 5.5 withで特定カラムを取得する

こんにちは!ふっくんです。

Laravelを使用されている方なら with メソッドには随分お世話になっていることでしょう。
今回は with で特定のカラムのみを取得する方法をご紹介します。

with の復習

初めに、 with について復習しておくと リレーションシップのテーブルのレコードを取得してくれる メソッドですね!

例えば、以下のようなテーブルがあるとしましょう。

groups

id group_name
1 teamA
2 teamB

users

id group_id user_name age
1 1 userA 24
2 1 userB 29
3 2 userB 22

そして、以下のようなモデルがあるとします。

Group.php

class Group extends Model
{
    public function users()
    {
        return $this->hasMany(User::class);
    }
}

User.php

class User extends Model
{
    public function group()
    {
        return $this->belongsTo(Group::class);
    }
}

この2つのモデルは groups が参照先、 users が参照元となっております。(groups : users = 1 : 多)

このモデルに対して、 GroupController.php で以下のように書くと、

Group::with('users')->get();

レスポンスは、以下のようになります。

[
  {
    id: 1,
    group_name: "teamA",
    users: [
      {
        id: 1,
        group_id: 1,
        user_name: "userA",
        age: 24
      },
      {
        id: 2,
        group_id: 1,
        user_name: "userB",
        age: 29
      }
    ]
  },
  {
    id: 2,
    group_name: "teamB",
    users: [
      {
        id: 3,
        group_id: 2,
        user_name: "userC",
        age: 22
      }
    ]
  }
]

これが、 with の役割です。

with で特定カラムのみを取得する

さて、ここからが本題です。
上記のように、リレーションシップのテーブルのレコードを取得できたけど 全カラムは必要ない!!! という時がしばしばあります。
では、上記のデータ構造を前提として、 groups に紐づく users のレコードの中から user_name のみを取得してみましょう。
GroupController.php で以下のように書いてみてください。

Group::with('users:group_id,user_name')->get();

すると、レスポンスは以下のようになります。

[
  {
    id: 1,
    group_name: "teamA",
    users: [
      {
        group_id: 1,
        user_name: "userA",
      },
      {
        group_id: 1,
        user_name: "userB",
      }
    ]
  },
  {
    id: 2,
    group_name: "teamB",
    users: [
      {
        group_id: 2,
        user_name: "userC",
      }
    ]
  }
]

はい!できました!!

with の中を解説しておくと、
group_id が外部キー
user_name が取得したいカラム
になります。

ハマったところ

特定カラムを取得する方法はすぐにググると見つかったのですが、ハマった点がありました。
上記のような書き方をしても with の中身が カラム名 で値が返ってくるのです。。。
こんな感じで。

[
  {
    id: 1,
    group_name: "teamA",
    users: [
      {
        group_id: 1,
        user_name: " user_name",
      },
      {
        group_id: 1,
        user_name: " user_name",
      }
    ]
  }
]

Why?????

その時のコードはこんな感じでした。

Group::with('users:group_id, user_name')->get();

え?何が違うの?????

みなさんわかりましたか?
users:group_id の後ろの , の後ろに 半角スペースが入っていた のです。
そんなのありかよ!!!(笑)
ってことで、何があっても、 半角スペースをいれないでください!!

あ、ちなみに

Group::with('users:group_id,id,user_name,age')->get();

という風に、カラムはいくつでも指定することができます。
いくつ指定してもいいですが 半角スペースをいれないでください!!

SNSでもご購読できます。

コメントを残す

*