Predanie null parametru do selectora
- d4ncul
- Člen | 41
Ahojte. Mam takyto selector, do ktoreho ale raz potrebujem posielat premennu $city a raz nie. Ide jednoducho o to, ze ak si pouzivatel nezvoli mesto, tak mu vrati vsetky udalosti a ak mesto zvoli, tak mu vrati udalosti v ramci daneho mesta. Viete mi pomoct?
public function getEvents($city, $category) {
$query = $this->getEntityManager()->createQueryBuilder();
$today = new \DateTime('today');
$today->format("Y-m-d");
$query->select('e')
->from('Event', 'e')
->where('e.startdate >= :today AND e.city = :city AND e.category = :category')
->setParameter('today', $today)
->setParameter('city', $city)
->setParameter('category', $category)
->orderBy('e.startdate', 'ASC');
return $query->getQuery()->getResult();
}
- CZechBoY
- Člen | 3608
Čau,
tak vracej $query a v presenteru si kdyžtak přidej ->where(city,
$city);
Nebo tam přidej podmínku jestli je $city prázdné.
$query->select('e')
->from('Event', 'e')
->where('e.startdate >= :today AND e.category = :category')
->setParameter('today', $today)
->setParameter('category', $category)
->orderBy('e.startdate', 'ASC');
if($city) {
$query->andWhere('e.city = :city')
->setParameter('city', $city);
}
Editoval CZechBoY (7. 9. 2014 9:21)
- David Kudera
- Člen | 455
Úplně si nemyslím, že by se v presenteru mělo sahat na queryBuilder, takže osobně radši if.. No a nebo třeba tohle bez ifu
$query->where('e.city = :city OR :city IS NULL');
Editoval David Kudera (6. 9. 2014 12:31)
- d4ncul
- Člen | 41
Vdaka za pomoc. Ale nejako sa mi to nedari rozbehat.
Z HomepagePresenter volam v repozitari tuto metodu … parameter pickedCity, je perzistentna premenna, ktora vznika v select boxe v hlavicke stranky.
$this->events = $this->eventsRepo->getActualEvents($this->pickedCity);
Tu je uz konkretna metoda v repozitari. Checkol som si to a v parametri mi bezproblemov chodia ID vybraneho mesta …
public function getActualEvents($city) {
$query = $this->getEntityManager()->createQueryBuilder();
$today = new \DateTime('today');
$today->format("Y-m-d");
$query->select('e')
->from('Event', 'e')
->where('e.startdate >= :today')
->setParameter('today', $today);
if ($city) {
$query->where('e.city = :city')->setParameter('city', $city);
}
$query->orderBy('e.startdate', 'ASC');
return $query->getQuery()->getResult();
}
Nette mi ale hlasi tuto chybu, ktorej nerozumiem …
Invalid parameter number: number of bound variables does not match
number of tokens
- Filip Procházka
- Moderator | 4668
Nejčistější řešení je tohle
protected function buildQuery($category)
{
$qb = $this->entityManager->getDao(Event::class); // php 5.5 zápis
$today = new \DateTime('today');
$today->format("Y-m-d");
// Pokud používáš Kdyby/Doctrine, tak to jde zkrátit i takto
$qb->andWhere('e.startdate >= :today', $today)
$qb->andWhere('e.category = :category', $category)
return $qb->orderBy('e.startdate', 'ASC');
}
public function findEvents($category)
{
return new ResultSet($this->buildQuery($category)->getQuery());
}
public function findEventsInCity($category, $city)
{
$qb = $this->buildQuery($category);
$qb->andWhere('e.city = :city', $city)
return new ResultSet($qb->getQuery());
}
- Filip Procházka
- Moderator | 4668
Nette ti takovou chybu hlásit nemůže, protože tu chybu ti hlásí Doctrine. Koukni na mé řešení.