Question

Messages et commentaires sont stockés dans la même table. Donc, pour obtenir chaque poste et ses commentaires que nous faisons:

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

Le problème est que le tableau résultant est plat et les données de commentaires écrase les données de poste, ceci est un exemple de ce qui est de retour:

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

Ce que nous voudrions que le résultat soit quelque chose de plus comme ceci:

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

Les conseils à d'autres solutions est également la bienvenue.

Merci.

Était-ce utile?

La solution

Si vous alias toutes les colonnes du second rejoignent à des postes (comme idPost comme child_idPost ... etc), vous aurez de nombreuses lignes qui sont la ligne parente avec les colonnes de la deuxième rangée. Cest sur le plus proche que vous obtiendrez. Vous pouvez alors saisir les données parent de la première ligne, puis une boucle sur les lignes suivantes pour obtenir votre one-to-many données.

Dans le cas contraire, il suffit de faire deux requêtes, l'une pour les parents, une pour les enfants. Il peut être plus rapide que la création de cette grande table de résultat de toute façon.

Autres conseils

Zend ne rend pas votre forme préférée facile, mais il pourrait être possible. Notez toutefois que vous demandez au serveur de base de données pour faire beaucoup plus de travail que vous voulez vraiment, parce que le poste et les informations utilisateur sont dupliqués pour chaque commentaire. Justin est correct qu'une deuxième requête est plus facile et probablement plus rapide. Cependant, je peux fournir quelques conseils pour trouver une solution.

Pour commencer, pensez à ce que vous obtiendriez en utilisant le mode de récupération Zend_Db::FETCH_NUM:

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

Ensuite, vous avez en quelque sorte à venir avec la mise en correspondance des numéros de colonnes pour les noms de table et de 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
)

Ceci est la partie où il devient difficile, parce que la partie de la table de qui est fortement spécifique à l'interface de base de données, et pas toujours possible. Parce qu'il est lié à l'ensemble de résultats, l'adaptateur sera également le meilleur endroit pour l'obtenir; cela signifie que le piratage des classes Zend, peut-être en fournissant votre propre classe d'adaptateur. En fonction de votre base de données, les informations pourraient provenir:

D'autres adaptateurs pourraient ne pas avoir un moyen d'obtenir le nom de la table, malheureusement.

Oui, nous avons eu le même problème, vient de terminer les blogs à ce sujet: http://framework.zend.com/issues/browse/ZF-6421?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top