JSON in Nextras Orm 3.0

Storing an array/std-like object structure as json structure in one db column is pretty common use-case. However, the correct approach in Nextras Orm may not be obvious.


๐Ÿ” Use property container ๐Ÿ˜‰

First, create your JSON container, by implementing abstract methods of predefined helper class ImmutableValuePropertyContainer.

use Nette\Utils\Json;
use Nextras\Orm\Entity\ImmutableValuePropertyContainer;

class JsonContainer extends ImmutableValuePropertyContainer
{
    protected function serialize($value)
    {
        return Json::encode($value); // or simple json_encode()
    }

    protected function deserialize($value)
    {
        return Json::decode($value); // or simple json_decode()
    }
}

Then, simply define your entity property with container:

/** 
 * ...
 * @property Nette\Utils\ArrayHash $data {container JsonContainer}
 */
class Users extends Nextras\Orm\Entity\Entity {}

Please note that ImmutableValuePropertyContainer API may lightly change in the future minor versions.


๐Ÿ†— The second possible way is to write custom mapping in StorageReflection – add converter callbacks for your specific property.


๐Ÿ™ˆ The last possibility is to transform value in setters, getters and entity event callbacks. Please do not do this.