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