【问题标题】:Get posts with multiple tags via junction table (many-to-many)通过联结表(多对多)获取具有多个标签的帖子
【发布时间】:2021-01-30 12:10:50
【问题描述】:

目前函数“getPostTag”只返回一个标签。
我创建了一个联结表,其中包含一个名为“posts”的表的外键“post_id”和一个“tag_id em>” 到名为“tags” 的表的外键,这些条目相应地存储在该表中。
有了这张表,我希望它能够将多个标签附加到多个帖子。
然后它还应该能够返回带有标签集的每个帖子。

我怎样才能做到这一点? (如果这些功能需要完全重做,我不会失望。)

function getPosts() {
    global $conn;
    $sql = "SELECT * FROM posts ORDER BY id DESC";
    $result = mysqli_query($conn, $sql);
    $posts = mysqli_fetch_all($result, MYSQLI_ASSOC);

    $final_posts = array();
    foreach ($posts as $post) {
        $post['tag'] = getPostTag($post['id']); 
        array_push($final_posts, $post);
    }
    return $final_posts;
}
function getPostTag($post_id){
    global $conn;
    $sql = "SELECT * FROM tags WHERE id=
            (SELECT tag_id FROM post_tags WHERE post_id=$post_id) LIMIT 1";
    $result = mysqli_query($conn, $sql);
    $tag = mysqli_fetch_assoc($result);
    return $tag;
}

【问题讨论】:

  • 您想在哪里返回这些标签?你想让$post['tag'] 成为一个标签数组吗?
  • 好的,谢谢。我真的不知道,其实。我只是认为这将是有效的。如您所见,我是一个完全的 SQL 菜鸟。感谢您的帮助。

标签: php mysql tags many-to-many posts


【解决方案1】:

您可以将函数getPostTag() 更改为getPostTags(),这将返回一个标签数组。使用 mysqli_fetch_all() 与您的其他功能相同。在我看来,SQL 应该使用 JOIN 而不是子查询。

你应该远离全局变量。而是将参数传递给函数。

我建议以这种方式更改您的功能:

function getPosts(mysqli $conn): ?array {
    $posts = $conn->query("SELECT * FROM posts ORDER BY id DESC")->fetch_all(MYSQLI_ASSOC);

    foreach ($posts as $id => $post) {
        $posts[$id]['tag'] = getPostTags($conn, $post['id']);
    }
    return $posts;
}
function getPostTags(mysqli $conn, int $post_id): ?array {
    $stmt = $conn->prepare("SELECT * 
        FROM tags 
        JOIN post_tags ON tags.id = post_tags.tag_id
        WHERE post_id=?");
    // binding as an integer since we know the type
    $stmt->bind_param('i', $post_id);
    $stmt->execute();

    return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
}

我不建议使用SELECT *。您应该列出需要获取的所有列。不要获取所有内容,因为这可能会导致代码混乱和错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 2021-07-22
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2017-07-20
    相关资源
    最近更新 更多