tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

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.