Oznámení
Master – Detail
před 10 lety
- RaR
- Člen | 42
Nevím, jak vhodně udělat vypsání položek k hlavičce. Takhle jsem se
dostal ke zdi.
v modelu
<?php
public function findAll()
{
return $this->connection->select('*')->from('orders');
}
public function getItems($id)
{
return $this->connection->select('*')->from('items')->where('id=%i',$id);
}
?>
v presenteru
<?php
$orders = $order->findAll();
$items = $order->getItems($id); //tady to $id znám až v šabloně při vykreslování
?>
nevím, jestli můžu volat tu funkci getItems($id) z šablony. Si myslím, že v šabloně by už mely být data připravený. A navíc by pro každou $order byl jeden sql dotaz a šahání do databáze.
<?php
{foreach $orders as $order}
{$order->id}
{foreach $items as $item}
{$item->id}
{/foreach}
{/foreach}
?>
když $items naplním v presenteru, tak bych tahal všechny items, což mě připadá zbytečný, když na $orders používám paginátor a vykresluji jen $itemsPerPage. Tím se asi nevyhnu tomu, mít jeden dotaz na každou $order. Může mě někdo nakopnout jak na to? Děkuji předem.
před 10 lety
- phx
- Člen | 652
Me osobne se libi DibiDataSource. David primo v ukazce nacital data LAZY az v sablone. Sablona si navic urcila jake sloupecky chce a tim se zase usetrilo nejake to prenesene dato :)) (ach ta cestina:)
Asi bych vytvoril nejaky dotaz, ktery by nacetl najednou vsechny data a vracel by pomoci fetch(…) polozky a prislusne pole polozek. Nacitani dat z DB v sablone bych se nebal.
před 10 lety
- David Grudl
- Nette Core | 6806
Redukoval bych to na jeden dotaz nějak takto
$items = $this->connection->select('*')->from('items')->fetchAssoc('id,#');
...
{foreach $items[$order->id] as $item}
{$item->id}
{/foreach}
před 10 lety
- RaR
- Člen | 42
Tak jsem dal na radu Davida, ale bych se chtěl ještě zeptat.
Když použiju fetchAssoc() tak v $items je pole všech záznamů z tabulky
Items, což může být např i několik tisíců object(DibiRow). Pokud na
$order aplikuji paginátor, pak $order je jen $itemsPerPage=100 objektů, ale
$items je celá tabulka.
A teď dotaz ohledně rychlosti. Bude rychlejší 100 sql dotazů z šablony
nebo generování několika tisíc (z velké části nepoužitých) objektů
v poli?
Zatím to nemám jak otestovat, databáze je ještě chudá, ale nebude.
před 10 lety
- David Grudl
- Nette Core | 6806
Ten paginator by se měl promítnout i do dotazu na položky, nějak takto
SELECT * FROM items WHERE order_id IN (SELECT ... FROM orders LIMIT ...)
před 10 lety
- RaR
- Člen | 42
Hm, tak tudy asi cesta nepovede :(
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
MySQL 5.0.27
před 10 lety
- David Grudl
- Nette Core | 6806
Co třeba
SELECT *
FROM items
INNER JOIN (SELECT id FROM orders LIMIT ...) AS orders
ON items.orderId = orders.id
před 10 lety
- RaR
- Člen | 42
Takhle to funguje, je v tom ale ještě háček.
Ten SELECT uvnitř INNER JOIN musí být shodný se SELECTem, který vrací
hlavičky objednávek, včetně třídění a dalších podmínek WHERE který
definuji dynamicky, takže bych vlastně potřeboval funkci, která vrací
položky, předat kompletní dotaz, který vrací hlavičky.
<?php
$orders = $order->findAll()->orderBy('orderVs desc')->where($where);
$orders->limit($paginator->offset, ',', $paginator->length);
$this->template->orders = $orders;
//takže ne takto
$this->template->items = $order->getItems($paginator->offset,$paginator->length);
//ale něco jako
$this->template->items = $order->getItems($orders->getSQL());
?>
Existuje něco takového?