Skip to content

Instantly share code, notes, and snippets.

@NightJar
Created May 16, 2024 11:09
Show Gist options
  • Save NightJar/9a7bfc580e7ceefff635e81eb7c482cf to your computer and use it in GitHub Desktop.
Save NightJar/9a7bfc580e7ceefff635e81eb7c482cf to your computer and use it in GitHub Desktop.
Stop doing 1+N queries when using summary fields with relations (e.g. GridFieldDataColumns or GridFieldExportButton)
<?php
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\Queries\SQLSelect;
function alterListToSummaryFields(DataList $list): SQLSelect
{
$model = $list->dataClass();
$instance = $model::create();
$schema = DataObject::getSchema();
$summaryFields = $instance->summaryFields();
$dataQuery = $list->dataQuery();
foreach ($summaryFields as $description => $alias) {
$references = explode('.', $description);
$field = array_pop($references);
$fieldModel = $model;
if (!empty($references)) {
$fieldModel = $dataQuery->applyRelation($references);
}
$selectedFields[$alias] = $schema->sqlColumnForField(
$fieldModel,
$field,
$dataQuery->applyRelationPrefix($references)
);
}
$sqlQuery = $dataQuery->getFinalisedQuery();
$sqlQuery->setSelect($selectedFields);
return $sqlQuery;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment