280

私は2つのテーブルを持っていUserますPost. 1 つは複数User持つことができposts、1 つは 1 つpostだけに属しuserます。

私のUserモデルでは、hasMany関係があります...

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

そして、私のpostモデルではbelongsTo関係があります...

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

今、これらの 2 つのテーブルを結合したいEloquent with()のですが、2 番目のテーブルの特定の列が必要です。Query Builder を使用できることはわかっていますが、使用したくありません。

モデルで私が書くとき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 番目のテーブルを使用して特定の列が必要です。どうやってやるの?

4

20 に答える 20

463

さて、私は解決策を見つけました。のように配列の 2 番目のインデックスとしてclosure関数を渡すことで実行できます。with()

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

id他のusernameテーブルから選択するだけです。これが他の人に役立つことを願っています。


必要な結果を実際に取得するには、主キー (この場合は id) を の最初のパラメーターにする 必要があることに注意してください。$query->select()

于 2013-11-12T05:17:19.940 に答える
218

Laravel 5.5以降、次のようにすることができます:

Post::with('user:id,username')->get();

idフィールドの世話をし、ドキュメントforeign keysに記載されているように:

この機能を使用する場合は、取得する列のリストに常に id 列と関連する外部キー列を含める必要があります。

たとえば、ユーザーがチームに属しteam_id、外部キー列としてを持っている$post->user->team場合、指定しないと空になります team_id

Post::with('user:id,username,team_id')->get();

また、ユーザーが投稿に属している場合 (つまりpost_idusersテーブルに列がある場合)、次のように指定する必要があります。

Post::with('user:id,username,post_id')->get();

それ以外の場合$post->userは空になります。

于 2017-11-11T13:12:03.887 に答える
16

あなたのPostモデルでは:

public function userWithName()
{
    return $this->belongsTo('User')->select(array('id', 'first_name', 'last_name'));
}

今、あなたは使用することができます$post->userWithName

于 2016-06-22T02:11:51.670 に答える
6

特定の列を熱心にロードできる別の方法があります

public function show(Post $post)
{
    $posts = $post->has('user')->with('user:id,name,email,picture')->findOrFail($post->id);
    return view('your_blade_file_path',compact('posts);
}

あなたのPostモデルでは、user関係も持つ必要があります

public function user()
{
    return $this->belongsTo( User::class, 'user_id')->withDefault();
}

注: Laravel のドキュメントに記載されています。

https://laravel.com/docs/8.x/eloquent-relationships#eager-loading-specific-columns

于 2021-03-13T09:21:19.847 に答える
3

PHP 7.4 以降を使用している場合は、アロー関数を使用してそれを行うこともできます。

Post::with(['user' => fn ($query) => $query->select('id','username')])->get();
于 2021-01-31T12:16:52.900 に答える
2

estado_idを返さずに同じ回答をしたい

$this->cidade
->with('estado:id,nome')
->select(['id', 'nome', 'estado_id']);

select に estado_id を入力しない場合

{
      "id": 1100015,
      "nome": "Alta Floresta D'Oeste",
      "estado": null
}

select に estado_id を入力すると

{
      "id": 1100015,
      "nome": "Alta Floresta D'Oeste",
      "estado_id": 11,
      "estado": {
        "id": 11,
        "nome": "Rondônia"
      }
}

期待される

{
      "id": 1100015,
      "nome": "Alta Floresta D'Oeste",
      "estado": {
        "id": 11,
        "nome": "Rondônia"
      }
}
于 2021-12-22T09:51:07.480 に答える
0

したがって、他のソリューションと同様に、ここに私のものがあります。

// For example you have this relation defined with "user()" method
public function user()
{
    return $this->belongsTo('User');
}
// Just make another one defined with "user_frontend()" method
public function user_frontend()
{
    return $this->belongsTo('User')->select(array('id', 'username'));
}

// Then use it later like this
$thing = new Thing();
$thing->with('user_frontend');

// This way, you get only id and username, 
// and if you want all fields you can do this

$thing = new Thing();
$thing->with('user');
于 2020-12-18T13:51:27.547 に答える