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();という風に、カラムはいくつでも指定することができます。 いくつ指定してもいいですが 半角スペースをいれないでください!!




