Баг в batchInsert с json полем

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
rwivan
Сообщения: 10
Зарегистрирован: 2013.05.31, 05:00

Баг в batchInsert с json полем

Сообщение rwivan » 2018.03.27, 10:48

Здравствуйте!

Столкнулся со следующей проблемой:
БД - постгрес
Есть табличка с json полем

Если в миграции делать

Код: Выделить всё

        $this->insert('{{%table}}', [
            'jsonField'   => [
                1, 2, 3, 4, 5
            ],
        ]);
То все нормально
А если делать

Код: Выделить всё

        $this->batchInsert('{{%table}}', [
            'jsonField'   => [
                1, 2, 3, 4, 5
            ],
        ],[
            'jsonField'   => [
                7, 8, 9, 10
            ],
        ]);
то случается

Код: Выделить всё

    > insert into {{%table}} ...Exception: Array to string conversion (/code/vendor/yiisoft/yii2/db/pgsql/QueryBuilder.php:467)
#0 /code/vendor/yiisoft/yii2/db/Command.php(504): yii\db\pgsql\QueryBuilder->batchInsert()
#1 /code/vendor/yiisoft/yii2/db/Migration.php(246): yii\db\Command->batchInsert()
Случается это потому что в
yii\db\Command -> batchInsert
делается

Код: Выделить всё

        $table = $this->db->quoteSql($table);
        $columns = array_map(function ($column) {
            return $this->db->quoteSql($column);
        }, $columns);
в следствии чего $table становится равным '"table"' и поэтому при поиске колонок в бд ничего не находится и следовательно потом схема не знает что поле 'jsonField' нужно обернуть

Кстати

Код: Выделить всё

        $table = $this->db->quoteSql($table);
делается посже в queryBuilder->batchInsert

Код: Выделить всё

        foreach ($columns as $i => $name) {
            $columns[$i] = $schema->quoteColumnName($name);
        }

        return 'INSERT INTO ' . $schema->quoteTableName($table)
        . ' (' . implode(', ', $columns) . ') VALUES ' . implode(', ', $values);
Полечил я это

Код: Выделить всё

    $this->batchInsert($this->db->getSchema()->getRawTableName('{{%table}}'),

Аватара пользователя
SiZE
Сообщения: 2581
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Баг в batchInsert с json полем

Сообщение SiZE » 2018.03.27, 12:18

rwivan писал(а):
2018.03.27, 10:48
А если делать

Код: Выделить всё

        $this->batchInsert('{{%table}}', [
            'jsonField'   => [
                1, 2, 3, 4, 5
            ],
        ],[
            'jsonField'   => [
                7, 8, 9, 10
            ],
        ]);
https://www.yiiframework.com/doc/api/2. ... t()-detail посмотрите внимательно описание метода который используете.

rwivan
Сообщения: 10
Зарегистрирован: 2013.05.31, 05:00

Re: Баг в batchInsert с json полем

Сообщение rwivan » 2018.03.28, 05:50

Код: Выделить всё

https://www.yiiframework.com/doc/api/2. ... t()-detail посмотрите внимательно описание метода который используете.
В данном случае я привел код не прямо из проекта, а писал его тут, естественно у меня там указан список колонок

Вы попробуйте повторить код.

Аватара пользователя
maleks
Сообщения: 1631
Зарегистрирован: 2012.12.26, 12:56

Re: Баг в batchInsert с json полем

Сообщение maleks » 2018.03.28, 08:45

Рабочий пример:

Код: Выделить всё

        $db = \Yii::$app->db;
        $db->createCommand()->batchInsert('{{%arrtab}}', ['jsonField'], [
            [[5,6,7]],
            [[8,9,10]],
        ])->execute();

rwivan
Сообщения: 10
Зарегистрирован: 2013.05.31, 05:00

Re: Баг в batchInsert с json полем

Сообщение rwivan » 2018.03.29, 10:09

maleks писал(а):
2018.03.28, 08:45
Рабочий пример:

Код: Выделить всё

        $db = \Yii::$app->db;
        $db->createCommand()->batchInsert('{{%arrtab}}', ['jsonField'], [
            [[5,6,7]],
            [[8,9,10]],
        ])->execute();
Нет, это не рабочий пример, таже самая ошибка

Аватара пользователя
maleks
Сообщения: 1631
Зарегистрирован: 2012.12.26, 12:56

Re: Баг в batchInsert с json полем

Сообщение maleks » 2018.03.29, 10:49

проверьте на последней версии и создавайте issue на гитхабе.
Только проблема там не в имени таблицы, а что в implode приходит

Код: Выделить всё

array (size=2)
  0 => int 6
  1 => 
    array (size=3)
      0 => int 5
      1 => int 6
      2 => int 7

Ответить