微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过联结表获取带有多个标签的帖子多对多

如何解决通过联结表获取带有多个标签的帖子多对多

目前,函数 getPostTag ”仅返回一个标签
我创建了一个联接表,该联接表的外键为“ posts ”和“ tag_id”表的外键“ post_id ”外键到名为“ 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;
}

解决方法

您可以将函数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 *。您应该列出所有需要获取的列。不要获取所有内容,因为这可能会导致代码混乱和错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。