私は Laravel の Eloquent ORM を使用していますが、表示するアイテムを積極的にロードするのに問題があります。
シナリオは次のとおりです。
- ユーザーがブログをフォロー
- ブログには投稿があります
Relationships という名前のデータベース テーブルがあります。このテーブルは、ユーザー ID とブログ ID を格納して、どのユーザーがどのブログをフォローしているかを示すために使用されます。ブログを説明するブログ用のテーブルと、投稿用のテーブルがあります。Relationships テーブルは、Users と Blogs テーブルを一緒に接続するためのピボット テーブルになります。ここで、ユーザーがフォローしているすべてのブログからすべての投稿を一覧表示する必要があります。
ここに私のユーザーモデルがあります:
public function following() {
return $this->has_many_and_belongs_to('Blog', 'relationships', 'user_id', 'blog_id');
}
ここに私のブログモデルがあります:
public function followers() {
return $this->has_many_and_belongs_to('User', 'relationships', 'blog_id', 'user_id');
}
public function posts() {
return $this->has_many('Post');
}
これは、リスト内の投稿を取得しようとしている方法です:
$posts = User::with(array('following', 'following.posts'))
->find($user->id)
->following()
->take($count)
->get();
このコードは、実際のブログのみを一覧表示します。投稿が必要です。
ご協力ありがとうございます。詳細が必要な場合はお知らせください。
解決:
以下の受け入れられた回答を少し変更しました。JOINを使用して、SQL呼び出しの量を1回の呼び出しに減らすことにしました。ここにあります:
$posts = Post::join('blogs', 'posts.blog_id', '=', 'blogs.id')
->join('relationships', 'blogs.id', '=', 'relationships.blog_id')
->select('posts.*')
->where('relationships.user_id', '=', $user->id)
->order_by('posts.id', 'desc')
->take($count)
->get();