Oznámení
[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.