tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

DibiTable – find pro jiné než primární sloupce

před 11 lety

Panda
Člen | 570

Není tu kategorie na feature requests, tak to hodím sem…

Používám dibi ve spojení s Nette, naprostou většinu dat z databáze doluji přes modely, které dědí právě od DibiTable. Je to super, jen mi tam chybí nějaká metoda, která by umožňovala získat několik záznamů, které splňují určitá kritéria – findAll bere všechny, find uvažuje jen hodnoty primárního klíče, fetch zase vrací jen jeden záznam. Proto bych ocenil nějakou meotdu, která by se chovala podobně jako fetch, která dostane do parametrů pole, jen by vracela celý DibiResult a ne jen jeden řádek. Něco na tento způsob:

/**
 * Searches for rows which match the given conditions
 * @param  array  row conditions to match
 * @return DibiResult
 */
public function search(array $conditions)
{
    return $this->complete($this->connection->query(
        'SELECT * FROM %n', $this->name,
        'WHERE %and', $conditions
    ));
}

Ano, mohu si tu metodu dopsat sám v nějakém obecném potomkovi DibiTable (což dělám), ale třeba by se tato možnost hodila i jiným. :)

před 11 lety

klok
Člen | 11

Tohle je docela dobre reseny v ORM Kohany.

Maji tam kazdy model (prezentujici tabulku) ma metodu unique_key($id)
V ni se podle typu dat muzes rozhodnout co mu podstrcis jako sloupecek pro where.

napr:

Class user extends ORM {
  public function unique_key($id){
    if (!empty($id) && is_string($id) && !ctype_digit($id)) {
      return valid::email($id) ? 'email' : 'username';
    }
  return parent::unique_key($id);
  }
}

To pro inspiraci ;-)

Jeste jednou jsem si precetl na co se ptas, a koukam ze odpovidam na neco malicko jinyho, ale kdyz uz to je napsany, mazat to nebudu.

Editoval klok (24. 8. 2008 15:51)

před 11 lety

David Grudl
Nette Core | 6806

Co rozšířit metodu findAll() ?

/**
 * Selects all rows.
 * @param  array  conditions
 * @param  string  column to order by
 * @return DibiResult
 */
public function findAll($conditions = NULL, $order = NULL)
{
    $order = func_get_args();
    if (is_array($conditions)) {
        array_shift($order);
    } else {
        $conditions = NULL;
    }
    return $this->complete($this->connection->query(
        'SELECT * FROM %n', $this->name,
        '%ex', $conditions ? array('WHERE %and', $conditions) : NULL,
        '%ex', $order ? array('ORDER BY %n', $order) : NULL
    ));
}

Fungovalo by to takto:

// SELECT * FROM [products] ORDER BY [title], [product_id]
$products->findAll('title', 'product_id');

// SELECT * FROM [products] WHERE [title]='Chair'
$products->findAll(array('title' => 'Chair'));

// SELECT * FROM [products] WHERE [title]='Chair'  ORDER BY [title]
$products->findAll(array('title' => 'Chair'), 'title');

Nebude to mít moc velký WTF faktor? ;)

před 11 lety

phx
Člen | 652

Ja osobne jsem neco podobneho resil. Parametry ORDER a LIMIT jsem dal specialnim setrem. Pri zavolani pak jakehokoliv dotazu se nastavene parametry vyuzili. Neco jako globalni ORBDER a LIMIT pro celou DibiTable. Osobne to hned po pouziti vracim na vychozi hodnoty. Prislo mi to vhodnejsi nez mixovani parametru.

Takze ano prijde mi to jako moc WTF;)

$products->setLimit($limit, $offset);
$products->setOrderBy($order, $desc);
$products->findAll($where);

před 11 lety

RaR
Člen | 42
<?php
$termine->findAll(array('termineDate' => '0'),array('termineDate' => 'desc'));
?>

Nějak jsem v dokumentaci ani ve fóru nenašel, jakým způsobem u findAll napsat podmínku, aby výsledný sql dotaz byl

select * from termine where termineDate > 0 order by termineDate desc

jde o část dotazu WHERE, kde bych potřeboval >,<,<>. Tak jak to je napsaný se dosadí =.
Poraďte prosím. Dík.

před 11 lety

phx
Člen | 652

Neco obdobneho se resilo zde, ale nedoresilo… David jiz nejak nezareagoval