tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

fluent interface a subselect

před 10 lety

forkman
Člen | 62

Zdravíčko, vůbec jsem nepřišel na to, jak pomocí sluent interface donutím dibi udělat subselect, když navážu jen ->select(…, přidá se mi to jako další select z původní tabulky. Zkoušel jsem hledat všude možně, ale na nic jsem nepřišel, díky moc.
Když ten subselect napíšu do prvního selectu do závorek tak jak se má, tak to samozřejmě funguje, ale přehlednost je ta tam.

před 10 lety

vlki
Člen | 218

Příklady jsou samovysvětlující. Snad pomůže :)

$subselect = dibi::select('[id]')
    ->from('comments')
    ->where(array('postId%i' => $postId));

$post = dibi::select('*, COUNT(' . $subselect->__toString() . ') AS [commentsCount]')
    ->from('posts')
    ->where(array('id%i' => $postId))
    ->execute()->fetch();

před 10 lety

forkman
Člen | 62

Sice už to pak není moc fluent, ale přesto elegantnější, než to moje, díky.

před 10 lety

vlki
Člen | 218

Tak pořád to můžeš zfluentit, ale má to velký dopad na přehlednost.

$post = dibi::select('*, COUNT(' . dibi::select('[id]')
                                       ->from('comments')
                                       ->where(array('postId%i' => $postId))
                                       ->__toString() . ') AS [commentsCount]')
        ->from('posts')
        ->where(array('id%i' => $postId))
        ->execute()->fetch();

před 10 lety

David Grudl
Nette Core | 6806

Mělo by fungovat i

$post = dibi::select('*')
    ->select(
        dibi::select('count(id)')
        ->from('comments')
        ->where('postId=%i', $postId)
    )->as('commentsCount')
    ->from('posts')
    ->where('id=%i', $postId)
    ->fetch();