2015-11-13 3 views
1

Я уверен, что где-то в Интернете этот вопрос уже задан, но я его не нашел, потому что я не знаю, для чего именно я должен искать. Поэтому я попытаюсь описать проблему:SQL-Query PHP -Blog

У меня есть блог, написанный на PHP и SQL-база данных, где я получаю необходимые данные.

Каждая запись в блоге содержит 1 изображение и 1 текстовое поле и имеет свой собственный идентификатор. Чтобы получить эти данные я выполнить этот запрос (псевдо-код) -> это работает отлично:

foreach($db->query("SELECT news.id, news.position, news_text.date, news_text.text, news_images.image 
        FROM news 
        LEFT OUTER JOIN news_text ON news.id=news_text.id 
        LEFT OUTER JOIN news_images ON news_images.id = news.id 
        ORDER BY position") as $row){ 
               echo "{$row['id']}"; 
               echo "{$row['position']}"; 
               echo "{$row['date']}"; 
               echo "{$row['text']}"; 
               echo "{$row['image']}"; 
               } 

Теперь проблема начинается. Я хочу добавить поле комментария, где пользователи могут добавлять сообщение. Поэтому для каждой записи в блоге может быть несколько комментариев (вероятно, это соединение 1: n). - Я попытался добавить цикл foreach в цикл foreach (глупый) - Я попытался с несколькими SQL-запросами, но получил только мусор в результате - Я не вижу логики подключения базы данных news_comment с другими

Вот моя упрощенная база данных:

enter image description here

может кто-нибудь дать мне подсказку, как я мог бы решить эту проблему. Результат должен быть:

foreach($db->query("SELECT news.id, news.position, news_text.date, news_text.text, news_images.image 
        FROM news 
        LEFT OUTER JOIN news_text ON news.id=news_text.id 
        LEFT OUTER JOIN news_images ON news_images.id = news.id 
        ORDER BY position") as $row){ 
               echo "{$row['id']}"; 
               echo "{$row['position']}"; 
               echo "{$row['date']}"; 
               echo "{$row['text']}"; 
               echo "{$row['image']}"; 
      Here i get for each blog-entry the corresponding comments..    
               } 

спасибо. Misch

ответ

1

Вы должны получать комментарии в другом запросе (не в цикле), используя те же условия, что и для получения новостей. Чтобы после выполнения обоих запросов вам приходилось массивы: новости и комментарии.

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

Наконец, было бы выглядеть следующим образом:

$news = [ 
    [ 
     'id' => ..., 
     'position' => ... 
     <so on> 
    ] 
]; 

$comments = [ 
    $news[0]['id'] = [<comment array>], 
    <so on> 
]; 

Это путь наиболее рамочное использовать, чтобы иметь данные, связанные в наборе результатов.

+0

Большое спасибо за ваш ответ. Я попробую как можно скорее, но у меня есть еще одна проблема, которая мешает мне попробовать это на данный момент. – Mischu

1

Решил его с помощью Alex (thx) и MulipleIterator. Вот как это сработало для меня (может быть, у кого-то есть лучшее решение).

foreach($db->query("SELECT news.id, news.position, news_text.date, news_text.text, news_images.image 
FROM news 
LEFT OUTER JOIN news_text ON news.id=news_text.id 
LEFT OUTER JOIN news_images ON news_images.id = news.id 
ORDER BY position") as $row) 
    { 
    $news_id[] = $row['id']; 
    $news_text[] = $row['news_text']; 
    $news_images[] = $row['news_images']; 
    $values = new MultipleIterator(); 
    $values->attachIterator(new ArrayIterator($news_id)); 
    $values->attachIterator(new ArrayIterator($news_text)); 
    $values->attachIterator(new ArrayIterator($news_images)); 
    } 

foreach($values as $value) 
    { 
    list($news_text, $news_images, $news_id) = $value; 
    { 
    echo '$news_text'; 
    echo '$news_images'; 

    foreach($db->query("SELECT comment FROM news_comment WHERE id = $news_id ") as $row) 
     { 
     echo "{$row['comment']}"; 
     } 
    } 
    }