我正在尝试使用子查询返回单个帖子,以包括向下投票和向上投票的计数。我可以通过使用原始查询来实现这一点。
但这样做意味着我无法再访问帖子模型关系,例如评价。
我是否有更多雄辩的方法来保持模型关系?
还是有更好的方法可以解决整个问题?很想听听你会怎么做。
$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];
答案 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上测试