2009-07-22 4 views
0

Сообщения и комментарии хранятся в одной таблице. Таким образом, чтобы каждый пост и его комментарии мы делаем это:Zend Выбрать с самоподписывающимися полями перезаписи

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

Любые намеки на другие решения также очень приветствуются.

Спасибо.

+1

SQL не работает так. Вам нужно будет сделать ряд запросов для извлечения данных в этом формате. – jason

ответ

1

Если вы добавили все столбцы во втором соединении к сообщениям (например, idPost как child_idPost ... и т. Д.), Вы получите много строк, которые являются родительской строкой с столбцами второй строки. Вот о ближайшем вы получите. Затем вы можете захватить родительские данные из первой строки, а затем пропустить последующие строки, чтобы получить данные «один ко многим».

В противном случае просто выполните два запроса, один для родителя, один для детей. Это может быть быстрее, чем создание этой таблицы с большим результатом.

+0

Да, похоже, что сглаживание - единственное решение для предотвращения перекрытия, то, что мы закончили, - это цикл, который заставляет другой запрос получать комментарии к каждому сообщению.Таким образом, страница с 10 сообщениями - это 11 запросов и более, это так неправильно. – lasse

+0

Это может быть сведено до 2 запросов, собирая все идентификаторы сообщений из первого запроса в предложение «IN (...)» второго запроса. Это делает объединение детей с родителями немного сложнее, но возможно. – eswald

0

Zend не делает вашу предпочтительную форму легкой, но это возможно. Обратите внимание, однако, что вы просите сервер базы данных делать гораздо больше работы, чем вы на самом деле хотите, потому что сообщения и информация пользователя дублируются для каждого комментария. Джастин прав, что второй запрос проще и, вероятно, быстрее. Тем не менее, я могу предложить некоторые рекомендации в отношении решения.

Для начала, рассмотрим, что вы получите, используя 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, возможно, предоставляя свой собственный класс адаптера. В зависимости от используемой базы данных, информация может поступать от:

Другие адаптеры могут не иметь способ получить имя таблицы, к сожалению.

 Смежные вопросы

  • Нет связанных вопросов^_^