tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

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?