Oznámení
Skládání dotazu string nebo NULL
před 9 lety
- 2bfree
- Člen | 245
když mám dotaz
Dibi:fetchAll(„SELECT [neco] FROM [:prefix:nekde] WHERE
%and“,array(‚sloupec‘ ⇒ $hodnota));
tak se automaticky vygeneruje dotaz podle toho, jestli je $hodnota NULL nebo
string. Takže můžu získat následující možnosti:
SELECT neco
FROM pefix_nekde
WHERE
sloupec
= ‚hodnota‘
SELECT neco
FROM pefix_nekde
WHERE
sloupec
IS NULL
Narazil jsem však na problém, že toto i když prasácké řešení
nemůžu použít, když chci dělat LEFT JOIN.
Musím to přepsat následovně:
Dibi:fetchAll(„SELECT [nekde].[neco],[jinde].[neco] FROM [:prefix:nekde] AS [nekde] LEFT JOIN [:prefix:jinde] AS [jinde] ON [jinde].[id] = [nekde].[jinde_id] WHERE [nekde].[sloupec] = %s“,$hodnota);
Což mi ale přestane řešit moment, kdy $hodnota je NULL. Takže potom mám
podmínku
WHERE nekde
.sloupec
= NULL což v MYSQL nefunguje a
vrací prázdný záznam.
Jak tedy takovouhle pakárnu řešit?
před 9 lety
- Milo
- Nette Core | 1119
Do hranatých závorek nemusíš dávat názvy tabulky a sloupce zvlášť.
dibi::fetchAll("
SELECT
[nekde.neco],
[jinde.neco]
FROM
[:prefix:nekde] AS [nekde]
LEFT JOIN [:prefix:jinde] AS [jinde] ON [jinde.id] = [nekde.jinde_id]
WHERE
%and", array( 'nekde.sloupec%s' => $hodnota ), "
");
před 9 lety
- 2bfree
- Člen | 245
Milo napsal(a):
Do hranatých závorek nemusíš dávat názvy tabulky a sloupce zvlášť.
dibi::fetchAll(" SELECT [nekde.neco], [jinde.neco] FROM [:prefix:nekde] AS [nekde] LEFT JOIN [:prefix:jinde] AS [jinde] ON [jinde.id] = [nekde.jinde_id] WHERE %and", array( 'nekde.sloupec%s' => $hodnota ), " ");
Díky moc, geniální řešení.
Jelikož však vidím tu WHERE formulaci ‚nekde.sloupec%s‘ poprvé, chci
se zeptat, jak by to vypadalo v negaci?
Tedy aby to vracelo != případně IS NOT
Editoval 2bfree (25. 1. 2011 8:58)
před 9 lety
- HosipLan
- Moderator | 4693
Nenapadá mě jak to skombinovat s %and
"WHERE nekde.sloupec != %s", $hodnota,
PS: doporučoval bych používat fluent syntaxi, je to přehlednější
$fq = dibi::select("nekde.neco, jinde.neco")
->from(":prefix:nekde")->as('nekde')
->leftJoin(':prefix:jinde')->as('jinde')
->on("[jinde.id] = [nekde.jinde_id]");
->where("nekde.sloupec != %s", $hodnota);
return $fb->fetchAll();
žejo? :)
před 9 lety
- Milo
- Nette Core | 1119
To asi nepůjde. Pokud máš jen jednu podmínku, můžeš to negovat celé
tak jak to máš a pokud chceš negovat všechny podmínky, použij
OR
.
"WHERE
NOT (%or)", array( 'nekde.sloupec%s' => $hodnota, 'jinde.sloupec%s' => $hodnota2 ), "
"
Ale pokud máš pro každý sloupec jinou porovnávací logiku, budeš je muset projít a podmínky přidat ručně. A na to už se dobře hodí fluent, jak psal HosipLan.