přenášení podmínky dotazu v related()
- kleinpetr
- Člen | 480
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
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
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