【问题标题】:Inserting an array column into the db in Yii在 Yii 的数据库中插入一个数组列
【发布时间】:2012-01-19 13:25:53
【问题描述】:

我需要在数据库中插入一个数组字段,我很高兴地注意到 PostGreSQL 具有该功能。但现在我无法使用表活动记录插入数据。

我尝试了以下调用,但没有成功

$active_record->array_column = $_array_of_values;

这给了我例外

引发异常:CDbCommand 未能执行 SQL 语句:SQLSTATE[22P02]:无效文本表示:7 错误:数组值必须以“{”或维度信息开头

我也试过了

foreach($_array_of_values as $value){
    $active_record->array_column[] = $value;
}

告诉我

对重载属性 FeatureRaw::$colors_names 的间接修改无效

谁能帮我解决这个问题? 谢谢!

【问题讨论】:

    标签: arrays postgresql model yii


    【解决方案1】:

    数据必须是inserted in the form(数组的文本表示):

    INSERT INTO tbl (arr_col) VALUES ('{23,45}')
    

    或者:

    INSERT INTO tbl (arr_col) VALUES ('{foo,"bar, with comma"}')
    

    因此,您需要将数组值括在'{}' 中,并用逗号, 分隔它们。在包含逗号的文本值周围使用双引号 ""

    我列出了more syntax variants 在相关答案中插入数组。

    【讨论】:

    • 这是否意味着我不能使用活动记录来插入数组?嘘。
    • @AnandSainath:我对 Active Records 了解不够。我希望有办法。我添加了指向更多 PostgreSQL 语法变体的链接。
    • 是的,我明白你的意思。只是我在 Yii 中找不到方法。所以我不得不使用 implode 将数据拼凑在一起并将其分配给数组列。
    【解决方案2】:

    对于那些也有同样问题的人:

    我没有检查 Yii1 的行为,但在 Yii2 中,您只需像 Erwin Brandstetter 在他的评论中提到的那样插入格式正确的字符串:

    $activeRecord->arrayField = '{' . implode(',',$array_values) . '}';
    

    当然,当你的 $array_values 有带逗号等的字符串时,你需要付出额外的努力。加载 ActiveRecord 后,你仍然需要将 value 转换回数组。

    您可以在 ActiveRecord 的 beforeSave() 和 afterLoad() 中进行这些转换,而无需手动转换值。

    UPD。最近我为 Yii2 做了一个简单的行为,即使用带有 ActiveRecord 的数组字段而无需手动构建字段:kossmoss/yii2-postgresql-array-field。这是解决问题的更通用的方法,我希望它会有所帮助。对于那些使用 Yii1 的人:您可以研究包代码并创建与您的框架兼容的自己的解决方案。

    【讨论】:

    • 这对 yii2 网格视图过滤 postgresql 数组数据类型有帮助吗?谢谢
    • @glyph 很抱歉回复晚了。是的,我将 gridview 与数组字段一起使用,并且过滤效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 2014-11-21
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多