Метод обновления Codeigniter Activerecord отказывается вставить значение NULL - PullRequest
4 голосов
/ 18 августа 2010

Я использую библиотеку активных записей Codeigniters для обновления столбца в моей БД.

Вот SQL для таблицы

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

)

Я объявил booking_id как nullable (reservation_id INT(11) NULL DEFAULT NULL)

Проблема в том, что CI, похоже, не хочет отправлять значение NULL при создании оператора.

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

Этот бит кода генерирует следующее сообщение об ошибке

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'

Из того, что я знаю, все, что вам нужно сделать, это установить значение NULL, и AR должен определить, что это значение NULL, но здесь это не так. Просто продолжает отправлять пустые значения.

Я новичок в КИ, нужно ли что-то еще делать, чтобы это работало? есть идеи?

Ответы [ 5 ]

20 голосов
/ 18 августа 2010

Попробуйте:

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

Вполне возможно, что $ data не любит NULL.

2 голосов
/ 17 сентября 2011

Я обработал это следующим образом: с помощью этого метода расширил класс CI_Model для обработки нулей. Вы должны называть это каждый раз, когда вы ожидаете ноль, хотя. Я не часто использую нули, поэтому этот метод подходит, когда мне нужно установить ноль. Просто передайте строку 'NULL' из массива данных. Это сбрасывает элемент массива и устанавливает его в кэш активных записей.

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

    }
1 голос
/ 18 августа 2010

В CI ключевое слово NULL всегда должно быть в верхнем регистре. Попробуйте это простое изменение и посмотрите, работает ли это. Смотрите соответствующий бит руководства пользователя здесь.

0 голосов
/ 19 апреля 2015

Из документации CI 3.0.0:

set () также примет необязательный третий параметр ($ escape), который предотвратит экранирование данных, если установлено значение false .

$this->db->set('reservation_id', 'NULL', false);
0 голосов
/ 18 августа 2010

Ваш столбец reservations_id ссылается на столбец id в таблице резервирований, верно?Вы проверили, что столбцу в таблице резервирований также разрешено иметь нулевое значение?Если его первичный ключ и автоинкремент, то это вполне может быть проблемой.Я не думаю, что вы можете иметь столбец с нулевым значением в одной таблице, если он обозначен как внешний ключ к столбцу, который не может быть нулевым в ссылочной таблице.Я объяснил тебе это ясно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...