4 Stimmen

Codeigniter Activerecord Update-Methode weigert sich, NULL-Wert einfügen

Ich verwende Codeigniters Active Record Library, um eine Aktualisierung einer Spalte in meiner DB durchzuführen.

Hier ist die SQL-Anweisung für die Tabelle

CREATE TABLE `schedules` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`reservation_id` INT(11) NULL DEFAULT NULL,
`title` VARCHAR(255) NOT NULL,
`description` VARCHAR(512) NULL DEFAULT NULL,
`start_date` DATE NOT NULL,
`start_time` TIME NOT NULL,
`end_time` TIME NULL DEFAULT NULL,
`enabled` TINYINT(1) NULL DEFAULT '1',
`status` ENUM('OPEN','RESERVED') NULL DEFAULT 'OPEN',
PRIMARY KEY (`id`),
INDEX `fk_schedules_reservations` (`reservation_id`),
CONSTRAINT `fk_schedules_reservations` FOREIGN KEY (`reservation_id`) REFERENCES `reservations` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION

)

Ich habe reservation_id als nullable deklariert ( reservation_id INT(11) NULL DEFAULT NULL )

Das Problem ist, dass CI anscheinend keinen NULL-Wert senden möchte, wenn ich die Anweisung erstelle.

$data['status'] = $this->Schedule->get_status_open();
$data['reservation_id'] = null; 
$this->Schedule->update($s_id, $data);

Dieser Teil des Codes erzeugt nur die folgende Fehlermeldung

Error Number: 1452

Cannot add or update a child row: a foreign key constraint fails (`ethyme/schedules`, CONSTRAINT `fk_schedules_reservations` FOREIGN KEY (`reservation_id`) REFERENCES `reservations` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)

UPDATE `schedules` SET `status` = 'OPEN', `reservation_id` = '' WHERE `id` = '4'

Von dem, was ich weiß, ist alles, was Sie tun müssen, setzen Sie den Wert auf NULL und AR sollte abholen, dass es ein NULL-Wert ist, aber das scheint nicht der Fall hier sein. Nur hält senden leere Werte.

Ich bin neu bei CI, muss ich noch etwas anderes tun, damit es funktioniert?

20voto

Phil Sturgeon Punkte 30202

Versuchen Sie es:

$this->db->set('reservation_id', NULL);

Es könnte gut sein, dass der $data-Ansatz keine NULLs mag.

2voto

steampowered Punkte 11249

Ich habe es so gehandhabt: Erweitern Sie die CI_Model-Klasse mit dieser Methode, um Nullen zu behandeln. Sie müssen sie allerdings jedes Mal aufrufen, wenn Sie eine Null erwarten. Ich verwende Nullen nicht so oft, daher ist diese Methode gut geeignet, wenn ich Nullen setzen muss. Übergeben Sie einfach eine Zeichenkette 'NULL' aus dem Daten-Array. Dies hebt das Array-Mitglied auf und setzt es in den aktiven Datensatz-Cache.

     class MY_Model extends CI_Model {

      public function __construct() {
          parent::__construct();
      }

      /* Handles null values for active record data array.  If 
       * $dataarray[$data_key] is string 'NULL',
       * use active record set method to set null and unset the 
       * string 'NULL'.  $data_array is by reference.
       * @param - array   the data array
       * @param - data_key - string  the key to be evaluated */
      protected function handle_null_active_record(&$data_array, $data_key){
        if ('NULL'==$data_array[$data_key]){
          $this->db->set($data_key, null);
          unset($data_array[$data_key]);
        }
      }

    }

1voto

musoNic80 Punkte 3598

In CI muss das Schlüsselwort NULL immer in Großbuchstaben geschrieben werden. Versuchen Sie diese einfache Änderung und sehen Sie, ob sie funktioniert. Siehe den entsprechenden Teil des Benutzerhandbuchs hier.

0voto

musoNic80 Punkte 3598

Ihre reservations_id-Spalte verweist auf eine id-Spalte in einer Reservierungstabelle, richtig? Haben Sie überprüft, ob die Spalte in der Tabelle reservstions auch einen Nullwert haben darf? Wenn es sich um den Primärschlüssel handelt und dieser automatisch erhöht wird, könnte dies das Problem sein. Ich glaube nicht, dass Sie eine Spalte als Null in einer Tabelle haben können, wenn sie als Fremdschlüssel zu einer Spalte bestimmt ist, die in der referenzierten Tabelle nicht Null sein kann.  Habe ich das klar für Sie erklärt?

0voto

Aus der Dokumentation von CI 3.0.0:

setzen() akzeptiert auch einen optionalen dritten Parameter ($escape), der verhindert, dass Daten escaped werden, wenn er auf falsch .

$this->db->set('reservation_id', 'NULL', false);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X