deadjournal/models/TagModel.php

85 lines
2.3 KiB
PHP
Raw Permalink Normal View History

2025-01-08 22:46:44 +05:00
<?php
namespace Models;
use Core\Model;
use PDO;
class TagModel extends Model
{
public function createIfNotExists($tagName)
{
// Check if a tag exists
$stmt = $this->db->prepare("SELECT id FROM tags WHERE name = :name LIMIT 1");
$stmt->execute(['name' => $tagName]);
$tag = $stmt->fetch(PDO::FETCH_ASSOC);
if ($tag) {
return $tag['id'];
}
// If not, then create
$stmt = $this->db->prepare("INSERT INTO tags (name) VALUES (:name)");
$stmt->execute(['name' => $tagName]);
return $this->db->lastInsertId();
}
public function addTagToPost($postId, $tagId)
{
$stmt = $this->db->prepare("INSERT IGNORE INTO post_tags (post_id, tag_id) VALUES (:post_id, :tag_id)");
return $stmt->execute([
'post_id' => $postId,
'tag_id' => $tagId
]);
}
public function getTagsByPostId($postId)
{
$stmt = $this->db->prepare("
SELECT t.* FROM tags t
JOIN post_tags pt ON t.id = pt.tag_id
WHERE pt.post_id = :post_id
");
$stmt->execute(['post_id' => $postId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
public function getPostsByTagName($tagName)
{
$stmt = $this->db->prepare("
SELECT p.*
FROM posts p
JOIN post_tags pt ON p.id = pt.post_id
JOIN tags t ON t.id = pt.tag_id
WHERE t.name = :tagName
ORDER BY p.created_at DESC
");
$stmt->execute(['tagName' => $tagName]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
public function removeAllTagsFromPost($postId)
{
$stmt = $this->db->prepare("DELETE FROM post_tags WHERE post_id = :post_id");
return $stmt->execute(['post_id' => $postId]);
}
public function getAllTagsWithCounts()
{
$sql = "
SELECT
t.id,
t.name,
COUNT(pt.post_id) AS total
FROM tags t
LEFT JOIN post_tags pt ON t.id = pt.tag_id
GROUP BY t.id, t.name
HAVING COUNT(pt.post_id) != 0
ORDER BY total DESC;
";
$stmt = $this->db->query($sql);
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
}
}