1. ホーム
  2. php

[解決済み】Laravel EloquentのWith()関数で特定のカラムを取得する。

2022-03-31 12:09:08

質問

2つのテーブルがあります。 UserPost . 一つ User を多数持つことができます。 posts と1つの post が1つだけ属している user .

私の User モデルには hasMany リレーションを...

public function post(){
    return $this->hasmany('post');
}

そして、私の post モデルには belongsTo リレーションを...

public function user(){
    return $this->belongsTo('user');
}

では、この2つのテーブルを Eloquent with() が、2番目のテーブルから特定のカラムが必要です。クエリビルダを使えばいいのは分かっているのですが、そうしたくありません。

において Post モデルで書くと...

public function getAllPosts() {
    return Post::with('user')->get();
}

次のようなクエリを実行する...

select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)

でも、私が欲しいのは...

select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)

使うときは...

Post::with('user')->get(array('columns'....));

最初のテーブルからカラムを返すだけです。特定のカラムが欲しい場合は with() を2番目のテーブルから取得します。どうすればいいのでしょうか?

どのように解決するのですか?

さて、解決策が見つかりました。それは closure 関数を with() のように配列の2番目のインデックスとして使用します。

Post::query()
    ->with(['user' => function ($query) {
        $query->select('id', 'username');
    }])
    ->get()

のみが選択されます。 idusername を別のテーブルから取得します。私はこれが他の人の助けになることを願っています。


を覚えておいてください。 主キー (この場合 id) は、最初のパラメーターを指定する必要があります。 の中にある $query->select() を使用すると、実際に必要な結果を取得できます。