문제

게시물과 댓글은 같은 테이블에 저장됩니다. 따라서 각 게시물과 주석을 얻으려면 다음을 수행합니다.

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

문제는 결과 배열이 평평하고 주석 데이터가 게시물 데이터를 덮어 쓰는 것입니다. 이것이 반환 된 내용의 예입니다.

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

우리가 결과를 원하는 것은 다음과 같습니다.

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

다른 솔루션에 대한 힌트도 매우 환영합니다.

감사.

도움이 되었습니까?

해결책

두 번째 열에있는 모든 열이 게시물에 대한 모든 열을 별칭 (idpost as child_idpost ... 등)에 따라 두 번째 행의 열이있는 부모 행 인 많은 행을 얻을 수 있습니다. 그것은 당신이 가장 가까운 곳에 관한 것입니다. 그런 다음 첫 번째 행에서 부모 데이터를 가져온 다음 후속 행을 통해 루프를 통해 일대일 데이터를 얻을 수 있습니다.

그렇지 않으면, 부모를위한 두 가지 쿼리 만, 하나는 아이들을위한 것입니다. 어쨌든 큰 결과 테이블을 만드는 것보다 빠를 수 있습니다.

다른 팁

Zend는 선호하는 형태를 쉽게 만들지 않지만 가능할 수 있습니다. 그러나 게시물과 사용자 정보가 각 주석에 대해 복제되기 때문에 데이터베이스 서버에 실제로 원하는 것보다 훨씬 더 많은 작업을하도록 요청하고 있습니다. Justin은 두 번째 쿼리가 더 쉽고 빠를 수 있다는 것이 맞습니다. 그러나 솔루션에 대한 몇 가지 포인터를 제공 할 수 있습니다.

시작하려면 사용하여 얻을 수있는 것을 고려하십시오. 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
    )
)

그런 다음 어떻게 든 열 번호를 테이블 및 열 이름에 매핑해야합니다.

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
)

테이블 부분은 데이터베이스 인터페이스에 강력하고 항상 가능하지 않기 때문에 까다로워지는 부분입니다. 결과 세트에 묶여 있기 때문에 어댑터는 또한 그것을 얻기에 가장 적합한 장소가 될 것입니다. 즉, Zend 클래스를 해킹하는 것은 아마도 자신의 어댑터 클래스를 제공함으로써 가능합니다. 데이터베이스에 따라 정보는 다음과 같습니다.

다른 어댑터는 불행히도 테이블 이름을 얻을 방법이 없을 수 있습니다.

예, 우리는 같은 문제를 겪었습니다. 방금 블로깅을 마쳤습니다. http://www.kintek.com.au/blog/zend-db-and-joins/

각 필드의 이름을 고유하게 지정해야합니다. Zend에서 알려진 버그입니다. http://framework.zend.com/issues/browse/zf-6421?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top