Odkazy: dibi | API reference

Forum: [česky] [english]

dibi fórum

tiny ‘n’ smart
database layer

Nejste přihlášen(a)

#1 před rokem

2bfree
Člen
Registrovaný: 16. 4. 2009
Příspěvky: 189

Skládání dotazu string nebo NULL

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?


Až budeš umírat a celý život se ti bude promítat před očima, tak ať je se na co koukat.

 

#2 před rokem

Milo
dibi guru
Registrovaný: 4. 5. 2010
Příspěvky: 298

Re: Skládání dotazu string nebo NULL

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 ), "
");

 

#3 před rokem

2bfree
Člen
Registrovaný: 16. 4. 2009
Příspěvky: 189

Re: Skládání dotazu string nebo NULL

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)


Až budeš umírat a celý život se ti bude promítat před očima, tak ať je se na co koukat.

 

#4 před rokem

HosipLan
dibi guru
Registrovaný: 1. 6. 2009
Příspěvky: 2630

Re: Skládání dotazu string nebo NULL

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? :)


Neptej se, jestli se můžeš ptát | Blog | Twitter | GitHubCMS Kdyby

Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni

 

#5 před rokem

Milo
dibi guru
Registrovaný: 4. 5. 2010
Příspěvky: 298

Re: Skládání dotazu string nebo NULL

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.

 

Zápatí