我正在使用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的新手,我还需要做其他任何事情才能让它发挥作用吗?有任何想法吗?
答案 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);