0

我的数据库中有几个表articlestagsarticles_to_tags。后者存储一对多关系。现在,当文章更新时,我如何管理这些标签?

本质上,我只需要检查是否应该添加任何新标签,以及是否应该删除任何标签。我想删除所有相应的标签并重新添加所需的标签不是最有效的方法吗?

这是一个建议的类似问题,但我没有在那里得到答案:Best way to handle Many-to-Many Relations in PHP MySQL

谢谢

4

2 回答 2

2

假设您的 var/columns 和输入形式如下:

$tag_ids    = $_POST['tags']; // all article tags
$article_id = (int)$_POST['article_id'];

并做必要的检查用户输入,我们可以删除旧标签删除:

// delete unused tag_id for article
$db->query('DELETE FROM articles_to_tags 
            WHERE tag_id NOT IN ('.$db->quote($tag_ids).') 
            AND article_id = ?',Array($article_id));

假设article_idtag_id作为带有 insert ignore声明的唯一键,我可以添加新标签(并且只有新标签):

// insert new tag and ignore old
$qry = 'INSERT IGNORE INTO articles_to_tags (article_id,tag_id)';
$qry_values = Array();
foreach($tag_ids as $tag_id) {
    qry_values[] = "VALUES ($article_id,$tag_id)";
}
$qry .= implode(", ",$qry_values);
$db->query($qry);

最后使用 cron 脚本,我可以删除旧标签:

$db->query('DELETE FROM tags 
            WHERE tag_id NOT IN (SELECT DISTINCT tag_id FROM articles_to_tags)');

或者您可以为每篇文章更新执行此操作。我觉得没那么重。

于 2012-09-06T18:47:42.470 回答
1

当您展示文章时,您拥有所有标签,将它们存储在一个数组中。用户将编辑标签并提交,这些提交的标签必须在一个数组中,以便您可以比较两者,来自数据库的标签和来自表单的标签:

一些可能的样本:

// using sort
sort($array_from_db);
sort($array_from_form);

if($array_from_db == $array_from_from){...}


// using array_diff
$diff = array_diff($array1, $array2);
if(!count($diff)){
  # is the same
}
于 2012-09-06T11:36:14.030 回答