2017-07-31 204 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

我以为你没有使用雄辩,所以我已经添加了我的答案 –