tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

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