tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

Podmíněné SQL příkazy + Fluent syntax

před 9 lety

ezimir
Člen | 21

Je spôsob ako dosiahnuť nasledovné…

$result = dibi::select('*')
    ->from('whatever');
if ($id) {
    $result = $result
        ->where('[row_id] = %i', $id);
}
$result = $result
    ->fetchAll();

… pomocou fluent syntaxe? Niečo takéto:

$result = dibi::select('*')
    ->from('whatever')
    ->where('%if', $id, '[row_id] = %i', $id, '%end')
    ->fetchAll();
// SELECT * FROM `whatever` /* WHERE `row_id` = 5 */;

Rád by som sa vyhol tomu if-u. Dá sa to? (dibi::query samozrejme tento problém rieši, ale rád by som zostal pri fluent syntax).

Niečo takéto funguje:

$result = dibi::select('*')
    ->from('whatever')
    ->where('%if', $id, '[row_id] = %i', $id, '%else', '[row_id]', '%end')
    ->fetchAll();
// SELECT * FROM `whatever` WHERE /* `row_id` = NULL */ `row_id`

ale predsa len tá else vetva je tam ohyzdná… Dá sa skyť, ale aj takto je tam nepotrebnosť v podobe WHERE:

$result = dibi::select('*')
    ->from('whatever')
    ->where('[row_id]', '%if', $id, ' = %i', $id, '%end')
    ->fetchAll();
// SELECT * FROM `whatever` WHERE `row_id` /* = NULL */

:)

Editoval ezimir (22. 12. 2010 15:37)

před 9 lety

Milo
Nette Core | 1119

Myslím, že v současné době to nejde. Klíčové slovo WHERE se do SQL vloží vždy. Možná David ví o nějakém způsobu. Já to dělám podobně jako ty s else.

->where('%if', $id, '[col] = %i', $id, '%else %b', true, '%end')

před 9 lety

Milo
Nette Core | 1119

Nebylo by špatné třeba:

select('*')->from('tab')->if($id)->where( '[col] = %i', $id )->end();

:)