2012-01-19 6 views
2

Мне нужно было вставить поле массива в базу данных, и я был рад заметить, что PostGreSQL имел эту функциональность. Но теперь я не могу вставить данные, используя активную запись таблиц.Вставка столбца массива в db в 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 (текст представление ARRAY):

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

Или:

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

Таким образом, вы должны вложить свои значения массива в '{}' и разделив их запятой ,. Используйте двойные кавычки "" вокруг значений текста, содержащих запятую.

Я перечислил more syntax variants, чтобы вставить массивы в соответствующий ответ.

+0

Значит ли это, что я не могу использовать активные записи для вставки массива? Sheesh. –

+0

@AnandSainath: Я не знаю достаточно об активных записях. Я бы ожидал, что есть способ. Я добавил ссылку на другие варианты синтаксиса PostgreSQL. –

+0

Да, я понял, что вы имели в виду. Просто я не смог найти способ сделать это в Yii. Поэтому мне пришлось использовать implode, чтобы собрать данные и назначить их столбцу массива. –

3

Для тех, кто также та же проблема:

Я не проверял поведение Yii1, но в Yii2 вы можете просто вставить массив, как правильно сформированную строку, как Эрвин Brandstetter упомянул в своем комментарии:

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

Конечно, вам нужно приложить дополнительные усилия, когда ваши $ array_values ​​имеют строки с запятыми и т. Д. И вам все равно нужно преобразовать значение обратно в массив после загрузки ActiveRecord.

Вы можете сделать эти преобразования в ActiveRecord's beforeSave() и afterLoad(), и вам не нужно будет преобразовывать значения вручную.

UPD. Недавно я сделал простое поведение для Yii2, чтобы использовать поля массива с ActiveRecord без ручного построения поля: kossmoss/yii2-postgresql-array-field. Это более обобщенный способ решить проблему, и я надеюсь, что это поможет. Для тех, кто использует Yii1: вы можете исследовать код пакета и создать свой собственный solutuion, совместимый с вашим фреймворком.

+0

Может ли это помочь с фильтрацией вида сетки yii2 для типов данных массива postgresql? Спасибо – glyph

+0

@glyph Мне очень жаль позднего ответа. Да, я использую gridview с полями массива, и фильтрация работает хорошо. –

Смежные вопросы