如何使用Eloquent在Laravel中编写以下的SQL查询?

3

我希望在Laravel中编写一个查询,以检索特定用户查看的所有帖子。 user_idpost_id 存储在名为WatchHistory的表中。

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未定义。

这个查询语句正确吗?WHERE user_id = user_id 是什么意思? - Sagar Gautam
2个回答

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();

希望这对您有用!!!!

实际上在提问之前我已经尝试过了。问题在于,虽然它在范围内被定义了,但我收到一个错误提示说user_id未定义。 - deltaforce
1
@SaviourTom 因为你需要在函数中像 use ($user_id) 这样使用这个变量,所以它会变成这样:function($query) use ($user_id)。顺便说一下,你投票选为最佳答案的回答是使用查询构建器而不是 Eloquent。 - Martin
我在想为什么它不起作用。非常感谢您的答案。@forexknight - deltaforce
哦!感谢@forexknight提醒我关于use()的注意事项。 - AddWeb Solution Pvt Ltd

2

试试这个方法,

如果您的用户ID存储在变量$user_id中,您可以这样做:

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

1
非常感谢您的回答。它有效了。但是我想使用Eloquent来优化性能。 - deltaforce
我以为你没有使用Eloquent,所以我添加了我的答案。 - Sagar Gautam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接