如何通过Yii2将空数组插入jsonb列(pgsql)?

时间:2017-11-08 09:46:12

标签: postgresql yii2 jsonb

  1. 使用jsonb类型的新字段创建迁移,而不是null,默认值= [] 。 (存储数据的示例: [“235”,“214”] )并为模型添加规则 [['unique_users'],'safe']
  2. 
    
        public function up()
        {
            $connection = Yii::$app->getDb();
            $sql = 'ALTER TABLE offer ADD unique_users jsonb not null default \'[]\'';
            $command = $connection->createCommand($sql, []);
            $command->queryAll();
        }
    
    
    

    结果:为每一行添加了 unique_users 字段,默认值为 [] jsonb_typeof(unique_users)会返回数组类型。

    enter image description here

    1. 为测试创建了所需的查询
    2. 
      
      select jsonb_array_length(unique_users) from test where unique_users @> '"19"'::jsonb
      
      
      

      PgAdmin的结果

      enter image description here

      似乎一切都准备好了。但在使用 Yii2 保存新记录后,我收到了一个查询错误:

        

      错误:你无法获得标量的长度

      我看到该字段中记录了另一个值 - “”

      enter image description here

      我尝试将验证规则添加到模型中: ['unique_users','default','value'=> '[]'],即可。 的结果:

      enter image description here

      ...同样的查询问题 - 值不是数组。 jsonb_typeof(unique_users)会返回字符串类型。

      如何将空数组插入jsonb列?

2 个答案:

答案 0 :(得分:2)

我认为你不小心发送了一个空字符串作为unique_users字段的值。如果该值完全为空,则应采用该列的默认DB值。保存时请确保unique_users字段完全为空(null)。

但是,您也可以使用默认值规则执行此操作。这应该可以解决问题:

['unique_users', 'default', 'value' => json_encode([])],

答案 1 :(得分:1)

['unique_users', 'default', 'value' => []],