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

Php 处理一对多数据更新的有效方法,php,mysql,Php,Mysql,我的数据库中有几个表:文章,标签和文章到标签。后者存储一对多关系。现在,当文章更新时,我如何管理这些标记 本质上,我只需要检查是否有任何新的标签应该添加,以及是否有任何标签应该删除。我想删除所有相应的标签并重新添加所需的标签不是最有效的方法 这里有一个类似的问题,但我没有得到答案: 谢谢当你展示这篇文章时,你有了所有的标签,将它们存储在一个数组中。用户将编辑标签并提交,这些提交的标签必须位于一个数组中,以便您可以将来自数据库的标签和来自表单的标签与以下内容进行比较: 一些可能的样本:

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

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

这里有一个类似的问题,但我没有得到答案:


谢谢

当你展示这篇文章时,你有了所有的标签,将它们存储在一个数组中。用户将编辑标签并提交,这些提交的标签必须位于一个数组中,以便您可以将来自数据库的标签和来自表单的标签与以下内容进行比较:

一些可能的样本:

// 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
}

当您显示文章时,您拥有所有的标记,并将它们存储在一个数组中。用户将编辑标签并提交,这些提交的标签必须位于一个数组中,以便您可以将来自数据库的标签和来自表单的标签与以下内容进行比较:

一些可能的样本:

// 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
}

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

$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\u id
tag\u id
作为带有
insert ignore
语句的唯一键,我可以添加新标签(并且只添加新标签):

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

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

或者,您可以为每一篇文章更新一次。我认为这没什么大不了的。

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

$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\u id
tag\u id
作为带有
insert ignore
语句的唯一键,我可以添加新标签(并且只添加新标签):

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

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

或者,您可以为每一篇文章更新一次。我觉得没那么重。

我喜欢这个主意。谢谢,我喜欢这个主意。谢谢好的,所以我刚刚意识到,我已经看到了一个更优雅的解决方案,它不会执行
删除操作。在一些CMS或框架中看到了它。这提醒我自己找到它并发布在这里。好吧,我刚刚意识到我已经看到了一个更优雅的解决方案,它不需要执行
删除操作。在一些CMS或框架中看到了它。这是一个提醒我自己找到它,并张贴在这里。