Volitelné parametry v selectu a jejich nepoužívání když nejsou zvoleny
- Donkeykong
- Člen | 39
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
$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
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
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)