【问题标题】:Persisting Deserialized objects error in Symfony2Symfony2中的持久反序列化对象错误
【发布时间】:2013-10-18 22:58:27
【问题描述】:

我有一个具有属性idtrucknr 的实体对象。我放置了一些数据,然后查询所有数据。 我使用 JMS SerializerBundle 将其序列化为 JSON,并使用 file_put_contents 将其导出到 JSON 文件,然后使用 deserialize 读取我的 JSON 文件,并且它可以很好地反序列化。 我用:

$read = $serializer->deserialize($file,'ArrayCollection<App\TestBundle\Entity\Truck>','json');

问题是当我试图将它保存到我的数据库时。为此我使用了:

$em = $this->getDoctrine()->getManager();
$em->merge($read);
$em->flush();

我收到此错误:

EntityManager#merge() expects parameter 1 to be an entity object, array given. 

当我在 $read 上运行 dump_var 时,我得到一个包含三行的数组集合:

array(3) { [0]=> object(App\TestBundle\Entity\Truck)#767 (2) { ["id":protected]=> NULL ["trucks_nr":protected]=> string(4) "1243" } 
[1]=> object(App\TestBundle\Entity\Truck)#782 (2) { ["id":protected]=> NULL ["trucks_nr":protected]=> string(4) "3245" } 
[2]=> object(App\TestBundle\Entity\Truck)#783 (2) { ["id":protected]=> NULL ["trucks_nr":protected]=> string(4) "5622" } }

我不知道我正在尝试做的事情是否可行。当我查询一行时,它会保持或合并正常。是否可以持久化对象的数组集合,如果可以,如何?

【问题讨论】:

    标签: json symfony jmsserializerbundle


    【解决方案1】:

    您反序列化需要循环的实体数组,以便正确合并它们:

    $em = $this->getDoctrine()->getManager();
    for ($i = count($read) -1; $i >= 0; $i--) {
        $em->merge($read[$i]);
    }
    $em->flush();
    

    [编辑] 不确定您是否真的想使用 merge(),因为您的反序列化实体似乎不是分离的,而是新的(因为它们没有 id)?在这种情况下,您需要改为调用persist()

    【讨论】:

    • 我一直在玩合并和持久化。我实际上想根据唯一字段更新实体。因此,如果我的字段已被使用,则应合并,否则应更新。我用 id 测试如果我用 id 序列化它并使用合并它会用我的新值更新那些使用的 id。但是如果我的 json 有新的 id 和使用过的 id,我在使用合并时会出错。并坚持似乎创造了新的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多