0

データベースにいくつかのテーブルがあります:articles、、。後者は1対多の関係を保存します。さて、記事が更新されたときにこれらのタグを管理するにはどうすればよいですか?tagsarticles_to_tags

基本的に、追加する必要のある新しいタグがあるかどうか、および削除する必要のあるタグがあるかどうかを確認する必要があります。対応するすべてのタグを削除して、必要なタグを再度追加するのは、最も効果的な方法ではないと思いますか?

提案された同様の質問がありますが、私はそこに答えを得ることができませんでした:PHPMySQLで多対多の関係を処理するための最良の方法

ありがとう

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_idと仮定します。tag_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)');

または、記事の更新ごとに行うことができます。それほど重くないと思います。

于 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 に答える