it-swarm.com.de

Ein Fremdschlüsselfeld, das nicht als NULL aktualisiert wird

Ich habe ein Feld 'leavepack_id' in einer Tabelle mit der folgenden Tabellendefinition

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 ;

Nach der obigen Definition kann das Feld leavepack_id eine gültige ID oder NULL annehmen.

Hier ist der Code, den ich in meinem Modell habe

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

Das Problem:

Wenn ein vorhandener Datensatz mit einer gültigen ID mit null gespeichert wird, behält die Aktualisierung die ID wie sie ist bei, anstatt sie als NULL zu speichern.

Mit anderen Worten:

Angenommen, der vorhandene Datensatz hat position_id = 1 and leavepack_id = 2. Bei der Aktualisierung kommt der Wert als position_id = 1 and leavepack_id = NULL. Das Problem ist NULL ist nicht gespeichert.

Nach dem Debuggen einiger der wichtigsten Joomla-Dateien kann ich die Hauptursache finden. Die Funktion bind () in JTable ignoriert das Feld mit dem Wert NULL.

Kann mir bitte jemand dabei helfen.

3
Malaiselvan

Ich konnte die model save () -Methode überschreiben, indem ich die bind () - und store () - und store-NULL-Werte aufrief.

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

Nicht 100% sicher, ob dies der richtige Weg ist, aber es funktioniert für meinen Fall.

3
Malaiselvan

Sie sollten dies nur in JTable erledigen.

Dieser Teil:

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

du solltest folgendes in JTable :: check () einfügen:

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

    return parent::check();
}

und überschreiben Sie dann die Speicherfunktion wie folgt:

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

Wenn Sie es so machen, ist nicht nur diese Funktionalität an jedem Ort verfügbar, an dem Sie diese Tabelle verwenden möchten (diese JTable-Referenz), sondern ermöglicht auch das Deaktivieren der Nullaktualisierung bei Bedarf.

1
Artur Stępień