Laravel原始查询和包括模型关系

时间:2017-05-03 10:08:46

标签: php mysql laravel eloquent

我正在尝试使用子查询返回单个帖子,以包括向下投票和向上投票的计数。我可以通过使用原始查询来实现这一点。

但这样做意味着我无法再访问帖子模型关系,例如评价。

我是否有更多雄辩的方法来保持模型关系?

还是有更好的方法可以解决整个问题?很想听听你会怎么做。

$post = DB::select(
        "SELECT post.*, 
        (SELECT COUNT(*) FROM posts_votes 
        WHERE type = 1 
        AND post_id = posts.id) 
        AS up_votes, 
        (SELECT COUNT(*) FROM posts_votes 
        WHERE type = 2 
        AND post_id = posts.id) 
        AS down_votes 
        FROM posts 
        INNER JOIN posts_votes ON posts.id = posts_votes.post_id
        WHERE posts.id = ?", [$id])[0];

2 个答案:

答案 0 :(得分:1)

试试这个

Post::select('*')
->addSelect(DB::raw('
    (select count(*) 
    from posts_votes 
    where type = 1 
    and post_id = posts.id) 
    as up_votes
'))
->addSelect(DB::raw('
    (select count(*) 
    from posts_votes 
    where type = 2 
    and post_id = posts.id) 
    as down_votes
'))
->whereIn('id', $ids)
->get();

答案 1 :(得分:0)

这是一个古老的问题,但这是我在Google上搜索“ laravel关系原始查询”时获得的第一个结果,因此它对于正在搜索同一内容的其他人可能很有用。

我设法解决了这个问题:

$query = ""; //raw query goes here
$result = Model::fromQuery($query);
$result->load('relationship');

确保您的自定义原始查询包含模型中指定的正确列,否则关系将始终返回null。

在Laravel 6.17.0上测试