我正在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
并没有给我适当的结果,因此我不愿意继续进行下去:< / p>
SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT列表的表达式#1不在GROUP BY子句中,并且包含未聚合的列'conxn.project_associate_company.id',该列在功能上不依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by不兼容(SQL:从存在的
project_associate_company
中选择*(从<{1}}选择{em>,从project_associate_company
中选择count()。{{ 1}} =companies
。id
和project_associate_company
。company_id
为空},从project_associate_company
到deleted_at
,associated_projects_count
。{ {1}} =companies
。project_associate_company
并存在(从company_id
的{{1}}内部联接companies
中选择*。id
= {{1 }}。projects
,其中project_owner_relation
。projects
=id
。project_owner_relation
和project_id
= lodha-patel-estate-tower-ab-孟买和companies
。id
为空)和project_owner_relation
。company_id
为空)和slug
。projects
为空,按{{1} },deleted_at
)“
所以我尝试运行像这样的原始查询:
companies
SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法有一个错误;请参见语法。检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的'GROUP BY company_id,company_specialisation_id from
deleted_at
'附近使用第1行(SQL:选择COUNT(*)AS count GROUP BY company_id,company_specialisation_id从{ {1}}存在的地方(选择,(从project_associate_company
中选择count(),其中deleted_at
。company_id
=company_specialisation_id
。{{1} }和$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();
。project_associate_company
为空),从project_associate_company
到project_associate_company
,其中companies
。id
=project_associate_company
。{{1 }}并存在(从company_id
的{{1}}内部联接project_associate_company
中选择*。deleted_at
=associated_projects_count
。companies
其中project_associate_company
。company_id
=companies
。id
和projects
= lodha-patel-estate-tower-ab-孟买和project_owner_relation
。projects
为空)和id
。project_owner_relation
为空)和project_id
。companies
为空)”
建议我更好的方法来获得此。谢谢。
答案 0 :(得分:1)
最初,我想注意到您不能在“选择”语句中进行“分组”。
因此,您不能聚合未聚合的列。这意味着分组的字段可以具有多个“角色”,因此您不能“加载”“角色”。查询应类似于以下之一:
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。