Predanie null parametru do selectora

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

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
+
-1
-

Č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
+
0
-

Ú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)

CZechBoY
Člen | 3608
+
0
-

Taky varianta.
Já si většinou v aplikaci udělám v modelu základní dotaz a v presenteru podle parametrů uživatele přidávám where a v šabloně kdyžtak ještě dodatečný údaje tahám.

d4ncul
Člen | 41
+
0
-

Vdaka za pomoc. Ale nejako sa mi to nedari rozbehat.

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
+
+2
-

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());
}

ResultSet máš vysvětlený tady

Filip Procházka
Moderator | 4668
+
0
-

Nette ti takovou chybu hlásit nemůže, protože tu chybu ti hlásí Doctrine. Koukni na mé řešení.

CZechBoY
Člen | 3608
+
0
-

Za co mám mínus? Však by to mělo být funkční řešení…

Majkl578
Moderator | 1364
+
0
-

Musíš použít andWhere(), samotné where() přepíše předchozí.

Majkl578
Moderator | 1364
+
0
-

Nějak mi uniká souvislost Nette?

CZechBoY
Člen | 3608
+
0
-

Aha, no nepoznal jsem co to je za ORM tak jsem použil univerzální where. Opraveno.

d4ncul
Člen | 41
+
0
-

andWhere() … je to tam! dakujem