【问题标题】:Update Entity using Doctrine in Symfony在 Symfony 中使用 Doctrine 更新实体
【发布时间】:2018-03-12 13:05:37
【问题描述】:

我想使用 PATCH 方法更新我的实体中的值,但是当我尝试这样做时,学说会在表中创建新记录,但不更新。例如我想更新名称属性,所以我发送这个 JSON 数组(在 url 中我发送记录的 id:api.test/item/{id}):

{
   "name": "newname"
}

我的控制器:

public function updateItemAction(Request $request, $id)
{
    $serializer = $this->get('jms_serializer');

    $content = $request->getContent();

    $item = $serializer->deserialize($content,Item::class,'json');

    $em = $this->getDoctrine()->getManager();
    $em->getRepository(Item::class)->find($id);
    $em->persist($item);
    $em->flush();
    return new View("updated!",Response::HTTP_OK);
}

【问题讨论】:

  • 你能复制/粘贴 $item 结果($serializer->deserialize($content,Item::class,'json'))。你有setInitialized = false 吗?
  • 这是什么版本的 Symfony?您也可以发布您的控制器方法注释吗?
  • @Gaylord.P var_dump 反序列化后的结果:object(AppBundle\Entity\Item)#493 (4) { ["id":"AppBundle\Entity\Item":private]=> NULL ["name":"AppBundle\Entity\Item":private]=> string(9) "oldupdate" ["categories":protected]=> NULL ["attributes":protected]=> NULL } {"name":"oldupdate"}
  • @ASOlivieri Symfony 3.4,方法:补丁

标签: symfony doctrine-orm controller sql-update patch


【解决方案1】:

你必须从你的代码中撤回persist方法,它会更好地工作。

【讨论】:

  • 那么数据库中会记录什么?我正在寻找 ID,我想插入反序列化后得到的内容。如果我删除persist,我不会写任何东西,因为我只是在寻找ID并使用flush。
【解决方案2】:

您是否尝试过使用 merge() 函数?这允许您将实体合并到数据库中,从而更新现有实体。调用此函数而不是持久化。这是一个指南 https://www.vivait.co.uk/labs/updating-entities-when-an-insert-has-a-duplicate-key-in-doctrine

【讨论】:

  • 当我尝试使用合并更新我的实体时,没有任何反应,但如果我发送带有 id:{"id":1, "name": "newname"} 的 JSON,然后合并,一切正常。但我需要在 URL 中发送 ID。
  • 一旦对象被反序列化,你能在你的对象上设置 id 吗?我认为您不需要查询现有对象,只需设置 id 并调用 merge 就可以了!
  • 您可以尝试在实体上使用这样的方法 public function setId($id) { $this->id = $id;返回$这个;但由于它如何处理 id,它可能会导致学说问题,因此需要测试。您是否无法更改请求以解析正文中的 id 而不是 URL?如果你不能,你总是可以通过 JSON 解码添加 id 来请求内容,将元素添加到数组并在反序列化之前重新编码。希望这会有所帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多