Как создать список сообщений с соответствующими объектами тегов из mysql
концептуальная проблема
Как вы справляетесь с созданием списка вложенных объектов в PHP из реляционной базы данных MySQL?
Фон
В настоящее время я нахожусь в процессе создания своего собственного блога с нуля в PHP / MySQL. До сих пор я реализовал фреймворк типа MVC, маршрутизацию и обработку ошибок (все работает нормально). Одна из главных функций, отсутствующих до сих пор, - это теги. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу продумать процесс продуктивно создание списка объектов Post из базы данных, где каждый объект Post имеет список связанных объектов тегов.
Чтобы создать страницу индекса блога, у меня должен быть список объектов блога, каждый со своим собственным списком объектов тегов. Хотя восстановление тегов для одного объекта Post легко понять, я бы предпочел не запускать отдельный запрос для каждого сообщения при перечислении их всех (индексная страница).
Примечание
Я прекрасно понимаю, что изобретать велосипед не рекомендуется. Однако я делаю это только в информационных / учебных целях! Кроме того, это означает, что я бы очень предпочел не использовать какие-либо фреймворки, если это возможно, и планирую остаться с MySQL. Спасибо Вам за то, что вы все равно подумали об обратном!
описание классов
Вот очень простое описание класса, чтобы показать корреляцию между постами и тегами (теги вложены).
РНР
Post { public $id; public $title; //Array of Tag objects public $tags = array(); } Tag { public $id; public $name; public $description; }
//Representation of target object hierarchy posts: [{ id: 1, title: "Post 1", tags: [{ id: 23, name: "Tag 23", description: "Tag 23 Description" }, { id: 6, name: "Tag 6", description: "Tag 6 Description" }] }, { id: 2, title: "Post 3", tags: [] }, ... ]
+----+-----------+ | post | +----+-----------+ | id | title | +----+-----------+ +----+---------------------+ | tag | +----+-------+-------------+ | id | name | description | +----+-------+-------------+ -- Association (membership) table for posts to tags +----+-----------------+ | post_tag | +---------+------------+ | post_id | tag_id | +---------+------------+
Идеи
Пусть `n ' равно числу необходимых запросов
Пусть `t ' равно количеству тегов, которые имеет сообщение
1. интенсивный запрос ('n = 1 + t`)
- Запросите список всех записей, а затем для каждой записи отправьте еще один запрос для всех тегов, связанных с этой записью
2. Интенсивный сервер ('n = 2`)
- Запрос списка всех сообщений и списка всех тегов / ассоциаций
- Цикл над записями и вложите еще один цикл против записей тегов, чтобы добавить все связанные теги
3. Интенсивный Сервер (`1`)
- Запрос списка всех сообщений, присоединенных к тегам (упорядоченных по идентификатору сообщения)
- Цикл по записям и создание тегов для текущей записи, добавление записи и запуск новой при изменении идентификатора записи
Что я уже пробовал:
// Idea 1 (horrendous in my eyes) - NOTE: Fake code (untested) to give an general idea // One initial query, than a lot later on depending on the number of posts * tags per post $postRecordSet = $conn->query("SELECT * FROM post ORDER BY id"); $posts = array(); //Create list of posts while ($row = $postRecordSet->fetch_assoc()) $id = $row["id"]; //Select all tags for each post $tagResultSet = $conn->query("SELECT * FROM posts_tags AS pt INNER JOIN tags AS t ON pt.tag_id = t.id WHERE pt.post_id = $id"); $tags = array(); //Create list of Tags while ($row = $tagResultSet->fetch_assoc()) { $tags[] = new Tag($row["id"], $row["name"]); } //Create post object from recordset (with list of tags) and add to list of posts $post = new Post($row["id"], $row["title"], $tags); $posts[] = $post; }
Очевидно, что этот способ крайне неэффективен (из-за возможного количества запросов), но его легче всего понять. Однако я не уверен, какие другие варианты следует использовать или в какой степени они могут быть объединены. Пожалуйста, дайте мне знать хорошие способы приблизиться к этому. Спасибо!
Оговорка
Я уже потратил время на изучение нескольких "похожих" вопросов, и ни один из них не ответил на мой вопрос очень хорошо (по крайней мере, в моем понимании). Большинство из них имеют дело просто с возвращением вложенных данных из MySQL, что в какой-то степени полезно, но в конечном счете не слишком полезно, поскольку я также сильно склоняюсь к тому, чтобы выяснить, как впоследствии создать список сообщений (с вложенными списками тегов). Любая помощь или идеи будут очень оценены!