【问题标题】:How to add a sum of amount constraint in Laravel?如何在 Laravel 中添加金额约束的总和?
【发布时间】:2018-10-18 01:27:45
【问题描述】:

我有一个具有以下关系的数据库:

projects - 人们可以购买的东西,也有user_id

backers - 购买的人,

orders - 每个订单是Backer 购买的ProjectBacker 只能购买每个Project 一次)。这是一个金额 - 显示Backer 购买Project 所支付的费用

我需要编写以下查询 - 给定 $user_id$count$sum 找到所有至少投资于 $count 项目数量的支持者 user_id 等于 $user_id并且他们为这些项目购买的总和高于$sum

  Backer::whereHas('projects', function ($q) use ($sum, $userId){

        $q->where('user_id', $userId);

    }, '>=', $leastProjectCount)->get();

但它不限制购买的$sum

更新: 所以我想出了这个查询:

select  * from `backers` \r\n
                    WHERE id > 0 \r\n
                    AND (select count(*)\r\n
                           FROM `projects` \r\n
                           inner join `orders` on `projects`.`id` = `orders`.`project_id` \r\n
                           where `backers`.`id` = `orders`.`backer_id` \r\n
                           and `user_id` = 6 \r\n
                           and exists (\r\n
                               select * \r\n
                               from `tags` \r\n
                               inner join `project_tag` on `tags`.`id` = `project_tag`.`tag_id` \r\n
                               where `projects`.`id` = `project_tag`.`project_id` \r\n
                               and `id` in (27)\r\n
                           ) \r\n
                          ) >= 1 \r\n
                    AND (select sum(orders.amount)\r\n
                           FROM `projects` \r\n
                           inner join `orders` on `projects`.`id` = `orders`.`project_id` \r\n
                           where `backers`.`id` = `orders`.`backer_id` \r\n
                           and `user_id` = 6 \r\n
                           and exists (\r\n
                               select * \r\n
                               from `tags` \r\n
                               inner join `project_tag` on `tags`.`id` = `project_tag`.`tag_id` \r\n
                               where `projects`.`id` = `project_tag`.`project_id` \r\n
                               and `id` in (27)\r\n
                           ) \r\n
                          ) >= 12

请注意,子查询几乎相同,只是第一个使用COunt(*),第二个使用sum(orders.amount)。另请注意,如果设置了所有参数,则会运行此查询,但如果未设置某些参数,则它可能会更短。我遇到的问题是我没有对这样的查询进行分页。

【问题讨论】:

标签: mysql laravel eloquent


【解决方案1】:

试试这个:

Backer::whereHas('projects', function ($q) use ($sum, $userId){
    $q->where('user_id', $userId)
        ->havingRaw('SUM(amount) > ? ', [$sum]);

}, '>=', $leastProjectCount)->get();

【讨论】:

  • 这个查询没有对项目的订单进行分组。它只是检查每个项目的总和是否超过某个数量,而不是该支持者的订单总数。我已经试过了。
  • 您希望所有支持者的订单($userId)的总金额高于$sum,对吗?查询为我做到了。您可以发布一些不起作用的示例数据吗?
  • 你可以检查查询 - pastebin.com/JXA9xdqL,你看,它没有项目(订单)的分组,这样就没有什么可总结的了,它只需要相同的数量。
  • 它获取所有backer的订单数量并计算它们的总和。这不是你想要的吗?你试过这个确切的查询吗?
  • 您能否就答案提供反馈?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 2015-05-29
  • 2023-03-30
  • 2011-01-17
  • 2020-05-14
相关资源
最近更新 更多