Хорошо, у меня есть простой вопрос … У меня есть база данных с двумя таблицами:
Статьи (id, content, title, date)
- Есть ли в Microsoft SQL Server драйвер для PHP имеет ограничение на длину строки запроса?
- Заказывать записи запросов SQL по частоте
- выбрать все комментарии со всеми сообщениями php mysql
- Наилучшая практика MySQL: дети SELECT рекурсивны, насколько это возможно?
- Получение необработанной строки запроса SQL из подготовленных операторов PDO
Комментарии (id_article, имя пользователя, контент)
И я хочу получить массив JSON следующим образом:
[ { "id": "5785634a87c5a0075bf211de", "title": "Elita", "content": "Commodo ea enim dolor enim adipisicing ut mollit .", "date":"15July2016" "comments": [ { "username": "Tran", "content": "Ea aliqua sit fugiat adipisicing." }, { "username": "Noreen", "content": "Commodo qui ea nulla est officia. non." }, { "username": "Gilliam", "content": "Esse cupidatat adipisicing sit minim." } ] } ]
Итак, мой вопрос … Возможно ли только с одним запросом? 🙂 Спасибо вам
Вы можете ЛЕВАЯ ВСТУПИТЬ, чтобы получить все данные, которые вам нужны, при повторении этого вам просто нужно позаботиться о том, как вы обрабатываете данные.
$lastArticleId = null; $comments = []; $elements = []; $sql = 'SELECT Articles.*, Comments.content AS comment, Comments.username FROM Articles LEFT JOIN Comments ON Articles.id = Comments.id_article'; $result = $pdo->query($sql); foreach ($result->fetchAll(PDO::FETCH_OBJ) as $dataset) { if($lastArticleId !== $dataset->id){ $lastArticleId = $dataset->id; $elements[$lastArticleId] = [ 'id' => $dataset->id, 'title' => $dataset->title, 'content' => $dataset->content, 'date' => $dataset->date, 'comments' => [], ]; } $comments[$lastArticleId][] = [ 'content' => $dataset->comment, 'username' => $dataset->username, ]; } foreach ($elements as $key => $article) { $article['comments'] = $comments[$key]; $fullData[] = $article; } echo json_encode($fullData);
Но : Просто потому, что вы можете, это не значит, что вы должны.
Расщепление этой задачи в двух запросах намного легче писать и читать. Поэтому, если вам по какой-то причине нужно коснуться этой части кода (или кого-то еще), он будет рад, что вы выбрали подход с двумя запросами.
Также полезно разбить задачи, поэтому в идеале вы бы создали методы на вашем уровне доступа к базе данных getAllArticles()
и еще один getCommentsByArticleId($id_article)
. Таким образом, вы можете получить все комментарии, не загружая всю статью.
В конце вам нужно будет сделать 2 запроса, -.- '
Здесь будет PHP-код (например, getJSON.php):
$array = []; $sql = 'SELECT * FROM Articles'; $q = mysql_query($sql) or die ("Error in $sql: ".mysql_error()); while ($rs = mysql_fetch_object($q)) { $element = [ 'id' => $rs->id, 'title' => $rs->title, 'content' => $rs->content, 'date' => $rs->date, 'comments' => [], ]; $sql2 = 'SELECT * FROM Comments WHERE id_article = '.$rs->id; $q2 = mysql_query($sql2) or die ("Error in $sql2: ".mysql_error()); while ($rs2 = mysql_fetch_object($q2)) { $comment = [ 'username' => $rs2->username, 'content' => $rs2->content, ]; $element['comments'] = $comment; } $array[] = $element; } echo json_encode($array);
И это может быть как вызов jQuery или Javascript для получения JSON, сгенерированного в PHP-скрипте:
jQuery.getJSON('getJSON.php', {}, function (data) {}
И хорошо, тогда остальное у вас уже есть, я думаю …
Надеюсь, это вам помогло. Дай мне знать! И удачи! 😉