我可能错过了急切的加载点,但我想澄清一下。
当我运行以下查询时:
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框架,如果这对你的答案有任何影响。我使用的是Slim 3。
答案 0 :(得分:0)
渴望加载应该像这样工作。
使用连接合并所有查询仅适用于一对一关系。如果您加入一对多或多对多关系,则会获得巨大结果。
即使在像您这样的情况下,多个简单查询也可能更快(或者至少不是
比一个复杂的查询慢。)您还必须为所有列添加别名以处理重复的列名称(country.code
,language.code
等。)。