使用 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 从数组水合到对象的主要内容,如果未能解决你的问题,请参考以下文章

什么是 Doctrine 水合作用? [关闭]

如何在教义中进行子查询并将结果水合到对象中?

从doctrine2中的代理对象获取“true”对象

这是使用 Doctrine2 的 WHERE IN 表达式处理有序数组的正确方法吗?

RestKit - 水合外键数组

水合没有查询的中继片段