Domanda

Messaggi e commenti sono memorizzati nella stessa tabella. Quindi, per ottenere ogni post e le sue osservazioni facciamo questo:

    $posts = $this->select()->setIntegrityCheck(false)
                        ->from(array('post' => 'Posts'), array('*'))
                        ->where('post.idGroup = ' . $idGroup)
                        ->where('post.idTopic IS NULL')
                        ->order('post.date DESC')
                        ->limit($resultsPerPage, $resultsPerPage * ($page - 1))
                        ->joinLeft(array('user' => 'Users'), 'post.idUser = user.idUser', 
                            array('idUser', 'fname', 'lname', 'profileUrl', 'photoUrl'))
                        ->joinLeft(array('comment' => 'Posts'), 'comment.idTopic = post.idPost')
                        ->query()->fetchAll();

Il problema è che la matrice risultante è piatto e dati commento sovrascrive i dati post, questo è un esempio di ciò che viene restituito:

[1] => Array
    (
        [idPost] => 13
        [idTopic] => 11
        [idGroup] => 1
        [idUser] => 84
        [postContent] => Hello my name is Mud.
        [postUrl] => 13/hello-my-name-is-mud
        [postVotes] => 
        [postScore] => 
        [date] => 2009-07-21 16:39:09
        [fname] => John
        [lname] => Doe
        [profileUrl] => john-doe
        [photoUrl] => uploads/userprofiles/0/84/pic84_14
    )

Ciò che vorremmo che il risultato sia è qualcosa di più simile a questo:

    [1] => array(
            [post] => array(
                [0] => array(
                    idPost => 12,
                    postContent => This is a post...,
                    idGroup => 1
                    ...
                )
            ),
            [user] => array(
                [0] => array(
                    userName => JohnDoe
                    ...
                    )
                ),
            [comments] => array(
                [0] => array(
                    idPost => 15,
                    postContent => This is a comment...,
                    idGroup => 1
                    ...
                ),
                [1] => array(
                    idPost => 17,
                    postContent => This is another comment...,
                    idGroup => 1
                    ...
                )
            )
        )

Eventuali suggerimenti ad altre soluzioni è anche molto benvenuti.

Grazie.

È stato utile?

Soluzione

Se alias tutte le colonne nel secondo si uniscono per i messaggi (come idPost come child_idPost ... ecc), si otterrà molte righe che sono la riga padre con le colonne della seconda fila. Questo é stato il più vicino si arriva. È quindi possibile prendere i dati genitore dalla prima fila, e poi scorrere le righe successive per ottenere i dati uno-a-molti.

In caso contrario, basta fare due query, uno per il genitore, una per i bambini. Può essere più veloce rispetto alla creazione di quel grande tabella dei risultati in ogni caso.

Altri suggerimenti

Zend non rende il vostro forma preferita facile, ma potrebbe essere possibile. Si noti, tuttavia, che si sta chiedendo il server di database di fare molto più lavoro di quanto si vuole realmente, perché la posta e le informazioni utente vengono duplicati per ogni commento. Justin è corretto che una seconda query è più facile e probabilmente più veloce. Tuttavia, posso fornire alcune indicazioni verso una soluzione.

Per cominciare, prendere in considerazione quello che si otterrebbe usando il Zend_Db::FETCH_NUM modalità di recupero:

Array(
    [0] => Array(
        [0] => 12
        [1] =>
        [2] => 1
        [3] => 84
        [4] => This is a post...,
        [5] => 12/this-is-a-post
        [6] =>
        [7] =>
        [8] => 2009-07-21 16:39:09
        [9] => 84
        [10] => John
        [11] => Doe
        [12] => john-doe
        [13] => uploads/userprofiles/0/84/pic84_14
        [14] => 15
        [15] => 12
        [16] => 1
        [17] => 79
        [18] => This is a comment...,
        [19] =>
        [20] =>
        [21] =>
        [22] => 2009-07-21 17:40:10
    ),
    [1] => Array(
        [0] => 12
        [1] =>
        [2] => 1
        [3] => 84
        [4] => This is a post...,
        [5] => 12/this-is-a-post
        [6] =>
        [7] =>
        [8] => 2009-07-21 16:39:09
        [9] => 84
        [10] => John
        [11] => Doe
        [12] => john-doe
        [13] => uploads/userprofiles/0/84/pic84_14
        [14] => 17
        [15] => 12
        [16] => 1
        [17] => 127
        [18] => This is another comment...,
        [19] =>
        [20] =>
        [21] =>
        [22] => 2009-07-20 10:31:26
    )
)

Quindi in qualche modo si deve venire con la mappatura dei numeri di colonna per i nomi delle tabelle e delle colonne:

Array(
    [0] => post.idPost
    [1] => post.idTopic
    [2] => post.idGroup
    [3] => post.idUser
    [4] => post.postContent
    [5] => post.postUrl
    [6] => post.postVotes
    [7] => post.postScore
    [8] => post.date
    [9] => user.idUser
    [10] => user.fname
    [11] => user.lname
    [12] => user.profileUrl
    [13] => user.photoUrl
    [14] => comment.idPost
    [15] => comment.idTopic
    [16] => comment.idGroup
    [17] => comment.idUser
    [18] => comment.postContent
    [19] => comment.postUrl
    [20] => comment.postVotes
    [21] => comment.postScore
    [22] => comment.date
)

Questa è la parte dove ottiene ingannevole, perché la parte del tavolo che è fortemente specifico per l'interfaccia di base di dati, e non sempre è possibile. Perché legata al set di risultati, l'adattatore sarà anche il posto migliore per ottenere; questo significa che l'hacking classi Zend, possibilmente fornendo la propria classe adattatore. A seconda della base di dati, le informazioni potrebbe venire da:

Altri adattatori potrebbero non avere un modo per ottenere il nome della tabella, purtroppo.

Sì abbiamo avuto lo stesso problema, appena finito di blogging su di esso: http://www.kintek.com.au/blog/zend-db-and-joins/

È necessario assegnare un nome univoco ogni campo, si tratta di un bug noto in Zend: http://framework.zend.com/issues/browse/ZF-6421?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top