Как я могу использовать doctrine встраиваемый с json столбец? - PullRequest
1 голос
/ 19 января 2020

В моем проекте Symfony у меня есть объект doctrine, который содержит вложенный объект. Как в примере ниже:

/**
 * @ORM\Entity(repositoryClass="App\Repository\EntityRepository")
 */
class Enity
{
    /**
     * @ORM\Id()
     *
     * @var int
     */
    private $id;

    /**
     * @ORM\Column(type="json")
     *
     * @var NestedObject
     */
    private $nestedObject;

    public function getNestedObject(): NestedObject
    {
        return $this->nestedObject;
    }

    public function setNestedObject(NestedObject $object): void
    {
        $this->nestedObject = $object;
    }
}   

и вложенный объект:

class NestedObject
{
    /**
     * @var FirstOption
     */
    private $firstOption;

    /**
     * @var SecondOption
     */
    private $secondOption;

    /**
     * @return FirstOption
     */
    public function getFirstOption(): FirstOption
    {
        return $this->firstOption;
    }

    /**
     * @return SecondOption
     */
    public function getSecondOption(): SecondOption
    {
        return $this->secondOption;
    }
}

Я хочу сохранить вложенный объект в Postgres как jsonb таким образом, чтобы объект автоматически сериализуется при сохранении и десериализации при извлечении из базы данных.
Я прочитал doctrine документацию и не нашел ничего о json и встраиваемых объектах.

Есть ли способ сохранить встраиваемые объекты как структуру json без создания дополнительного столбца для какого-либо свойства? Или какая-нибудь альтернатива для удобной работы с вложенными json объектами?

1 Ответ

0 голосов
/ 19 января 2020

К сожалению, сериализация в json не так проста в php, вы можете реализовать интерфейс \JsonSerializable, но он работает только для json_encode, если вы хотите десериализовать объект в геттере, который вам потребуется создайте объект самостоятельно:

public function getNestedObject(): NestedObject
{
    $json = $this->nestedObject;
    $nestedObject = new NestedObject();
    $nestedObject->setX($json['x']);
    ... // rest of setters
    return $nestedObject;
}

Будет гораздо проще и, вероятно, лучше создать отношение к вложенному объекту или использовать интерфейс сериализации, если JSON не требуется. Если необходимо json, вышеприведенный подход, вероятно, является наилучшим выходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...