přenášení podmínky dotazu v related()

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

Ahoj, už jsem na tenhle problém narazil několikrát a nevím, možná je to tím, že to mám špatně navržené, ale i přesto se zeptám jak to řešíte vy.

momentálně řeším příkld s hotely a zájezdy. Mám tabulku offers a hotels. z offer jde FK do hotels (logicky).

a nyní vyhledávám na základě nějakým parametrů v tabulce offers, například cena max do 10 000,– vytáhnu si tedy v presenteru tyto offers a groupnu na základě hotel_id no, ale když chci nyní v šabloně vypsat název hotelu a k němu tyto offers tak použiji ->related() abych si vytáhl nabídky, které mají hotel_id právě to na kterém zrovna jsem. Jenže v tu chvíly se ztrácí tá podmínka s tou maximální cenou.. Jak to řešíte ?

Už jsem na to i narazil když jsem řešil multi language a přidávání do každého related() ještě ->where() mi přijde hrozně nehezké. Předem díky za prodiskutování ;)

newbie
Člen | 31
+
0
-

Určitě bych to neřešil až v šabloně. Prostě ji hodím seznam hotelů. LEFT JOIN a zisk.

	$this->template... = $this->connection->table('hotels')->where(':offer.price <= ?',10000);

Tak se omlouvám už je celkem pozdě a špatně jsem pochopil. To nahoře nefunguje a jediné rozumné řešení je přes related a where, ale kdyby chtěl vypsat všechny hotely které mají zájezdy omezené cenou tak to můžeš naprasit třeba takhle bez related:

	$this->template->hotels	= $this->connection->table('hotel')->select(':offer.price, hotel.name')->where(':offer.price <= ?', 10000);
	{var $hot}
	{foreach $hotels as $hotel}
		{$hotel->name !== $hot ? $hotel->name}
		{$hotel->price}
		{var $hot = $hotel->name}
	{/foreach}

Editoval newbie (17. 4. 2015 3:12)

kleinpetr
Člen | 480
+
0
-

Takže bys vyjížděl z tabulky hotelů.. Já nevim no, jako určitě je to možnost, ale zdá se mi to takový zbytečný.. no zkusím to a uvidím..

Editoval kleinpetr (17. 4. 2015 2:21)

kleinpetr
Člen | 480
+
0
-

Jak nyní, když procházím hotely, přistoupím k těm offers ? přes $hotel->offers hází undeclared column.. díky ;)

Editoval kleinpetr (17. 4. 2015 2:21)

kleinpetr
Člen | 480
+
0
-

Jak tedy projdu záznamy které jsem joinul ? (offers) díky

kleinpetr
Člen | 480
+
0
-

Zdá se mi, že je to celkem velká slabina nette nemyslíte ? můžu si předat do šablony jen jeden výsledek dotazu ale když pak potřebuji držet nějakou podmínku, tak se to musí řešit opravdu až moc složitě. Naštěstí to potřebuji jen na jednom místě, tudíž jsem to nějak sesmolil, ale být to tam víckrát tak bych byl asi velice zklamán.

Řešení:

vytvořil jsem si funkci do které vložím nějaké hodnoty z formuláře a ona mi vrátí pole podmínek.

public function getConditions($values)
{
    $conditions = [];

    //condition term_from
    if (isset($values['term_from'])) {
        $term_from = date('Y-m-d', strtotime($values['term_from']));
        $conditions['term_from > ?'] = $term_from;
    }
    //condition term_to
    if (isset($values['term_to'])) {
        $term_to = date('Y-m-d', strtotime($values['term_to']));
        $conditions['term_to < ?'] = $term_to;
    }

    //condition max_price
    if (isset($values['max_price'])) {
        $conditions['total_price < ?'] = $values['max_price'];
    }

		.. a tak dále

    return $conditions;
}

a v presenteru nakonec vyjíždím z tabulky offers $offers->where($conditions)->group('hotel_id')
pošlu do šablony a zároveň si tam pošlu i pole $conditions které pak použiji v related()->where($conditions).

jako ve finále to tak hrozné neni, ale i tak, mohlo by to jít lépe ;) díky za pomoc