codeigniter 如果值为空,则将CI插入到具有默认字段的数据库中

wtlkbnrh  于 7个月前  发布在  其他
关注(0)|答案(2)|浏览(69)

我正在尝试插入到我的数据库表中。
我从列中得到这个错误:

Column 'allow_edit_time_due' cannot be null

字符串
但是,该列被设置为默认值:'0'
如果'allow_edit_time_due'为null,我如何插入到我的表中,使该值为默认值?
查询:

$sql = "INSERT INTO `cal_tasks` (user_id, task, task_notes, task_type, allow_edit_time_due, task_time_due, user_created) VALUES (" . $this->db->escape($user_id) . ", " . $this->db->escape($data['task']) . ", " . @$this->db->escape($data['task_notes']) . ", " . @$this->db->escape($data['task_type']) . ", " . @$this->db->escape($data['allow_edit_time_due']) . ", " . $this->db->escape($data['task_time_due']) . ", " . @$this->db->escape($data['user_created']) . ")";

mwecs4sa

mwecs4sa1#

正如您所发现的,将NULL值传递给SQL将尝试用NULL值填充列,这将导致错误。
无论如何,使用活动记录将有助于简化关于这个问题的代码(如果更可取的话)。所有值也将自动转义。
这是一个例子:

$cal_task = array(
    'user_id' => $user_id,
    'task' => $data['task'],
    'task_notes' => $data['task_notes'],
    'task_type' => $data['task_type'],
    'task_time_due' => $data['task_time_due'],
    'user_created' => $data['user_created']
);

// optional, default if null
if (isset($data['allow_edit_time_due']))
{
    $cal_task['allow_edit_time_due'] = $data['allow_edit_time_due'];
}

$this->db->insert('cal_tasks', $cal_task);

字符串

tct7dpnv

tct7dpnv2#

在我们的一个项目中,我们决定将一个相当大的Firebird数据库迁移到Postgres(遇到了几个龙!)。Firebird允许自动生成的主键和列上的空值,但PSQL不允许。
我们有许多执行插入和更新查询的模型方法,这些方法接收填充的有效负载对象。我们需要一个批量解决方案来在执行查询之前清理有效负载。出于明显的原因,我们不想破解任何驱动程序或核心文件。
我们目前使用的解决方案是将查找数组设置为config item。关联数组的关联数组具有保存表名的第一级键,然后第二级键是不接受NULL且具有DEFAULTGENERATED值的列的名称。第二级值未使用,但为了向开发人员提供清晰度,我们声明了默认值。

$config['nonNullablesWithDefaults'] = [
    'first_table_name' => [
        'first_table_name_pk' => 'GENERATED PRIMARY KEY',
        'some_column' => 'N',
        'some_datetime_column' => 'CURRENT_TIMESTAMP',
    ],
    ...
];

字符串
我们的MY_Model方法/签名类似于:

protected function unsetNonNullablesWithDefaults(string $tableName, object $payload): object
{
    foreach ($this->nonNullablesWithDefaults[$tableName] ?? [] as $columnName => $defaultValue) {
        if (property_exists($payload, $columnName) && $payload->$columnName === null) {
            unset($payload->$columnName);
        }
    }
    return $payload;
}


如果payload中的任何列持有NULL值并且在查找数组中找到,则在返回对象之前将其从对象中取消设置。我们所有的其他模型都是从该模型扩展的,因此可以访问。
如果您想在以编程方式为不可空列创建嵌套查找数组方面有一个良好的开端,您可以使用以下方法,但我没有将自动生成的主键完全烘焙到PSQL查询中。

SELECT jsonb_agg(jsonb_build_object(table_name, columns_json)) non_nullables_with_defaults_json
FROM (
  SELECT table_name,
         jsonb_object_agg(column_name, REGEXP_REPLACE(column_default, '^.*\''([^\'']+)\''.*$', '\1') ORDER BY column_name ASC) columns_json
  FROM information_schema.columns
  WHERE table_schema = 'public'
        AND is_nullable = 'NO'
        AND column_default IS NOT NULL
        AND table_name IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public')
  GROUP BY table_name
) subquery


然后json解码jsonb结果并将其粘贴到$config声明中。

相关问题