【问题标题】:Laravel raw query and including model relationsLaravel 原始查询并包含模型关系
【发布时间】:2017-10-01 02:37:04
【问题描述】:

我正在尝试返回带有子查询的单个帖子,以包含反对票和赞成票的计数。我可以通过使用原始查询来实现这一点。

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

是否有更多的 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];

【问题讨论】:

  • 使用Posts::setect->where(function($subquery) {})
  • 您可以将 raw 与 Eloquent 模型一起使用,例如 post::raw("sql query")->with("relation")

标签: php mysql laravel eloquent


【解决方案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();

【讨论】:

  • 这对我来说效果很好。正如@DivyankMunjapara 评论的那样,我本可以在查询末尾添加->with('relation)。但是我发现这种方法更雄辩。在我的情况下,我唯一需要改变的是 whereIn()where 因为我只查询一个帖子。
  • 我有一个给你(也许我应该打开另一个问题?)。使用上面的示例,我将如何将 posts_votes 计数应用于 $posts->children()
  • @patskot 你可以将所有选择添加到孩子。 $posts->children()->select($all)->addSelect($upvotesquery)->addSelect($downvotequery)->get()。在这种情况下,我会在您的 Post 模型上创建一个范围。 scopeUpDownVotes() 例如
  • 为模型创建一个可重用的范围创造了奇迹!感谢您的帮助:)
【解决方案2】:

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

我设法这样解决它:

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

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

在 Laravel 6.17.0 上测试

【讨论】:

    猜你喜欢
    • 2015-04-09
    • 2014-01-18
    • 2019-09-12
    • 2021-09-18
    • 2021-03-22
    • 1970-01-01
    • 2017-08-17
    • 2021-01-05
    相关资源
    最近更新 更多