tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

DibiDataSource, DiBiFluent a klonování

před 9 lety

semtex.989
Člen | 76

Toto téma zakládám bych ušetřil čas a nervy všem, co hledají řešení jako já.
Líbilo se mi DibiDataSource, ale moje požadavky byly:

  1. Skládání dotazu alá DibiFluent, bez převádění metodami toFluent() a toDataSource()
  2. funkční klonování objektu DataSource (Dibi používání při skládání dotazu reference u polí, takže jsem se to snažil vyřešit)
  3. Aby DataSource místo DibiRow vracelo jinou třídu.
  4. Aby tato třída mohla místo sebe vrátit jinou
  5. Je mi známa chyba v DibiDataSource, která způsobí, že pokud se zavolá getResult(), tak už nelze dál modifikovat SQL dotaz.

Má to nevýhodu, že je nutné v DibiFluent upravit atribut clauses z private na protected, ale to dá přežít…

  • Jinak děkuji Davidovi za perfektní práci odvedenou na Dibi ;-)

Výsledkem je třída DataSource:

<?php
final class DataSource extends DibiFluent implements IDataSource{

      private $rowClass = null;


      public function __construct(DibiConnection $connection, object $rowClass = null){
            parent::__construct($connection);
            $this->setRowClass($rowClass);
      }

      public function setRowClass(object $rowClass = null){
            $this->rowClass = $rowClass;
            return $this;
      }

      public function getRowClass(){
            return $this->rowClass;
      }


      public function getResult(){
            $rows = $this->fetchAll();
            if(count($rows) < 1){
                  return null;
            }
            if($this->rowClass !== null){
                  $return = array();
                  foreach($rows  as $row){
                        $class = clone $this->rowClass;
                        $return[] = $class->setData($row); // zde je možnost, že třída vrátí místo sebe jinou třídu
                  }
                  if(count($return) == 1){
                        $return = $return[0];
                  }
                  return $return;
            }
            return $rows;
      }

      public function getIterator(){
            return new ArrayIterator($this->getResult());
      }

      public function __clone(){
            $this->clauses = unserialize(serialize($this->clauses)); // HACK: clones clauses!
      }

}
?>

Editoval semtex.989 (25. 8. 2010 8:18)