lamo4ok
@lamo4ok
Программист

Как заставить Zend+SQLite+PHPUnit работать с JSON?

Проблема следующая. На проде мы используем PostgreSQL, который поддерживает тип данных JSON. С ним все здорово в тестах, если мы работаем с Symfony + Doctrine - там есть свои кастомизируемые типы, которые в тестах не требуют того, чтобы поле в БД было указано как JSON. Другими словами, в тестах мы используем SQLite, но для него Doctrine сама видит, что он не поддерживает JSON, создает при маппинге таблиц поля типа string, а потом работает с ними так, как будто это JSON, декодируя или кодируя его туда-обратно, где это требуется.

Но когда мы начинаем работать с Zend Expressive 3 + zendframework/zend-db, то начинаются проблемы. Мы вручную пишем в тестах конфиг БД для SQLite, где не можем указать поле типа JSON, и приходится использовать string. В итоге код вроде:

$row = $this->tableGateway->select(
	static function (Select $select) use ($blah) {
		$select->where->nest
			->equalTo('blah', $blah)
			->or
			->equalTo('sum, 1);
	}
);

нам вернет некий массив, в котором поле, которое отмечено в конфиге как string, но в котором содержится некий JSON, будет строкой. Код приложения такого конечно же не ожидает и падает. Другими словами, код приложения ложится с ошибкой TypeError, ну или например с "Illegal string offset 'holder'" - то есть приложение, обращаясь к якобы массиву через "$arr['holder']", на самом деле обращается к строке, в которой есть JSON и в нем объект с полем "holder".

Вопрос: Как сделать так, чтобы SQLite научился работать с JSON и zendframework/zend-db понимала это и равно как отдавала нужные нам поля как массивы (результаты преобразования JSON), а не как строки, содержащие JSON, равно и принимала массивы и записывала их в БД как JSON?
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы