Skip to content

Instantly share code, notes, and snippets.

@jeromecoupe
Last active June 3, 2022 14:53
Show Gist options
  • Save jeromecoupe/b224567a3c88f43075e5b3fee32f3999 to your computer and use it in GitHub Desktop.
Save jeromecoupe/b224567a3c88f43075e5b3fee32f3999 to your computer and use it in GitHub Desktop.
When to eager load
{#
Use case a podcast website:
- programs (have asset and categories)
- episodes (relation source)
#}
{# get all programs Ids #}
{% set allProgramsIds = craft.entries()
.section("programs")
.limit(null)
.ids() %}
{# get all episodes Ids #}
{# avoids edge cases where a program would be deleted,
leaving episodes without relations, which crashes the system #}
{% set allEpisodesIds = craft.entries()
.section("episodes")
.limit(null)
.relatedTo(allProgramsIds)
.ids() %}
{# get all programs that have at least one episode (eager load image and category) #}
{% set allPrograms = craft.entries()
.section("programs")
.with([
"programImage",
"programThemes"
])
.relatedTo(allEpisodesIds)
.orderBy("title ASC")
.limit(perPage) %}
{# paginate programs #}
{% paginate allPrograms as pagination, programs %}
{# loop and include component #}
{% for item in programs %}
{% include "_components/program.twig" with {
entry: item
} only %}
{% endfor %}
@jeromecoupe
Copy link
Author

jeromecoupe commented Jun 3, 2022

Raw SQL query generated

SELECT elements.id, elements.canonicalId, elements.fieldLayoutId, elements.uid, elements.enabled, elements.archived, elements.dateLastMerged, elements.dateCreated, elements.dateUpdated, elements_sites.id AS siteSettingsId, elements_sites.slug, elements_sites.siteId, elements_sites.uri, elements_sites.enabled AS enabledForSite, entries.sectionId, entries.typeId, entries.authorId, entries.postDate, entries.expiryDate, content.id AS contentId, content.title, content.field_addressCity_lgwwikij, content.field_addressMapUrl_shkzfwbx, content.field_addressNumber_yvyhwguw, content.field_addressPostcode_kyllaptb, content.field_addressStreet_onetplkt, content.field_addressText_vtxwynxw, content.field_commonBody_ctnocsxo, content.field_commonMinimalBody_jurpvclp, content.field_companyEmail_haftzimf, content.field_companyName_ixgtcsgz, content.field_companyVAT_mdojpkus, content.field_episodeId_betqvldv, content.field_facebookUrl_hgylpkjx, content.field_teamFunction_gxxtfynl, content.field_instagramUrl_pmmelorh, content.field_liveUrl_fskopxgj, content.field_partnerName_yggixczj, content.field_teamName_ujaiubjt, content.field_navLabel_jrkmcjsy, content.field_episodeService_jyfxqfeb, content.field_programSchedule_nvnpxrpn, content.field_seoDescription_eufrflfu, content.field_seoTitle_nfqijwsa, content.field_commonShortSummary_lerfazkd, content.field_commonSummary_dnhcjfqu, content.field_homeSuptitle_vbzfeypc, content.field_teamSurname_ufmdmkvz, content.field_commonMediumTitle_lqbrwmuz, content.field_commonShortTitle_vpbyvdxy, content.field_commonTitle_nfzweczc, content.field_twitterUrl_egodmsrz, content.field_programUrlApple_yggnepfj, content.field_programUrlRss_ugljsupf, content.field_programUrlSpotify_vljheckj, content.field_partnerUrl_ifoqyqbi FROM (SELECT elements.id AS elementsId, elements_sites.id AS elementsSitesId, content.id AS contentId FROM elements elements INNER JOIN entries entries ON entries.id = elements.id INNER JOIN elements_sites elements_sites ON elements_sites.elementId = elements.id INNER JOIN content content ON content.elementId = elements.id WHERE (entries.sectionId=4) AND (elements.archived=FALSE) AND (((elements.enabled=TRUE) AND (elements_sites.enabled=TRUE)) AND (entries.postDate <= '2022-06-03 14:52:26') AND ((entries.expiryDate IS NULL) OR (entries.expiryDate > '2022-06-03 14:52:26'))) AND (elements.dateDeleted IS NULL) AND ((elements.id IN (SELECT sources17.targetId FROM relations sources17 WHERE sources17.sourceId IN ('366', '301', '160', '91', '89', '72', '34', '70'))) OR (elements.id IN (SELECT targets17.sourceId FROM relations targets17 WHERE targets17.targetId IN ('366', '301', '160', '91', '89', '72', '34', '70')))) AND (elements.draftId IS NULL) AND (elements.revisionId IS NULL) ORDER BY title LIMIT 18) subquery INNER JOIN elements elements ON elements.id = subquery.elementsId INNER JOIN elements_sites elements_sites ON elements_sites.id = subquery.elementsSitesId INNER JOIN entries entries ON entries.id = subquery.elementsId INNER JOIN content content ON content.id = subquery.contentId ORDER BY title

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment