Volitelné parametry v selectu a jejich nepoužívání když nejsou zvoleny

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

Ahoj,

omlouvám se začátečnický dotaz ale celkem se peru s hodnotami v selectu. Mám tři selecty a jedno search tlačítko. První select obsahuje volbu barvy auta, druhý typ paliva, třetí karoserii. Všechny tři selecty jsou volitelné. Čili když si navolím pouze 1 a 2, tak třetí select (karoserie) by měl fungovat jako že chci všechny karoserie a podle toho hledat. Takhle to ale standardně samozřejmě nefunguje, protože nevybraný select vrací NULL a v modelu když poté používám where to vypadá nějak takto: where(„barva“,$zvolenaBarva)->where(„palivo“,$zvolenePalivo)->where(„karoserie“,$zvolenaKaroserie); S tím že pokud například select s karoserií nevyberu, tak zvolenaKaroserie je samozřejmě NULL a já pak nedostanu žádný výsledek. Zatím to tak v modelu řeším strašně křečovitě pomocí podmínek ve smyslu:

<?php

if ($zvolenaKaroserie==NULL)
		{
		.... where("barva",$zvolenaBarva)->where("palivo",$zvolenePalivo);
	    }


....
else if ($zvolenaBarva==NULL)
		{
		.... where("karoserie",$zvolenaKaroserie)->where("palivo",$zvolenePalivo);
	    }

?>

Atd. Proste si udělám několik podmínek a v závislosti na hodnotě upravím where, resp „vypustím“ where, které řeší input momentální s NULL. Dovedu si představit to ještě takhle řešit u pár selectů, ale když bych jich měl 20, tak se asi zblázním. Proto hádám, že musí být nějaké mnohem elegantnější řešení? Za každé popostrčení díky.

Jinak z presenteru volám funkci která obsahuje where takto:

<?php
 $this->template->cars = $this->carRepository->searchCar($values->zvolenaBarva, $values->zvolenePalivo, $values->zvolenaKaroserie);

?>

Editoval Donkeykong (29. 7. 2013 22:56)

vitkutny
Člen | 73
+
0
-
$args=array();
if($zvolenaBarva){
	$args['barva']=$zvolenaBarva;
}
if($zvolenaKaroserie){
	$args['karoserie']=$zvolenaKaroserie;
}
if($zvolenePalivo){
	$args['palivo']=$zvolenePalivo;
}
return $this->table()->where($args);

zkus to nějak takhle, snad jsem to dobře pochopil, co potřebuješ.

Donkeykong
Člen | 39
+
0
-

vitkutny napsal(a):

$args=array();
if($zvolenaBarva){
	$args['barva']=$zvolenaBarva;
}
if($zvolenaKaroserie){
	$args['karoserie']=$zvolenaKaroserie;
}
if($zvolenePalivo){
	$args['palivo']=$zvolenePalivo;
}
return $this->table()->where($args);

zkus to nějak takhle, snad jsem to dobře pochopil, co potřebuješ.

Skvělé díky moc. Funguje naprosto perfektně!

Mysteria
Člen | 797
+
0
-

Zdravím, řešil jsem stejný problém, takže nebudu zakládat nové téma, ale budu pokračovat tady.
Je nějaká možnost, jak tímhle postupem vygenerovat ve WHERE OR podmínku místo AND?
Protože tímhle stylem my $args vygeneruje mezi vším AND a já bych potřeboval takovýto dotaz:

SELECT * FROM `banlist`
WHERE (`type` IN (0, 1, 2, 3, 4, 5, 6, 9)) AND (`name` LIKE '%vulgarita%') OR (`reason` LIKE '%vulgarita%')
OR (`admin` LIKE '%vulgarita%');

Pokud by nešlo to s LIKE, tak by teoreticky stačilo jenom to OR. Díky moc :)

EDIT: Zkusil jsem to takhle, ale špatně mi to odescapuje:

if (!empty($search)) { $search = "%$search%"; $args[] = "name LIKE $search OR reason LIKE $search OR admin LIKE $search"; }
WHERE (`type` IN (-1, 0, 1, 2, 3, 4, 5, 6, 9)) AND (`name` LIKE %`v`% OR `reason` LIKE %`v`% OR
`admin` LIKE %`v`%)

Potřeboval bych to % dostat do uvozovek, aby to hledalo i částečné schody :)

Kdyby to k něčemu bylo potřeba, Nette Framework 2.1dev (revision ada9342 released on 2013–07–22).

EDIT2:
Tak jsem to nakonec obešel tak, že jsem LIKE dal natvrdo do WHERE ať tam něco je nebo ne, protože když je to prázdné, tak LIKE ‚%%‘ vrátí všechno tak jako tak, takže není nutné se zabývat tím, jestli to je nebo není empty.

Editoval Mysteria (30. 7. 2013 14:27)