tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

fetchAssoc – více nezávislých 1:N vazeb

před 8 lety

marvin
Člen | 1

Zdravím, rád bych oživil jeden starší topic

Ahoj,

mám tabulky s uživateli, a k tomu další dvě s fotkami a komentáři (takže dvě 1:n vazby). Zajímá mě, jestli se dá v associativním deskriptoru nějak zapsat, aby mi vypsal strukturu podobnou následující:

<?php
$user['user__id']
        ['name']
        ['surname']
        ....etc...
        ['photo__id']
                [1]
                [2]
                ...pole fotek podle id...
        ['comment_id']
                [5]
                [8]
                ...pole komentářů podle id...
?>

nebo musím pro každou takovou vazbu vypsat nový dotaz?

před 8 lety

Milo
Nette Core | 1119

Myslím, že současnou syntaxí fetchAssoc() toho nelze docílit. Dělám to následovně a výsledek funkce cachuju.

$rows = $db->query('
SELECT
    [user.id]   AS [uId],
    [user.name] AS [uName],

    [photo.id]   AS [pId],
    [photo.file] AS [pFile],

    [comment.id]   AS [cId],
    [comment.text] AS [cText]
FROM
    [user]
    LEFT JOIN [photo]   ON [user.id] = [photo.id_user]
    LEFT JOIN [comment] ON [user.id] = [comment.id_user]
');

$emptyUser = array(
    'id' => NULL,
    'name' => NULL,
    'photos' => array(),
    'comments' => array(),
);

$users = array();
foreach ($rows AS $row)
{
    if (!isSet($users[$row->uId]))
    {
        $users[$row->uId] = $emptyUser;
        $users[$row->uId]['id'] = $row->uId;
        $users[$row->uId]['name'] = $row->uName;
    }

    $user = & $users[$row->uId];

    if ($row->pId !== NULL && !isSet($user['photos'][$row->pId]))
    {
        $user['photos'][$row->pId] = $row->pFile;
    }

    if ($row->cId !== NULL && !isSet($user['comments'][$row->cId]))
    {
        $user['comments'][$row->cId] = $row->cText;
    }
}

Editoval Milo (12. 8. 2011 13:09)