Codeigniter Activerecord更新方法拒绝插入NULL值

时间:2010-08-18 07:20:27

标签: php mysql codeigniter activerecord

我正在使用Codeigniters Active记录库对我的数据库上的列执行更新。

这是表格的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

我已将reservation_id声明为可为空(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值,但这似乎不是这里的情况。只是不断发送空值。

我是CI的新手,我还需要做其他任何事情才能让它发挥作用吗?有任何想法吗?

5 个答案:

答案 0 :(得分:20)

尝试:

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

很可能$ data方法不喜欢NULL。

答案 1 :(得分:2)

我这样处理:使用此方法扩展CI_Model类以处理空值。每次你期望null时你都要调用它。我不经常使用空值,所以这个方法适合我需要设置null。只需从数据数组中传递一个字符串'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]);
        }
      }

    }

答案 2 :(得分:1)

在CI中,关键字NULL始终需要为大写。尝试这个简单的更改,看看是否有效。 请参阅用户指南here.

的相关位

答案 3 :(得分:0)

您的reservations_id列引用了预订表中的ID列,对吗?您是否检查过reservestions表中的列是否也允许具有空值?如果它是主键并自动递增那么那很可能就是问题所在。我不认为如果将列指定为引用表中无法为null的列的外键,则可以在一个表中将列作为null。 我有清楚地为你解释过吗?

答案 4 :(得分:0)

从CI 3.0.0的文档:

set()还会接受可选的第三个参数($ escape),如果设置为 false ,则会阻止数据转义。

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