tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

[Bug report] Modifikátor %like a jeho použití v poli

před 8 lety

xxxObiWan
Člen | 844

Ahoj, při

dibi::test("SELECT * FROM `tabulka` WHERE", array('name%~like~' => 'foo'));

se mi zobrazí

SELECT * FROM `tabulka` WHERE `name`='%foo%'  -- čekal bych: `name` LIKE '%foo%'

Díky

Editoval xxxObiWan (19. 9. 2011 0:08)

před 8 lety

Václav M.
Člen | 34

No, taky se mi to zdá podivné. Když může fungovat modifikátor %l jako konvertor podřízeného pole na seznam včetně zápisu IN(…), tak proč tak nefunguje %~like~ (a %~like a %like~).

před 8 lety

David Grudl
Nette Core | 6806

Mělo by to fungovat, ale je třeba použít korektní dibi::test("SELECT * FROM tabulka WHERE %and", array('name%~like~' => 'foo')); (tedy s %and).

před 6 lety

radas
Člen | 210

Ahoj,
lze nějak docílit toho, aby se pomocí dibi fluent sestavila tato podmínka?

... AND (name LIKE '%první%' OR name LIKE '%druhý%' OR name LIKE '%třetí%')

mám pole slov, ale podle příkladu výše ho nemohu použít, protože se hledá nad stejným sloupcem v tabulce / klíčem v poli.

Díky

před 6 lety

radas
Člen | 210

Nakonec jsem si pomohl takto:

$products = $this->connection->select(...);

$like = array();

foreach (explode(' ', $search) as $word)
  $like[] = $this->connection->translate('[name] LIKE %~like~', $word);

$products->and('(%sql)', implode(' OR ', $like));

Kdyby to ale šlo elegantněji…

před 6 lety

Milo
Nette Core | 1119

O žádné přímé cestě nevím. Ještě by to šlo takhle:

$cond = array();
foreach (preg_split('#\s+#', $search, -1, PREG_SPLIT_NO_EMPTY) as $word) {
    $cond[] = '[name] LIKE %~like~';
    $cond[] = $word;
    $cond[] = 'OR';
}
array_pop($cond);

if (count($cond)) {
    $products->and('(%sql)', $cond);
}

Btw, pokud si necháš svoje řešení, použij modifikátor %SQL. Z translate() leze již oescapovaný SQL kód, modifikátor %sql by ho mohl poničit.