2017-07-31 235 views
3

我想在Laravel中編寫一個查詢來檢索特定用戶查看的所有帖子。 user_idpost_id保存在名爲WatchHistory的表中。如何使用Eloquent在Laravel中編寫以下SQL查詢?

SELECT * 
FROM Post 
WHERE post_id = (
    SELECT post_id 
    FROM WatchHistory 
    WHERE user_id = $user_id 
); 

我試過如下:

$posts = Post::whereIn('post_id', function($query){ 
     $query->select('post_id') 
      ->from(with(new WatchHistory)->getTable()) 
      ->where('user_id',$user_id); 
     })->get(); 

但它給我的變量USER_ID沒有定義的錯誤。

+0

此查詢是否正確? WHERE user_id = user_id是什麼? –

回答

3

你應該試試這個:

POST::whereIn('post_id', function($query) use($user_id){ 
      $query->select('post_id') 
       ->from(with(new WATHCHISTORY)->getTable()) 
       ->where('user_id',$user_id); 
      })->get(); 

希望這項工作你!!!!

+0

其實我在嘗試這個問題之前先試過。這裏的問題是,我得到一個錯誤,說user_id沒有被定義,雖然它是在範圍內定義的。 –

+1

@SaviourTom因爲你必須在'function($ query)'後面的'use($ user_id)'''中使用這個變量,所以它看起來像:'function($ query)use($ user_id)'。順便說一句,您已經投票選出的答案是最好的答案是使用查詢生成器,而不是雄辯。 –

+0

我在想爲什麼它不工作。非常感謝答案。 @forexknight –

2

試試這個,

如果你的用戶ID是可變$user_id,你可以不喜歡它,

DB::table('post')->whereIn('post_id', 
    DB::table('watchhistory')->where('user_id',$user_id)->pluck('post_id') 
)->get(); 
+1

非常感謝您的回答。有用。但我想使用雄辯,以優化性能。 –

+0

我以爲你沒有使用雄辯,所以我已經添加了我的答案 –