web-dev-qa-db-fra.com

Un champ de clé étrangère ne se mettant pas à jour en tant que NULL

J'ai un champ 'leavepack_id' dans une table avec la définition de table ci-dessous

CREATE TABLE IF NOT EXISTS `#__position` (
  `position_id` int(11) NOT NULL AUTO_INCREMENT,
  `leavepack_id` int(9) DEFAULT NULL,
  PRIMARY KEY (`position_id`),
  FOREIGN KEY (`leavepack_id`) REFERENCES `#__leavepack`(`leavpack_id` ON UPDATE CASCADE ON DELETE SET NUL
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Selon la définition ci-dessus, le champ leavepack_id peut accepter un identifiant valide ou NULL.

Voici le code que j'ai dans mon modèle

if ($data['leavepack_id'] == '')  $data['leavepack_id'] = NULL;
$success = parent::save($data);

Le problème:

Lorsqu'un enregistrement existant ayant un identifiant valide est enregistré avec null, la mise à jour conserve l'identifiant tel quel au lieu d'être stocké sous la forme NULL.

En d'autres termes:

Supposons que l'enregistrement existant a position_id = 1 and leavepack_id = 2. Lors de la mise à jour, la valeur est la suivante: position_id = 1 and leavepack_id = NULL. Le problème est que NULL n'est pas stocké.

Après avoir débogué certains des fichiers Joomla principaux, je suis en mesure de trouver la cause. La fonction bind () dans JTable ignore le champ ayant la valeur NULL.

Quelqu'un peut-il m'aider s'il vous plaît à ce sujet.

3
Malaiselvan

J'ai réussi à surcharger la méthode save () du modèle en appelant les méthodes bind () et store (), ainsi que les valeurs NULL.

    if ($data['leavepack_id'] == '')  $data['leavepack_id'] = NULL;

    $table = $this->getTable();
    if(!$table->bind($data)){
        $this->setError($this->_db->getErrorMsg());
        return false;
    }

    if(!$table->store(true)){
        $this->setError($this->_db->getErrorMsg());
        return false;
    }

Pas tout à fait sûr que ce soit la bonne façon, mais cela fonctionne dans mon cas.

3
Malaiselvan

Vous devriez vous en occuper dans JTable uniquement.

Cette partie:

if ($data['leavepack_id'] == '')  $data['leavepack_id'] = NULL;

vous devriez insérer dans JTable :: check () comme ceci:

public function check(){
    if ($this->leavepack_id == '')  $this->leavepack_id = NULL;

    return parent::check();
}

puis écrasez la fonction store comme ceci:

public function store($updateNulls = true){
    return parent::store($updateNulls);
}

Si vous faites comme cela, non seulement cette fonctionnalité est disponible à chaque endroit où vous souhaitez utiliser cette table (cette référence JTable), mais elle permet également de désactiver la mise à jour des valeurs NULL à la demande.

1
Artur Stępień