private function _loadFromQuery(Product $product = null) { if (null === $this->_queryBuilder) { throw new \LogicException('Cannot load from query as query has not been built yet'); } $result = $this->_queryBuilder->run(); $units = []; foreach ($result as $row) { if (!array_key_exists($row->id, $units)) { $unit = new UnitProxy($this->_entityLoaderCollection, $this->_locale, $this->_prices, $this->_defaultCurrency); $unit->id = $row->id; $unit->barcode = $row->barcode; $unit->weight = $row->weight; $unit->supplierRef = $row->supplierRef; $unit->revisionID = $row->revisionID; $unit->options = []; $unit->setSKU($row->sku); $unit->setVisible((bool) $row->visible); if ($product) { $unit->setProduct($product); } else { $unit->setProductID($row->productID); } $unit->authorship->create(new DateTimeImmutable(date('c', $row->createdAt)), $row->createdBy); if ($row->updatedAt) { $unit->authorship->update(new DateTimeImmutable(date('c', $row->updatedAt)), $row->updatedBy); } if ($row->deletedAt) { $unit->authorship->delete(new DateTimeImmutable(date('c', $row->deletedAt)), $row->deletedBy); } $units[$row->id] = $unit; } $unit = $units[$row->id]; if ($row->optionName && $row->optionValue && !array_key_exists($row->optionName, $unit->options)) { $unit->options[$row->optionName] = $row->optionValue; } if (!array_key_exists($row->stockLocation, $unit->stock)) { $unit->stock[$row->stockLocation] = $row->stock; } $unit->setPrice($row->price, $row->priceType, $row->currencyID); } return $this->_returnArray ? $units : array_shift($units); }