Problém s WHERE .. LIKE a defaultValue u formulára

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

Ahoj,
chcel by som na svojom projekte rozbehať také základné filtrovanie. Vo formulári mám tri selecty, každý má nastavenú defaulValue na „%“. Po odoslaní formulára potom volám

$this->template->jednotky = $this->ulozneJednotkyRepository->findByFirma($this->firma)
->where(array('vyradenie'=>NULL))
->where('reg_znacka LIKE ? AND rok_vzniku LIKE ? AND typ_jednotky LIKE ?',$form->values->znacka, $form->values->rok, $form->values->typ);

V prípade, že vyberiem všetky tri selecty s údajmi, ktoré dohromady dávajú existujúci záznam v DB tak to funguje. V prípade, že ale vyberiem napr. len rok tak sa nič nestane. Cez SQL nad databázou mi dotaz funguje v poriadku. Vďaka

SELECT * FROM ulozne_jednotky WHERE 'reg_znacka' LIKE '%' AND 'rok_vzniku' LIKE '2009' AND 'typ_jednotky' LIKE '%';

Editoval bobo (18. 11. 2013 20:50)

Oli
Člen | 1215
+
0
-

Řekl bych, že pokud něco neuvedeš, tak to vrací NULL. Potom ti to teda najde v db záznamy treba reg_znacka LIKE nejaka_znacka AND rok_vzniku LIKE NULL AND typ_jednotky LIKE NULL. Proto ti to jde, jen když vybereš všechny 3.

Udělal bych to takhle:

$where = array();
$where['vyrazenie'] = NULL;
!is_null($form->values->znacka) ? $where['reg_znacka LIKE'] = $form->values->znacka;
!is_null($form->values->rok) ? $where['rok_vzniku LIKE'] = $form->values->rok;
!is_null($form->values->typ) ? $where['typ_jednotky LIKE'] = $form->values->typ;

$this->template->jednotky = $this->ulozneJednotkyRepository->findByFirma($this->firma)
->where($where);
bobo
Člen | 2
+
0
-

vďaka skúsim, myslel som, že pokial uvediem defaultnú hodnotu % tak ak nevyberiem nič, vráti sa tá nastavená hodnota.

Oli
Člen | 1215
+
0
-

No, zalezi na tom, kde tu defaultní hodnotu nastavuješ. V tom kodu ji nikde nastavovat nevidím :-)

Pokud jsi někde výš zavolal něco jako:

if (is_null($form->values->rok))
{
	$form->values->rok = 2009;
}

Tak pak by ti to mělo fungovat i s tím kodem co jsi poslal…