Neshoda funkčnosti dvou ekvivalentních dotazů v NDBT

Polki
Člen | 553
+
0
-

Ahoj, mám dotaz, jestli se má takto databáze chovat doopravdy, nebo jde o chybu?

Mám databázi instrukcí(postupů při práci) pro uživatele. Každý uživatel si může vkládat vlastní instrukce a zároveň má vidět instrukce pro všechny.

Pro toto jsem si udělal tabulku, kde je sloupec ‚user_id‘ a pokud je tento sloupec NULL, tak je to instrukce, kterou vidí všichni, pokud NULL není, tak je zde ID uživatele, který ji vidí.

Toliko úvod.

Nyní chci získat všechny instrukce, které jsou pro daného uživatele (tedy ty, kde je sloupec ‚user_id‘ buď NULL, nebo id toho uživatele). Jenže problém nastal, když jsem chtěl použít zjednodušený zápis.

Toto funguje bez problémů:

$this->database->table('instructions')->where('user_id ? OR user_id ?', $userId, NULL);

Toto vrátí pouze ty záznamy, kde není sloupec ‚user_id‘ NULL (tedy ty, které si uživatel přidal sám):

$this->database->table('instructions')->where('user_id', [$userId, NULL]);

Je to chyba v NDBT, nebo je to standardní chování?

Díky za odpověď.

MajklNajt
Člen | 471
+
+1
-

toto nemá nič s ndbt, pretože

$this->database->table('instructions')->where('user_id ? OR user_id ?', $userId, NULL);

ti vygeneruje

SELECT * FROM instructions WHERE user_id = $userId OR user_id IS NULL;

kdežto

$this->database->table('instructions')->where('user_id', [$userId, NULL]);

vygneruje

SELECT * FROM instructions WHERE user_id IN ($userId, NULL);

stačí si pustiť dodaz priamo na databázu a musí ti byť jasné, prečo to tak je…

Editoval MajklNajt (30. 10. 2019 13:51)

Polki
Člen | 553
+
0
-

MajklNajt napsal(a):

toto nemá nič s ndbt, pretože

$this->database->table('instructions')->where('user_id ? OR user_id ?', $userId, NULL);

ti vygeneruje

SELECT * FROM instructions WHERE user_id = $userId OR user_id IS NULL;

kdežto

$this->database->table('instructions')->where('user_id', [$userId, NULL]);

vygneruje

SELECT * FROM instructions WHERE user_id IN ($userId, NULL);

stačí si pustiť dodaz priamo na databázu a musí ti byť jasné, prečo to tak je…

@MajklNajt

Moje chyba… Druhý dotaz měl vypadat takto:

$this->database->table('instructions')->whereOr(['user_id' => $userId, 'user_id' => NULL]);

Takže dotaz trvá, jen jsem napsal špatně jeden řádek.

EDIT 1:
Už mi to došlo. Mám dva stejné indexy v poli, takže se mi přepisuje tím posledním… Dá se toto nějak pomocí ->whereOr vyřešit, nebo musím používat první způsob?

Editoval Polki (30. 10. 2019 14:09)

David Matějka
Moderator | 6445
+
0
-

a jak vypada vygenerovany dotaz?

JiriSlischka
Člen | 9
+
0
-

Napiš to takhle:

<?php
$this->database->table('instructions')->where(['user_id' => $userId, 'user_id IS NULL'])
?>