Php 通过连接表(多对多)获取具有多个标记的帖子
此时,函数“getPostTag”只返回一个标记Php 通过连接表(多对多)获取具有多个标记的帖子,php,mysql,tags,many-to-many,posts,Php,Mysql,Tags,Many To Many,Posts,此时,函数“getPostTag”只返回一个标记我创建了一个连接表,该表的“post\u id”外键指向一个名为“posts”的表,而“tag\u id”外键指向一个名为“tags”的表,这些条目将相应地存储在该表中。 使用此表,我希望它能够将多个标签附加到多个帖子。 然后,它还应该能够返回每个帖子及其标记集 我怎样才能做到这一点?(如果这些功能需要完全返工,我不会感到失望。) 您可以将函数getPostTag()更改为getPostTags(),该函数将返回一个标记数组。使用与其他函数相同的m
我创建了一个连接表,该表的“post\u id”外键指向一个名为“posts”的表,而“tag\u id”外键指向一个名为“tags”的表,这些条目将相应地存储在该表中。
使用此表,我希望它能够将多个标签附加到多个帖子。
然后,它还应该能够返回每个帖子及其标记集 我怎样才能做到这一点?(如果这些功能需要完全返工,我不会感到失望。)
您可以将函数
getPostTag()
更改为getPostTags()
,该函数将返回一个标记数组。使用与其他函数相同的mysqli\u fetch\u all()。在我看来,SQL应该使用连接而不是子查询
你应该远离地球人。将参数传递给函数
我建议以这种方式改变你们的职能:
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;
}
我不建议使用SELECT*
。您应该列出需要获取的所有列。不要获取所有内容,因为这可能会导致混乱和错误的代码。您想在哪里返回这些标记?是否希望$post['tag']
成为标记数组?好的,谢谢。事实上,我真的不知道。我只是觉得这样会更有效率。正如你所看到的,我是一个彻头彻尾的SQLNoob。我感谢你的帮助。
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;
}
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);
}