Николай Ланец
8 дек. 2014 г., 1:20

Map-файлы. PHP-типы JSON и Array

Материал для тех, что знает что такое map-файлы и с чем их едят. Небольшая заметочка.
В мап-файлах описываются колонки таблицы/объекта с указанием типа данных в БД и в PHP (типа как воспринимать на стороне PHP и в каком виде сохранять в БД). И здесь я хотел бы отдельно рассмотреть php-типы array и json.
Если указать php-тип array, то свойству объекта передаем массив, а в БД будет писаться сериализованная строка, типа a:1:{s:6:«sdfsdf»;s:6:«sdfsdf»;} Вот часть мап-файла:
'entries' => array ( 'dbtype' => 'text', 'phptype' => 'array', 'null' => false, ),
А вот исполняемый код:
if($o = $modx->newObject('DropboxCursor', array( "entries" => array('sdfsdf' => "sdfsdf"), ))){ $o->save(); }

На мой взгляд здесь самое неприятное это то, что передавать ему можно только массив (Хотя конечно можно задать его напрямую $o->entries = 'a:1:{s:6:«sdfsdf»;s:6:«sdfsdf»;}';, но все равно мне никогда не нравилось работать с сериаллизованными строками.).
А вот если указать phptype json, тогда объекту можно передавать как массив, так и JSON-строку. В БД всегда будет записана JSON-строка. То есть можно и так:
$o->set('entries', array('sdfsdf' => "sdfsdf"));
и так:
$o->set('entries', '{"sdfsdf":"sdfsdf"}');
и так:
$o->entries = '{"sdfsdf":"sdfsdf"}';
По-моему значительный такой плюс :) Можно совсем не заморачиваться с типом данных.
Хорошая заметка. Только я бы добавил, что при операторе

$x=$o->entries;
мы получим сырые данные, в том виде, как они хранятся в базе. Чтобы получить массив, нужен оператор

$x=$o->get('entries');

Да, справедливое замечание.

Добавить комментарий