Pregunta

Entradas y comentarios se almacenan en la misma tabla. Así que para cada puesto y sus comentarios que hacemos esto:

    $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();

El problema es que la matriz resultante es plana y los datos comentario sobrescribe los datos de correos, esto es un ejemplo de lo que se devuelve:

[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
    )

Lo que nos gustaría que el resultado sea algo más como esto:

    [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
                    ...
                )
            )
        )

¿Alguna pista a otras soluciones también es muy bienvenido.

Gracias.

¿Fue útil?

Solución

Si alias todas las columnas de la segunda se unen a los postes (como idPost como child_idPost ... etc), obtendrá el número de filas que son la fila principal con las columnas de la segunda fila. Eso es de la que más se aproxima. A continuación, puede tomar los datos de los padres de la primera fila, y luego recorrer las filas posteriores para obtener sus datos de uno a muchos.

De lo contrario, acaba de hacer dos consultas, una para los padres, uno para los niños. Puede ser más rápido que la creación de ese gran tabla de resultados de todos modos.

Otros consejos

Zend no hace que su forma preferida fácil, pero puede ser que sea posible. Tenga en cuenta, sin embargo, que usted está pidiendo el servidor de base de datos para hacer mucho más trabajo de lo que realmente quiere, porque el mensaje y la información del usuario se duplican en cada comentario. Justin es correcto que una segunda consulta es más fácil y probablemente más rápido. Sin embargo, puedo proporcionar algunas indicaciones hacia una solución.

Para empezar, tenga en cuenta lo que se obtendría mediante el uso de la Zend_Db::FETCH_NUM de recuperacion:

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
    )
)

A continuación, de alguna manera tiene que llegar a la asignación de los números de las columnas para los nombres de tablas y columnas:

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
)

Esta es la parte donde se pone difícil, debido a que la parte de la mesa de eso es muy específica a la interfaz de base de datos, y no siempre es posible. Porque está ligado al conjunto de resultados, el adaptador también será el mejor lugar para obtenerlo; eso significa que la piratería clases de Zend, posiblemente, proporcionando a su propia clase adaptador. Dependiendo de su base de datos, la información puede provenir de:

Otros adaptadores pueden no tener una manera de obtener el nombre de la tabla, por desgracia.

Sí hemos tenido el mismo problema, acaba de terminar un blog sobre él: http://www.kintek.com.au/blog/zend-db-and-joins/

Es necesario nombrar a cada campo de forma única, es un error conocido de Zend: http://framework.zend.com/issues/browse/ZF-6421?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top