Mysql json и кавычки. Хелп!

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
nickdenry
Сообщения: 98
Зарегистрирован: 2015.10.28, 04:55

Mysql json и кавычки. Хелп!

Сообщение nickdenry » 2018.07.30, 01:40

Всем привет!

Есть табличка по миграции:

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

$this->createTable('test_table', [
    'id' => $this->primaryKey(),
    'title' => $this->string()->notNull(),
    'options' => $this->json(),
]);
Есть ActiveRecord моделька

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

/**
* {@inheritdoc}
*/
public function rules()
{
  return [
      [['title', 'options'], 'required'],
      [['options'], 'safe'],      
      [['title'], 'string', 'max' => 255],
  ];
}

Форма с textarea

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

<?= $form->field($model, 'options')->textArea() ?>
При попытке вставить json строку, получаю ее в кавычках, ровно как в этом issue https://github.com/yiisoft/yii2/issues/15839

"[{\"level\":1,\"id\":1},{\"level\":2,\"id\":2}]"

вместо

[{"level":1,"id":1},{"level":2,"id":2}]

Поиск, соответственно, не работает. Что не так?

This is Yii version 2.0.15.1.
MySQL Server version: 5.7.22

Аттрибут 'safe'
Ответственные программисты с высоким уровнем технического долга (c)

Loveorigami
Сообщения: 974
Зарегистрирован: 2014.08.27, 21:54

Re: Mysql json и кавычки. Хелп!

Сообщение Loveorigami » 2018.07.30, 09:44

Issue до конца дочитали?

nickdenry
Сообщения: 98
Зарегистрирован: 2015.10.28, 04:55

Re: Mysql json и кавычки. Хелп!

Сообщение nickdenry » 2018.07.30, 11:13

Да, но если я правильно понимаю, дальнейшее обсуждение issue идет про построение запроса поиска и у автора с валидацией атрибута 'safe' json пишется корректно.
However, I realize that If I changed the validation rule in the model class,
From

[['formula'],'string']

to

[['formula'],'safe']

formula is the json column name.
The value inserted into the database is correct

[{"level":1,"id":1},{"level":2,"id":2}]
У меня - нет. Если записывать значение через phpmyadmin или через JsonExpression, то значение вставляется корректно, и дальше с поиском проблем нет (проверял запросом в mysql). Если просто через строку, даже в контроллере, например

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

$model->options = '[{"level":1,"id":1},{"level":2,"id":2}]';
то результат все-равно "[{\"level\":1,\"id\":1},{\"level\":2,\"id\":2}]"

Через JsonExpression - ок, т.е.

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

$model->options = new JsonExpression(['level' => 1, 'id' => 1]);
Пока не могу понять почему. php 7.
Ответственные программисты с высоким уровнем технического долга (c)

Loveorigami
Сообщения: 974
Зарегистрирован: 2014.08.27, 21:54

Re: Mysql json и кавычки. Хелп!

Сообщение Loveorigami » 2018.07.30, 11:56

Потому что экранируются кавычки.
В тестах также делают все через JsonExpression
https://github.com/SilverFire/yii2/comm ... 2818fa32bd

nickdenry
Сообщения: 98
Зарегистрирован: 2015.10.28, 04:55

Re: Mysql json и кавычки. Хелп!

Сообщение nickdenry » 2018.07.30, 13:06

А убрать экранирование возможно? Иначе нужно гонять туда-сюда json_encode/decode, т.к. есть задача вставить именно строку
Ответственные программисты с высоким уровнем технического долга (c)

nickdenry
Сообщения: 98
Зарегистрирован: 2015.10.28, 04:55

Re: Mysql json и кавычки. Хелп!

Сообщение nickdenry » 2018.07.30, 14:19

Даже получается не совсем так. Чтобы вставить строку как json

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

new \yii\db\JsonExpression(json_decode('{"id": 9, "b": 2}'));

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

json_encode(json_decode('{"id": 9, "b": 2}'));
- также вставляет с экранированием.

Кто пояснить почему? И как корректно вставить строку как json?
Последний раз редактировалось nickdenry 2018.07.31, 01:22, всего редактировалось 1 раз.
Ответственные программисты с высоким уровнем технического долга (c)


nickdenry
Сообщения: 98
Зарегистрирован: 2015.10.28, 04:55

Re: Mysql json и кавычки. Хелп!

Сообщение nickdenry » 2018.07.31, 00:05

@Loveorigami

Спасибо огромное! Видел, перепутал с другим поведением, которое несовместимо с json-полями.
Буду пробовать.
Ответственные программисты с высоким уровнем технического долга (c)

Ответить