tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

Návrh na vylepšení modifikátoru %and a %or

před 10 lety

romansklenar
Člen | 657

Tento kus kódu je skvělá věc. Nepřišel jsem ale na způsob, jak nativně získat výsledek, který by náležel množině hodnot. Nakonec mi nezbylo než do dibi sáhnout a upravit translator, aby šlo něco takového:

dibi::test('
    SELECT * FROM [Osoba]
    WHERE %and', array('jmeno' => array('tomas', 'roman', 'michal'))
);
SELECT * FROM Osoba WHERE (jmeno IN ('tomas', 'roman', 'michal'))

Tudíž pro model funguje i takovýto výběr podle více hodnot:

$model->fetchAllByName(array('tomas', 'roman', 'michal'));

EDIT: Předchozí příklad není zrovna nejlepší, protože se dá výsledku dosáhnout určitě i jinak. Význam jde znát až na výběrech, kde je více podmínek v AND/OR ( + vnořené IN (...) ) a celé to musí být zapsané v jednom poli.

Příklad s výběrem všech editorů a managerů s jmény tomas, roman, michal:

$cond = array(
    'jmeno' => array('tomas', 'roman', 'michal'),
    'role' => array('editor', 'manager'),
    ...
);
dibi::test('
    SELECT * FROM [Osoba] WHERE %and', $cond
);
SELECT * FROM Osoba
WHERE (jmeno IN ('tomas', 'roman', 'michal')) AND (role IN ('editor', 'manager'))

Přikládám jednoduchý patch. Určitě by nebylo na škodu, kdyby to dibi umělo nativně. Pokud to už nějak jde a já na to nepřišel, tak se omlouvám :)

Index: C:/web/www/efqm/libs/dibi/libs/DibiTranslator.php
===================================================================
--- C:/web/www/efqm/libs/dibi/libs/DibiTranslator.php   (revision 230)
+++ C:/web/www/efqm/libs/dibi/libs/DibiTranslator.php   (working copy)
@@ -219,8 +219,12 @@
    $pair = explode('%', $k, 2); // split into identifier & modifier
    $k = $this->delimite($pair[0]) . ' ';
    if (!isset($pair[1])) {
-       $v = $this->formatValue($v, FALSE);
-       $vx[] = $k . ($v === 'NULL' ? 'IS ' : '= ') . $v;
+       if (is_array($v)) {
+           $vx[] = $k . 'IN ' . $this->formatValue($v, 'l');
+       } else {
+           $v = $this->formatValue($v, NULL);
+           $vx[] = $k . ($v === 'NULL' ? 'IS ' : '= ') . $v;
+       }

Editoval romansklenar (18. 7. 2009 5:50)

před 10 lety

David Grudl
Nette Core | 6806

Nešlo by použít třeba

$cond = array(
        'jmeno%l' => array('tomas', 'roman', 'michal'),
        'role%l' => array('editor', 'manager'),
        ...
);

před 10 lety

romansklenar
Člen | 657

Jde to :) Super! Díky Davide, dibi myslí prostě na všechno ;)

Editoval romansklenar (22. 7. 2009 16:57)