处理一对多数据更新的有效方法

时间:2012-09-06 11:21:53

标签: php mysql

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

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

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

由于

2 个答案:

答案 0 :(得分: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_idinsert 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)');

或者您可以为每篇文章更新执行此操作。我认为这不是那么重。

答案 1 :(得分: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
}