渴望加载混乱。如何减少查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了渴望加载混乱。如何减少查询相关的知识,希望对你有一定的参考价值。

我可能会错过热切的加载点,但我想澄清一下。

当我运行以下查询时:

Capsule::connection()->enableQueryLog();

$result = Application::with([
    'country',
    'language',
])
->where('application.id', $applicationId)
->where('application.merchant_id', $merchantId)
->firstOrFail();

var_dump(Capsule::getQueryLog());
exit;

我得到输出:

string(100) "select * from `application` where `application`.`id` = ? and `application`.`merchant_id` = ? limit 1"
string(53) "select * from `country` where `country`.`code` in (?)"
string(55) "select * from `language` where `language`.`code` in (?)"

我期待生成的sql是一个带有少量连接的单个查询。

我意识到这不是n + 1问题。并且在这里执行三个查询而不是一个查询在性能方面实际上并不是一个大问题。但是我想知道如何将其减少到一个查询。我尝试使用join,但仍然导致三个查询:

string(316) "select * from `application` inner join `country` on `country`.`code` = `application`.`country_id` inner join `currency` on `currency`.`code` = `application`.`currency_id` inner join `language` on `language`.`code` = `application`.`language_id` where `application`.`id` = ? and `application`.`merchant_id` = ? limit 1"
string(53) "select * from `country` where `country`.`code` in (?)"
string(55) "select * from `language` where `language`.`code` in (?)"

所以我的问题是......

我怎样才能将这个问题归结为一个查询,并能够使用Eloquent之后的关系方面来获取应用程序的国家和语言数据?

如果这对你的答案有任何影响,我就不会使用Laravel Framework。我正在使用Slim 3。

答案

渴望加载应该像这样工作。

使用连接合并所有查询仅适用于一对一关系。如果您加入一对多或多对多关系,您将获得巨大的成果。

即使在像您这样的情况下,多个简单查询也可能比一个复杂查询更快(或至少不慢)。您还必须为所有列添加别名以处理重复的列名称(country.codelanguage.code等)。

以上是关于渴望加载混乱。如何减少查询的主要内容,如果未能解决你的问题,请参考以下文章

渴望加载生成较慢的查询

Simple.Data 渴望加载 SimpleQuery 对象

采摘渴望加载Laravel 5.2

如何渴望加载多态关系的不同嵌套关系?

如何在 SQL SERVER 中将内联 SQL 查询转换为 JOINS 以减少加载时间

如何渴望对同一张表加载多个belongsTo关系?