2012-01-19 78 views
2

我需要將數組字段插入到數據庫中,我很高興地注意到PostGreSQL具有該功能。但是現在我無法使用活動記錄表插入數據。將數組列插入Yii中的數據庫

我曾嘗試下面的電話,但沒有成功

$active_record->array_column = $_array_of_values; 

這使我異常

Exception Raised:CDbCommand failed to execute the SQL statement: SQLSTATE[22P02]: Invalid text representation: 7 ERROR: array value must start with "{" or dimension information

我也嘗試過這種使用

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

還告訴我

Indirect modification of overloaded property FeatureRaw::$colors_names has no effect

任何人都可以幫助我嗎? 謝謝!

回答

3

數據必須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在相關答案插入數組。

+0

那麼這是否意味着我不能使用活動記錄來插入數組?嘖。 –

+0

@AnandSainath:我對Active Records不夠了解。我希望有一種方法。我添加了更多PostgreSQL語法變體的鏈接。 –

+0

是的,我明白你的意思了。只是我不能在Yii中找到辦法。所以我不得不使用implode將數據組合在一起並將其分配給數組列。 –

3

對於那些誰也有同樣的問題:

我沒有檢查Yii1行爲,但在Yii2你作爲歐文Brandstetter修改在他的評論中提到的只是可以插入陣列作爲正常組成的字符串:

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

當然,當你的$ array_values有逗號等字符串時,你需要做出額外的努力。加載ActiveRecord後,你仍然需要將值轉換回數組。

您可以在ActiveRecord的beforeSave()和afterLoad()中進行這些轉換,您不需要手動轉換值。

UPD。最近我做了一個簡單的行爲,讓Yii2在沒有手動構建的情況下使用ActiveRecord的數組字段:kossmoss/yii2-postgresql-array-field。這是解決問題的更普遍的方式,我希望它會有所幫助。對於那些使用Yii1的人:您可以調查軟件包代碼並創建與您的框架兼容的自己的solutuion。

+0

這將有助於用於postgresql數組數據類型的yii2網格視圖過濾嗎?謝謝 – glyph

+0

@ glyph我很抱歉遲到的回覆。是的,我使用gridview數組字段和過濾效果很好。 –