UnaviaMedia Ответов: 0

Как создать список сообщений с соответствующими объектами тегов из 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, что в какой-то степени полезно, но в конечном счете не слишком полезно, поскольку я также сильно склоняюсь к тому, чтобы выяснить, как впоследствии создать список сообщений (с вложенными списками тегов). Любая помощь или идеи будут очень оценены!

0 Ответов