【发布时间】:2020-09-26 04:36:18
【问题描述】:
我正在我的Laravel 7.0 应用程序中构建一个小型搜索。我有两个模型 Project 和 Company 与 many to many 关系到 project_associate_company 中间表。
我的桌子是Project
******************** projects ***********************
| |
| id | name | area | cost | created_at | updated_at |
| 1 | Development Project | 1461 | 243 |2018-09-17 21:42:41|2018-09-17 21:42:41|
| 2 | Testing Project | 1500 | 200 |2018-09-18 21:42:41|2018-09-18 21:42:41|
公司模式:
******************** companies ***********************
| |
| id | name | state | type | created_at | updated_at |
| 1 | Demo company | Maharastra | Private | ..... | .... |
| 1 | Test company | Gujarat | Public | ..... | .... |
数据透视表(关系)表:
******************** project_associate_company ***************
| |
| id | project_id | company_id | role_id | specialisation_id |
| 1 | 1 | 1 | 1 | 1 |
| 2 | 1 | 1 | 2 | 2 |
| 3 | 2 | 1 | 1 | 1 |
| 4 | 2 | 2 | 1 | 1 |
| 5 | 1 | 2 | 4 | 2 |
|____________________________________________________________|
现在在我的控制器中我有:
$companies = Company::join('project_associate_company', function ($join) {
$join->on('companies.id', '=', 'project_associate_company.company_id')
->whereNull('project_associate_company.deleted_at');
})
->join('projects', function ($join) {
$join->on('project_associate_company.project_id', '=', 'projects.id')
->whereNull('projects.deleted_at');
})
->select('companies.*',
DB::raw('count(projects.id) as projects_count'),
DB::raw('count(DISTINCT projects.id) as unique_projects_count'),
DB::raw('SUM( projects.cost) as projects_cost'),
DB::raw('SUM( projects.area) as projects_area')
)
->groupBy('companies.id')
->orderBy('projects_area', 'desc')
->paginate();
预期结果:
| id | name | projects_count | unique_projects_count | projects_area | projects_cost |
| 1 | Demo company | 3 | 2 | 2961 | 443 |
| 1 | Test company | 2 | 2 | 2961 | 443 |
但结果生成:
| id | name | projects_count | unique_projects_count | projects_area | projects_cost |
| 1 | Demo company | 3 | 2 | 4422 | 686 |
| 1 | Test company | 2 | 2 | 2961 | 443 |
因此,每当我加入项目时,我都会得到重复的项目,这些项目在 CRUD 操作期间根据角色和专业化添加多个。我需要有DISTINCT 项目,我可以在其中总结其面积和成本,以便我可以对它们进行排序。目前我有不同的projects_count 和unique_projects_count
我尝试过groupBy('companies.id')->groupBy('projects.id'),但结果出错了。我怎样才能做到这一点?
【问题讨论】:
-
如果可以,请分享一些数据和预期结果
-
@user3532758 我已经添加了虚拟数据,希望这可以为您提供清晰的信息。
-
你为什么不把不同的
project.cost相加?如DB::raw('SUM(DISTINCT projects.cost) as projects_cost'),和区域一样。它应该可以工作,而无需更改您的查询。 -
@user3532758 因为
projects可以有相似的数字。可能是两个项目可以有相同的area和cost,我想总结它们,因为它们是不同的project,我只想通过projects.id来区分。 -
啊,我明白了。在这种情况下,我还会在发布的答案中提出解决方案。我相信您可以将其转换为雄辩的,但如果您需要帮助,请在此处联系我。 :)