Oznámení
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.