Neshoda funkčnosti dvou ekvivalentních dotazů v NDBT
- Polki
- Člen | 553
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 | 498
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
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)
- JiriSlischka
- Člen | 9
Napiš to takhle:
<?php
$this->database->table('instructions')->where(['user_id' => $userId, 'user_id IS NULL'])
?>