将原始查询添加到雄辩的关系中

时间:2018-09-16 17:03:45

标签: php mysql laravel eloquent laravel-5.6

我正在Laravel 5.6中开发一个应用程序,我有一个包含以下各列的简单表:

company_id    project_id    company_role_id    company_specialisation_id

这代表模型AssociateCompanies,它具有companyprojectrolespecialisation的关系,现在我有一些查询来获取属性:

$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_idspecialisation_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}} = companiesidproject_associate_companycompany_id为空},从project_associate_companydeleted_atassociated_projects_count。{ {1}} = companiesproject_associate_company并存在(从company_id的{​​{1}}内部联接companies中选择*。id = {{1 }}。projects,其中project_owner_relationprojects = idproject_owner_relationproject_id = lodha-patel-estate-tower-ab-孟买和companiesid为空)和project_owner_relationcompany_id为空)和slugprojects为空,按{{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_atcompany_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_companyproject_associate_company,其中companiesid = project_associate_company。{{1 }}并存在(从company_id的{​​{1}}内部联接project_associate_company中选择*。deleted_at = associated_projects_countcompanies其中project_associate_companycompany_id = companiesidprojects = lodha-patel-estate-tower-ab-孟买和project_owner_relationprojects为空)和idproject_owner_relation为空)和project_idcompanies为空)”

建议我更好的方法来获得此。谢谢。

1 个答案:

答案 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。