2017-01-21 3 views
0

は、私は、次のデータを返すクエリがあるとします。ZF2/ZF3水和物オブジェクトおよびネストされたオブジェクト

RangeId | MinValue | MaxValue | Resolution | UnitId | UnitName 

私は上記のデータとオブジェクトMeasurementRangeを水和したいです。

class MeasurementRange { 
    public function getRangeId() {...}; 
    public function setRangeId($id) {...}; 
    public function getRange() {...}; 
    public function setRange(Range $range) {...}; 
    public function getUnit() {...}; 
    public function setUnit(Unit $unit) {...}; 
} 

class Range { 
    public function getMinValue() {...}; 
    public function setMinValue(float $minVal) {...}; 
    public function getMaxValue() {...}; 
    public function setMaxValue(float $maxVal) {...}; 
    public function getResolution {...}; 
    public function setResolution(float $resolution) {...}; 
} 

class Unit { 
    public function getUnitId() {...}; 
    public function setUnitId(int $id) {...}; 
    public function getUnitName() {...}; 
    public function setUnitName(string $name) {...}; 
} 

あなたはMeasurementRangeオブジェクトがRangeUnitオブジェクトを設定している見ることができるように。

上記のクエリのオブジェクトMeasurementRangeと内部Rangeとの水和物はどのようにして水和できますか?

PS:オブジェクトの保護されたプロパティを指定しませんでした。私は彼らが自明であると思う。

+1

:)のように見えることができるものです。//docs.doctrine -project.org/projects/doctrine-orm/en/latest/)?それはあなたにとって有用かもしれません。 – Wilt

+0

@ウィルト、提案に感謝します。新しいツールの学習には時間がかかりそうですが、私はこのプロジェクトの時間がかなり限られています。あなたはネイティブzf2のもので私が望むものをする方法を知っていますか? –

+0

@ウィルト、私が間違っている場合は私を修正しますが、Doctrine ORMの私の一見から、私はこれらのオブジェクトをマップするかどうかはわかりません。あなたのエンティティクラスに対応するテーブルを持っているときはとても良いですが、それは私が持っているものではありません。 –

答えて

1

あなたは配列としてデータをフェッチするために、あなたのdbAdapterを使用して、すべてのオブジェクトを水和するためにハイドレーターを使用し、最終的にMeasurementRangeRangeUnitを追加するマッパーを作成する必要があります。代わりに、独自のハイドレーターを作成することもできます(これは単一の責任の面でさらに優れています)。

私は、以下の例をきれいにするための時間を持っていない、それはそれは(HTTPたぶん、あなたは[ドクトリンORM]を見ている必要があり

final class LanguageMapper 
{ 
    /** 
    * @param LanguageTable $languageTable 
    * @param PackageTable $packageTable 
    * @param Cache   $cache 
    * @param LoggerInterface $logger 
    */ 
    public function __construct(LanguageTable $languageTable, PackageTable $packageTable, Cache $cache, LoggerInterface $logger) 
    { 
     $this->languageTable = $languageTable; 
     $this->packageTable = $packageTable; 
     $this->cache = $cache; 
     $this->logger = $logger; 
    } 

    /** 
    * @param array $where 
    * 
    * @return array List of active languages 
    */ 
    public function findActive(array $where = []) 
    { 
     try { 
      if (empty($where) && $this->cache->hasItem('active_languages')) { 
       return unserialize($this->cache->getItem('active_languages')); 
      } 
     } catch (RuntimeException $exception) { 
      $this->logger->critical($exception->getMessage(), [ 
       'exception' => $exception, 
       'file' => $exception->getFile(), 
       'line' => $exception->getLine(), 
      ]); 
     } 
     /* @var $adapter \Zend\Db\Adapter\Adapter */ 
     $adapter = $this->languageTable->getGateway()->getAdapter(); 
     $sql = new Sql($adapter); 
     $select = $sql->select()->columns([Select::SQL_STAR]) 
      ->from('language') 
      ->join('package', 'package.id = language.package', Select::SQL_STAR, Select::JOIN_LEFT) 
      ->where(array_merge($where, ['active' => true])) 
      ->order(['position']); 
     $selectString = $sql->buildSqlString($select); 

     $resultSet = $adapter->query($selectString, Adapter::QUERY_MODE_EXECUTE); 
     $languages = []; 
     $hydrator = new ArraySerializable(); 
     foreach ($resultSet as $result) { 
      $language = new Language(); 
      $package = new Package(); 
      $hydrator->hydrate((array) $result, $package); 
      $hydrator->hydrate((array) $result, $language); 
      $language->setPackage($package); 
      $languages[] = $language; 
     } 
     if (empty($where)) { 
      try { 
       $this->cache->setItem('active_languages', serialize($languages)); 
      } catch (RuntimeException $exception) { 
       $this->logger->warning($exception->getMessage(), [ 
        'exception' => $exception, 
        'file' => $exception->getFile(), 
        'line' => $exception->getLine(), 
       ]); 
      } 
     } 

     return $languages; 
    } 
} 
+0

私も同じ考えを考えました。問題は、あなたが多くのオブジェクト(私が持っているもの)を持っていれば、両方のソリューションでかなり面倒です。マッパーがデータを取得し、次に水和し、オブジェクトを組み立てると、システムのパフォーマンスに影響する可能性があるあまりにも多くのforeachが発生します。専用のハイドレーターを作成し、ハイドレーターをアセンブルするためにAggregateHydratorを使用すると、多くのハイドレーターとハイドレーターがクエリーに非常に依存します。クエリーで何かを変更すると、ハイドレーターを変更する必要があります。私はあなたの答えを+1し、他の人が何を書いているのかを見ます。 –