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

Posted

技术标签:

【中文标题】将原始查询添加到雄辩的关系【英文标题】:Adding raw query to eloquent relationship 【发布时间】:2019-02-20 17:05:33 【问题描述】:

我正在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 没有给我正确的结果,所以我无法继续进行下去:

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() from project_associate_company where companies.id = project_associate_company. company_idproject_associate_company.deleted_at 为空)作为 associated_projects_count from companies where project_associate_company.company_id = companies.id 并且存在(从连接 @987654346 中选择 * 987654347@ on projects.id = project_owner_relation.project_id 其中companies.id = project_owner_relation.company_idslug = lodha-umbai-tower-tower-和projects.deleted_at 为空)和companies.deleted_at 为空)和project_associate_company.deleted_at 为空组company_idcompany_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 服务器版本相对应的手册,以在第 1 行的 'GROUP BY company_id , company_specialisation_id from project_associate_company' 附近使用正确的语法(SQL:select COUNT(*) AS count GROUP BY company_id , company_specialisation_id from project_associate_company where exists (select , (select count() from project_associate_company where companies.id = project_associate_company.company_id and project_associate_company.deleted_at is null) as @ 987654375@ from companies where project_associate_company.company_id = companies.id 并且存在(从projects 中选择 * 内部连接project_owner_relation on projects.id.id。 987654386@ 其中companies.id = project_owner_relation.company_idslug = lodha-patel-estate-tower-ab-mumbai 和projects.deleted_at 为空4) 和@987654。 deleted_at 为空)和project_associate_company.deleted_at 为空)"

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

【问题讨论】:

【参考方案1】:

最初我想注意你不能在“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。

【讨论】:

以上是关于将原始查询添加到雄辩的关系的主要内容,如果未能解决你的问题,请参考以下文章

将原始查询转换为雄辩的 laravel

一个查询中的雄辩模型关系

雄辩的查询以返回按二级关系排序的项目

如何在 Laravel 雄辩关系中添加多个条件

雄辩地查询与嵌套 WHERE 的关系

laravel 雄辩的关系查询