0

次のような 3 つのテーブルがあります。

**Users**
id

**Posts**
id
user_id

**Favorites**
id
user_id
post_id

現在、投稿を表示するためにクエリを実行すると、その行で投稿を作成したすべての関連ユーザーデータが取得されるようになりました。これは素晴らしいことです! しかし、私が今やろうとしているのは、認証済み (ログイン済み) のユーザーが投稿 (行) をお気に入りに追加したかどうかを確認するために追加することです。すべての投稿に対して再クエリを実行したくありません (N+1 問題と呼ばれると思いますか?)。私はLaravel4を使用しています

投稿モデル

class Post extends Eloquent{

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

ユーザーモデル

public function posts(){
    return $this->hasMany('Post');
}

投稿コントローラー

public function index()
{

    $posts = Post::with('user')->paginate(25);

    return View::make('index', compact('posts'));
}
4

2 に答える 2

1

Step 1. Add favorites relationship in Post model.

 public function favorites() {
    return $this->hasMany('Favorite');
 }

When querying the Model.

 $auth_user_id = Auth::user()->id;

 $posts = Post::with(array('user', 'favorites' => function($query) use ($auth_user_id){
    $query->where('user_id', '=', $auth_user_id);
 }))->get();

For more information refer to the eager load constraints,

http://laravel.com/docs/eloquent#eager-loading

于 2013-11-13T05:26:19.667 に答える
0

お気に入りテーブルをピボットとして使用して多対多の関係を追加することは、1 つの方法です。

User モデルにお気に入り関係を追加します。

public function favorites() {  
    return $this->belongsToMany('Post', 'favorites');  
}

次に、アクセスするだけですべてのお気に入りを取得できるはずです

Auth::user()->favorites

現在の投稿がお気に入りかどうかを調べるには、

$isFavorite = Auth::user()->favorites->has($post->id);
于 2013-11-13T09:27:43.390 に答える