Коригиране на релационна таблица?

streleca_stz

Registered
Здравейте,

Имам проблем, с който се мъча от много време - Имам 2 таблици с данни, като за връзка между двете използвам релационна таблица, съдържаща просто уникалните ключове на закачените записи.

Пример: таблица 1 съдържа новини /row_id/, таблица 2 съдържа тагове /tag_id/ и релационната таблица съдържа в себе си записи за всеки закачен таг към всяка публикация.

Да, но при редактиране на публикация искам например да сменя таговете - как обаче да сравня и заменя (изтрия и добавя) разликите? Пробвах следния начин, но не сработва винаги:
PHP:
<?php
    $old_selection = array( ... );
    $new_selection = array( ... );

    if ($old_selection != $new_selection) {
        $to_delete = array_diff($old_selection, $new_selection);
        if (!empty($to_delete)) {
            foreach ($to_delete as $del) {
                mysqli_query($conn, "DELETE FROM table_rel WHERE row_id = row_id AND tag_id = $del");   
            }
        }
        $to_add = array_diff($new_selection, $old_selection);
        if (!empty($to_add)) {
            foreach ($to_add as $add) {
                mysqli_query($conn, "INSERT INTO table_rel (tag_id, row_id) VALUES ($add, row_id)");   
            }
        }
    }
?>
 
Най-лесно, изтриваш всички тагове на публикацията и ги вкарваш на ново, 2 заявки :) :?:
 
joTunkiq каза:
Най-лесно, изтриваш всички тагове на публикацията и ги вкарваш на ново, 2 заявки :) :?:
Ами това е, че предложението ми е ясно и без да питам, но исках друго решение, което ще е по-оптимизирано, защото реално не се правят 2 завки.. с 1 delete мога да изтрия всички стари, но новите трябва с цикъл да обходя => повече конекции към БД, а ми се искаше да е само на разликите в 2-та масива...
 
http://php.net/manual/en/function.array-diff.php

PHP:
<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);

print_r($result);
?>
:idea: :?:

EDIT: Не видях, че вече си го ползваш. В момента правиш заявка за всеки таг, а може да ги обедениш и да направиш заявката извън foreach-а, за да избегнеш няколко заявки. Съответно ти трябва още една преди foreach-а, с която да си изтриеш всички тагове и толкова. Ето ти преформънс.

Пример:
PHP:
$incomming_tags = $_POST['tags'];
$sql = mysqli_query($conn,'DELETE FROM `tags` WHERE article_id='.$article_id);

$delete = mysqli_query($conn,'DELETE FROM `atricles_tags` WHERE article_id = '.$article_id.' AND tag_id in ('.trim(implode(',', incomming_tags  ),',').') ');

Това е прост пример, ти разбира се ще си го пригодиш :) :?:
 

Горе