Formulování dotazu s WHERE LIKE (array)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
dj.kure
Člen | 70
+
0
-

Ahoj,

mám tu další specialitku, jak nejjednodušeji vyřešit filtrování výsledků z parametrů převzatých z url řádku (get)?

Tento SQL dotaz:

$this->database->table('zakaznici')->where(array_filter($this->getHttpRequest()->getQuery()));

Funguje skvěle, ale já bych místo WHERE x = y potřeboval WHERE x LIKE '%y%', jenže nevím, jak to naformulovat, protože mu předávám pole a nechce se mi vyloženě vyjmenovávat každou možnou položku, pokud by se to filtrování ještě časem rozrostlo na další.

Ten HttpRequest může obsahovat až pět položek (jméno, příjmení, ulice, město, psč).

Děkuji za případné nakopnutí.
P.S.: array_filter() tam mám kvůli odstranění prázdných položek (nevyplněných).

ViPEr*CZ*
Člen | 822
+
+1
-

A co Vám to dělá, když si URL upravíte ručně a do GET dáte neexistující sloupec databáze? Osobně ty parametry prostě validuju. Je to prostě obdobný jak u formuláře, když přidám políčko, tak se mi zvětší data v getValues, ale nedostane se mi tam nic jinýho. A stejně pak pokud se nechci spolehnout, že prvky formu mají stejné indexy jako jména sloupců v DB, tak musím nějak použít novou hodnotu.
Třeba má někdo univerzálnější a spolehlivější řešení. Tak ho taky uvítám.

dj.kure
Člen | 70
+
0
-

Já Vám rozumím, tohle bylo jen takové ulehčení, protože vím, že to dělám pro lidi, kteří jsou rádi za to, že kliknou na tlačítko, nebo něco vyplní do inputu, ale určitě se nezajímají o dění v adresním řádku.
Asi to tedy udělám jak navrhujete (tj. rozparsovat si GET a SQL dotaz si z něj seskládat).

Nemůžete mi někdo prosím poradit jak? Nenapadá mne žádné jednoduché řešení.

Editoval dj.kure (2. 2. 2016 22:02)

CZechBoY
Člen | 3608
+
+1
-
$selection = $this->db->table('zakaznici');

$keys = array (
	'name' => 'jmeno',
	'surname' => 'prijmeni',
);

foreach ($keys as $dbKey => $queryKey) {
	$selection->where($dbKey . 'LIKE ?', $query[$queryKey]);
}

Editoval CZechBoY (2. 2. 2016 22:26)

dj.kure
Člen | 70
+
-1
-

Díky, tohle řešení je dobré :-)
Zde doplňuji mé upravené řešení, které mi funguje:

$keys = array (
            'jmeno' => $this->getHttpRequest()->getQuery('jmeno'),
            'prijmeni' => $this->getHttpRequest()->getQuery('prijmeni'),
            'ulice' => $this->getHttpRequest()->getQuery('ulice'),
            'mesto' => $this->getHttpRequest()->getQuery('mesto'),
        );

$selection->where($dbKey . ' LIKE ?', "%" . ucfirst($keys[$dbKey]) . "%");

Potřeboval jsem mít možnost zadávat do formuláře i malá písmenka (proto ucfirst()), a do dotazu s „LIKE“ jsem doplnil procenta.

F.Vesely
Člen | 369
+
+1
-

$this->getHttpRequest()->getQuery('mesto') tak tohle jsem fakt jeste nevidel. Predavej si ty hodnoty jako parametry funkce.

petr.jirous
Člen | 128
+
0
-

@dj.kure

$keys = array (
            'jmeno' => $this->getHttpRequest()->getQuery('jmeno'),
            'prijmeni' => $this->getHttpRequest()->getQuery('prijmeni'),
            'ulice' => $this->getHttpRequest()->getQuery('ulice'),
            'mesto' => $this->getHttpRequest()->getQuery('mesto'),
        );

tohle můžeš nahradit za
$keys = $this->getHttpRequest()->getQuery();

Nicméně nechápu o co se snažíš? Vypadá to jako filtrování nějaké tabulky, tzn. předpokládám, že pomocí formuláře, kde se vyplňuje jmeno, ulice, prijmeni a mesto. Tak proč si ty hodnoty taháš z URL, když si je můžeš tahat z formuláře?

Editoval petr.jirous (5. 2. 2016 23:02)