将原始查询添加到雄辩的关系
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
,它的关系为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
和project_associate_company
.deleted_at
为空)作为associated_projects_count
fromcompanies
whereproject_associate_company
.company_id
=companies
.id
并且存在(从连接 @987654346 中选择 * 987654347@ onprojects
.id
=project_owner_relation
.project_id
其中companies
.id
=project_owner_relation
.company_id
和slug
= lodha-umbai-tower-tower-和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 服务器版本相对应的手册,以在第 1 行的 'GROUP BY company_id , company_specialisation_id from
project_associate_company
' 附近使用正确的语法(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) as @ 987654375@ fromcompanies
whereproject_associate_company
.company_id
=companies
.id
并且存在(从projects
中选择 * 内部连接project_owner_relation
onprojects
.id
.id
。 987654386@ 其中companies
.id
=project_owner_relation
.company_id
和slug
= 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。
【讨论】:
以上是关于将原始查询添加到雄辩的关系的主要内容,如果未能解决你的问题,请参考以下文章