如何将可嵌入的学说与 json 列一起使用?

Rom*_*eev 6 php postgresql doctrine symfony doctrine-orm

在我的 Symfony 项目中,我有一个包含嵌套对象的学说实体。就像下面的例子一样:

/**
 * @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;
    }
}   
Run Code Online (Sandbox Code Playgroud)

和嵌套对象:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想将 Postgres 中的嵌套对象存储为 jsonb,这样该对象在保存时会自动序列化,在从数据库中获取时会自动反序列化。
我已阅读教义文档,但没有找到有关 json 和可嵌入对象的内容。

有没有办法将可嵌入对象存储为 json 结构,而无需为任何属性创建额外的列?或者有任何替代方案可以方便地使用嵌套 json 对象吗?

小智 0

不幸的是,在 php 中,json 中的序列化并不那么容易,您可以实现\JsonSerializable接口,但它仅适用于json_encode,如果您想在 getter 中反序列化对象,则需要自己创建对象:

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

创建与嵌套对象的关系会更容易,也可能更好,或者如果不需要 JSON,则使用序列化接口。如果 json 是必需的,上述方法可能是最好的出路。