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();
}