0

別のモデルに属するモデルが欲しいです。私のコントローラーでは、そのモデルのすべてのアイテムを取得したいのですが、それが属するテーブルの属性も必要です。例えば:

class Comment extends Eloquent {

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

}

私のコントローラーでは、次のようにしてコメント データを取得できます。

$comments = Comment::first();

ただし、それはコメントテーブルからのデータのみを提供します(投稿テーブルからの結合データは提供しません)。各コメントが属する行の posts テーブルのデータを、Comment モデルの属性として使用できるようにしたいと考えています。posts テーブルからデータを取得するには、次のこともできることを知っています。

$comments = コメント::first();

この方法の問題点は、2 つのデータベース クエリを使用することです (#1 はコメントを取得し、#2 はそれが属する投稿データを取得します)。結合ステートメントに相当する、両方のテーブルからモデルにデータを取得する方法はありますか?

SELECT * FROM comments LEFT JOIN posts ON comments.post_id = posts.id

Comment モデルまたは Post モデルを使用せずに結合クエリを手動で作成していることはわかっていますが、Comment モデルには、取得したデータで使用できるメソッドがいくつかあります。どうすればこれを達成できるか知っている人はいますか?

4

3 に答える 3

4

熱心な読み込みに関するドキュメントから:

ありがたいことに、熱心な読み込みを使用して、クエリの数を大幅に減らすことができます。積極的にロードする必要があるリレーションシップは、 with メソッドを介して指定できます [...]

このwith()パラメーターを使用すると、1 対多の関係で定数† のクエリが使用されます。したがって、このクエリは、コメントと関連する投稿を 1 つのクエリで取得する必要があります。

$comments = Comments::with('post')->get();

† コメント数ごとにクエリ数が直線的に増加するのではなく、一定数のクエリ

于 2013-09-11T12:54:19.103 に答える
1

を使用せずに、バックグラウンドで実行された 1 つのクエリのみで結果を取得する場合は、とwith()を使用できます。fluentjoin()

SELECT * FROM comments LEFT JOIN posts ON comments.post_id = posts.id

に等しい:

DB::table('comments')
    ->join('posts','comments.post_id','=','posts.id','left')
    ->get();

しかし、ステートメントを追加するgroupBy()と、より良い結果が得られると思います。

例:

DB::table('comments')
    ->join('posts','comments.post_id','=','posts.id','left')
    ->groupBy('comments.id')
    ->get();

しかし、私は自分のプロジェクトで他の答えを使用したいと思います:

Comment::with('post')->get();
于 2013-09-11T08:08:09.367 に答える