使用 Doctrine2 从数组水合到对象
Posted
技术标签:
【中文标题】使用 Doctrine2 从数组水合到对象【英文标题】:Hydrate from array to objects with Doctrine2 【发布时间】:2014-04-11 11:40:50 【问题描述】:鉴于我有一个包含标量值(我信任的)的数组,我如何将它们转换为理论实体?
例如:
array(
array("name" => "Alex", "id" => 1)
array("name" => "Chris", "id" => 2)
)
到一组用户实体。
【问题讨论】:
【参考方案1】:我知道的唯一方法是做这样的事情:
// loop over the array
foreach ($users as $user)
// new entity
$post = new User();
// now loop over the properties of each post array...
foreach ($user as $property => $value)
$method = sprintf('set%s', $property);
// use the method as a variable variable to set your value
$post->$method($value);
// persist the entity
$em->persist($post);
【讨论】:
【参考方案2】:使用序列化器组件将是一种干净的方法:
$user = $serializer->deserialize(json_encode($data), 'Namespace\User', 'json');
http://symfony.com/doc/current/components/serializer.html#deserializing-an-object
【讨论】:
您能进一步解释一下吗?如果$data
包含原始数组,则会引发异常,因为它会首先尝试解码 JSON 编码的字符串
对不起,我忘了你必须先对数组进行 json_encode。我更新了我的答案。谢谢。【参考方案3】:
即使这是一个相当老的问题,我想添加另一种方式:Symfony 提供了一个 PropertyAccessor
类,它有助于确定给定对象的 getter 和 setter 函数。 ucwords
是找到它们的众多方法之一,这个访问器类试图找到所有的可能性。使用它,poxama 的代码可能如下所示:
$propertyAccessor = PropertyAccess::createPropertyAccessor();
// loop over the array
foreach ($users as $user)
// new entity
$post = new User();
// now loop over the properties of each post array...
foreach ($user as $property => $value)
try
$propertyAccessor->setValue($user, $property, $value);
catch (NoSuchPropertyException $ex)
// go on
// persist the entity
$em->persist($post);
【讨论】:
以上是关于使用 Doctrine2 从数组水合到对象的主要内容,如果未能解决你的问题,请参考以下文章