Oznámení
Druhý a další fluent where – vynucuje AND
před 9 lety
- maarlin
- Člen | 207
Pokud mám už nějaký „hotový“ dotaz a jen za nějakých podmínek k němu chci přidat další podmínku:
$query = $connection
->select('*')
->from('users')
->where('name LIKE %s', 'S%');
if (isset($secondName)) {
$query->where('name LIKE %s', 'R%');
}
$query->test();
Vypíše natvrdo toto:
SELECT * FROM `users` WHERE `name` LIKE 'S%' AND `name` LIKE 'R%'
Tedy další podmínku natvrdo připojí jako AND.
Dá se nějak připojit další podmínka jako OR přes fluent
rozhraní?
před 9 lety
- phx
- Člen | 652
$query->or('name LIKE %s', 'R%');
před 8 lety
- maarlin
- Člen | 207
phx napsal(a):
$query->or('name LIKE %s', 'R%');
To ale funguje tak trochu zvláštně… neboť to připojuje …OR name LIKE… za poslední část dotazu.
Příklad:
$query->select('*')->from('table t')->where('t.col = %s', 'sth');
$query->innerJoin('otherTable ot ON t.ot_id=ot.id');
$query->or('ot.name = %s', 'first');
$query->or('ot.name = %s', 'second');
$query->or('ot.name = %s', 'third');
vygeneruje
SELECT * FROM table t
INNER JOIN otherTable ot ON t.ot_id=ot.id
OR ot.name = 'first' OR ot.name = 'second' OR ot.name = 'third'
WHERE t.col = 'sth'
před 8 lety
- Milo
- Nette Core | 1119
$query->clause('WHERE')->or('ot.name = %s', 'first');
před 8 lety
- MIKI
- Člen | 34
Mam otazku k tejto teme, ale tak trochu zvlastnu.
Je mozne „ciastocne“ parsovanie dibi syntaxu, prip. akym sposobom by som
mohol pole pripojit do where
, tak aby to nebralo ako pole (ktore
vynucuje AND), ale aby to parsovalo postupne.
Lepsie mozno vysvetlit kodom:
Mam funkciu, ktorej predam podmienky ako parametre funkcie. Pre „zlepsenie“,
predavam funkcii parametre postupne (sprava sa tak isto, ak by som to dal ako
jednu podmienku v poli).
<?php
public function getAllWhere()
{
$all = dibi::select('*')
->from($this->table)
->where(func_get_args())
->orderBy(array('ord'=>'ASC'))
->execute();
... // nastavenie typov
$all = $all->fetchAll();
return $all
}
// ~ public function getAllWhere($where)
?>
Pouzitie napr:
<?php
getAllWhere('name IN (SELECT Id FROM '.T_DICTIONARY.' WHERE text = %s', $parent, ' AND lang = %s', $lang, ')');
?>
Vygeneruje mi:
SELECT *
FROM `sekcie`
WHERE (name IN (
SELECT Id
FROM dictionary
WHERE text = %s) AND (Rok 2007) AND ( AND lang = %s) AND (sk) AND ())
ORDER BY `ord` ASC
predposledny riadok je zly. Existuje nejake rozumnejsie riesenie? Nic mi nenapada.
Dakujem za pomoc
Editoval MIKI (12. 4. 2011 10:20)
před 8 lety
- HosipLan
- Moderator | 4693
To je očekávané chování, zkus tohle
public function getAllWhere()
{
$all = dibi::select('*')->from($this->table)
->where('%ex', func_get_args())
->orderBy(array('ord'=>'ASC'))
->execute();
return $all->fetchAll();
}