web-dev-qa-db-fra.com

Où ajouter des enregistrements de liaison M-N après l'enregistrement d'un autre enregistrement?

Dans ma composante, j'ai 3 tables, 2 tables d'objets (Course et Module), et 1 table de liaison (Course_Modules).

Dans mon formulaire de modification de cours, j'ai une sélection multiple qui permet aux utilisateurs de choisir un ou plusieurs modules faisant partie d'un cours.

Lorsque cela est enregistré, je dois ajouter des enregistrements de liaison avec courseId et moduleId à Course_modules.

Cependant, je ne veux pas faire cela si le save échoue - seulement si l'enregistrement du cours est correctement enregistré.

Il semble y avoir d'innombrables endroits pour y arriver (JTable save (), JControllerForm save (), JTable bind (), JTable store (), dans le modèle), mais j'aimerais que cela ne se produise que si la sauvegarde principale réussissait. . Quelqu'un at-il des conseils sur la meilleure façon de le faire?

1
codinghands

Je le mettrais dans le modèle:

public function save($data)
{
    $return = parent::save($data);

    if ($return)
    {
        $dispatcher = JDispatcher::getInstance();
        $table = $this->getTable();
        $key = $table->getKeyName();
        // $pk is the new id of the saved record
        $pk = (!empty($data[$key])) ? $data[$key] : (int) $this->getState($this->getName() . '.id');

        // here your save Course_Modules method
        return true;
    } else {
        return false;   
    }
}

Btw. J'avais l'habitude d'utiliser cette méthode d'un troisième tableau (de liaison) aussi. Jusqu'à ce que j'ai trouvé la fonction mysql FIND_IN_SET. https://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

Vous pouvez stocker plusieurs ID_module dans un champ appelé ID_module.
Par exemple '1,3,4,8'
Avec FIND_IN_SET, vous obtiendrez vos requêtes (frontales) sans avoir besoin d'une troisième table.

2