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 是必需的,上述方法可能是最好的出路。