From 485f4c3b18cd49793d540030b7a1fdf0f0ac26c6 Mon Sep 17 00:00:00 2001 From: Turnerj Date: Sun, 26 Apr 2015 18:32:02 +0930 Subject: [PATCH] Combine extrafield information into one query Replaces the SQL query per-extrafield to one where all the data is requested. --- model/ManyManyList.php | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/model/ManyManyList.php b/model/ManyManyList.php index ddf745079..7c4f7a4a7 100644 --- a/model/ManyManyList.php +++ b/model/ManyManyList.php @@ -362,17 +362,21 @@ class ManyManyList extends RelationList { user_error('ComponentSet::getExtraData() passed a non-numeric child ID', E_USER_ERROR); } - // @todo Optimize into a single query instead of one per extra field if($this->extraFields) { - foreach($this->extraFields as $fieldName => $dbFieldSpec) { - $query = new SQLQuery("\"{$fieldName}\"", "\"{$this->joinTable}\""); - if($filter = $this->foreignIDWriteFilter($this->getForeignID())) { - $query->setWhere($filter); - } else { - user_error("Can't call ManyManyList::getExtraData() until a foreign ID is set", E_USER_WARNING); - } - $query->addWhere("\"{$this->localKey}\" = {$itemID}"); - $result[$fieldName] = $query->execute()->value(); + $cleanExtraFields = array(); + foreach ($this->extraFields as $fieldName => $dbFieldSpec) { + $cleanExtraFields[] = "\"{$fieldName}\""; + } + $query = new SQLQuery($cleanExtraFields, "\"{$this->joinTable}\""); + if($filter = $this->foreignIDWriteFilter($this->getForeignID())) { + $query->setWhere($filter); + } else { + user_error("Can't call ManyManyList::getExtraData() until a foreign ID is set", E_USER_WARNING); + } + $query->addWhere("\"{$this->localKey}\" = {$itemID}"); + $queryResult = $query->execute()->current(); + foreach ($queryResult as $fieldName => $value) { + $result[$fieldName] = $value; } }