tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

DibiResult a detectType()

před 11 lety

edke
Člen | 198

@David:

Presne dnes som nieco podobne mal v plane spravit ako rozsirenie pre DibiTable. Ako som sa rozbiehal, zacal som sa preluskavat cez DibiTable->types, DibiResult->setTypes() a DibiResult->convert() a prisiel som nato, ze ty tam uz nieco podobne mas. Teda to len zautomatizovat. Nakoniec som skoncil pri implementovani DibiPostgreDriver->getColumns() a DibiPostgreDriver->getIndexes() a zatial si commit-ol
DibiResult->detectTypes()
, co som uz skusal a vyzera to vyborne.

Zaujima ma, ci mas plan to nejako implementovat aj do DibiTable. Bolo by pekne, keby sa to dalo zapnut napriklad pri:

$model->fetch( 5 );

před 11 lety

David Grudl
Nette Core | 6806

Bude se to zapínat takto:

class Products extends DibiTable
{
    protected $types = TRUE;
}

před 11 lety

edke
Člen | 198

David Grudl wrote:

Bude se to zapínat takto:

class Products extends DibiTable
{
  protected $types = TRUE;
}

Hm, a nebolo by lepsie oddelit bool flag pre zapinanie autodetekcie typov a manualnej definicie cez pole ? Bolo by mozne to potom vyhodne kombinovat. Uvediem priklad:

Pri autodetekcii automaticky sa konvertuju datumy na timestamp. Takto by som ale mohol nechat vsetko ostatne na autodetekciu a napriklad aj dalsie datumy konvertovat na timestamp ale pre jeden konkretny by som potom mohol definovat napriklad format:

class clanok extends DibiTable
{

    protected $types= array(
            'datum_vznik' => array('type' => dibi::FIELD_DATETIME, 'format' => 'd.m.Y H:i:s'),
        );
    protected $autodetectTypes= true;
}

Vysledok po fetch() by potom bol:

object(DibiRow)[61]
  public 'id_vlastnik' => int 31
  public 'datum_vznik' => string '11.07.2008 08:24:00' (length=19)
  public 'datum_zmena' => int 1215757440

před 10 lety

RaR
Člen | 42

Ahojte
pokud vyjdu z nového examle Akrabat.form, kde už není DibiTable použitá, jak přetypuji datové pole z timestamp na D.m.Y a naopak? Všude je to popisováno pomocí setType a dibiTable, ale v novém modelu to nějak nefunguje.

<?php
class Table extends Object
{
    /** @var string */
    private $table = 'mySqlTable';

    /** @var DibiConnection */
    private $connection;

    protected $types= array('termineDate' => array('type' => dibi::FIELD_DATETIME, 'format' => 'd.m.Y'),);

    public static function initialize()
    {
        dibi::connect(Environment::getConfig('database'));
    }

    public function __construct()
    {
        $this->connection = dibi::getConnection();
    }

    public function findAll() // toto jde do šablony, potřebuji převést timestamp na datum
    {
        return $this->connection->select('*')->from($this->table);
    }

    public function find($id) // toto jde do formuláře, převod timestamp na datum
    {
        return $this->connection->select('*')->from($this->table)->where('id=%i', id);
    }

    public function update($id, array $data) // toto jde z formuláře, převod datumu na timestamp
    {
        return $this->connection->update($this->table, $data)->where('id=%i', id)->execute();
    }

    public function insert(array $data) // toto jde z formuláře, převod datumu na timestamp
    {
        return $this->connection->insert($this->table, $data)->execute(dibi::IDENTIFIER);
    }
...
?>

Třída Table je Object a ne DibiTable(kde $types fungovalo). Jak z toho ven? Asi by šlo přetypovat před vykreslením v šabloně a před načtením defaultníh hodnot do formuláře a po odeslání dat z formuláře, ale to je asi zbytečně složitý. Děkuji za každou radu.

před 10 lety

David Grudl
Nette Core | 6806

Hmmm, pro tohle zatím není hotová podpora