php - 将原始查询添加到雄辩的关系
问题描述
我正在开发一个应用程序,Laravel 5.6
我有一个包含以下列的简单表格:
company_id project_id company_role_id company_specialisation_id
这表示模型AssociateCompanies
,它的关系为company
, project
, role
,specialisation
现在我有一些查询来获取属性:
$companies = AssociateCompany::whereHas('company', function ($q) use ($request) {
$q->whereHas('projectOwners', function ($q) use($request) {
$q->where('slug', $request->slug);
});
})->groupBy('company_id', 'company_specialisation_id')->with('company', 'role', 'specialisation');
我想从两列company_id
和收集所有唯一字段及其计数specialisation_id
,但groupBy
没有给我正确的结果,所以我无法继续进行:
SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“conxn.project_associate_company.id”;这与 sql_mode=only_full_group_by (SQL: select * from
project_associate_company
where exists (select , (select count( ) fromproject_associate_company
wherecompanies
.id
=project_associate_company
.company_id
andproject_associate_company
.deleted_at
is null) asassociated_projects_count
fromcompanies
whereproject_associate_company
.company_id
=companies
.id
and exists (select * fromprojects
inner joinproject_owner_relation
onprojects
.id
=project_owner_relation
.project_id
其中companies
.id
=project_owner_relation
.company_id
和slug
= lodha-patel-estate-tower-ab-mumbai 和projects
.deleted_at
为空)和companies
。deleted_at
为空)和project_associate_company
。deleted_at
是空组,由company_id
,company_specialisation_id
)"
所以我尝试运行这样的原始查询:
$companies = AssociateCompany::whereHas('company', function ($q) use ($request) {
$q->whereHas('projectOwners', function ($q) use($request) {
$q->where('slug', $request->slug);
});
})->selectRaw(DB::raw('COUNT(*) AS count GROUP BY company_id , company_specialisation_id'))
->with('company', 'companyRole', 'specialisation')->get();
SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以
project_associate_company
在第 1 行的 'GROUP BY company_id , company_specialisation_id from ' 附近使用正确的语法(SQL:select COUNT(*) AS count GROUP BY company_id , company_specialisation_id fromproject_associate_company
where exists (select , ( select count( ) fromproject_associate_company
wherecompanies
.id
=project_associate_company
.company_id
andproject_associate_company
.deleted_at
is null) asassociated_projects_count
fromcompanies
whereproject_associate_company
.company_id
=companies
.id
and exists (select * fromprojects
inner joinproject_owner_relation
onprojects
.id
=project_owner_relation
.project_id
wherecompanies
.id
=project_owner_relation
.company_id
和slug
= lodha-patel-estate-tower-ab-mumbai 和projects
.deleted_at
为空)和companies
。deleted_at
为空)和project_associate_company
。deleted_at
一片空白)”
建议我更好的方法来获得这个。谢谢。
解决方案
最初我想注意你不能在“select”语句中“分组”。
所以你不能聚合非聚合列。这意味着分组字段可以有多个“角色”,因此您不能“加载”“角色”。查询应类似于以下之一:
AssociateCompany::whereHas('company', function ($q) use ($request) {
$q->whereHas('projectOwners', function ($q) use($request) {
$q->where('slug', $request->slug);
});
})->select('company_id', 'company_specialisation_id', \DB::raw('COUNT(*) as cnt'))
->groupBy('company_id', 'company_specialisation_id')
->with('company', 'specialisation');
或者 :
AssociateCompany::whereHas('company', function ($q) use ($request) {
$q->whereHas('projectOwners', function ($q) use($request) {
$q->where('slug', $request->slug);
});
})->select('company_id', 'company_specialisation_id', 'company_role_id', \DB::raw('COUNT(*) as cnt'))
->groupBy('company_id', 'company_specialisation_id', 'company_role_id')
->with('company', 'specialisation', 'role');
我的建议是这样的,但我认为您可以使用原始 MySQL 查询来解决它,而不是使用 Eloquent。
推荐阅读
- javascript - 使用 nodemailer 发送电子邮件
- python - Pandas DateTime 索引重采样不起作用
- node.js - NodeJS 的“https”库是否支持 DNS 故障转移?
- javascript - 如果我不知道 JSON 的结构是单个、数组或嵌套的深层结构,请在 JSON 中通过键和值查找对象
- html - Vue JS v-for循环显示图片,字符串插值导致错误
- python - 这段代码的 pygame 部分有什么问题?
- python - 如何使用 Flask-connexion 和 swagger-2.0 API 指定用于验证基本身份验证的函数
- apache-flink - Flink - RocksDB 中的 localdir 配置是什么?
- linux - 如何允许多个用户阅读 Letsencrypt 证书
- android - Glide 未加载托管在 s3 上的图像