12

要将条目保存到数据库,我们可以使用:

$em->persist($entity);
$em->flush();

但是我们如何在不使用的情况下更新现有条目$this->getEntityManager()->createQuery()

我们可以吗?

我正在寻找某种$em->update()数据库中的现有条目。

4

3 回答 3

14

简单的做法,Fusselchen说的对,举个例子

// get entity manager
$em = $this->getDoctrine()->getEntityManager();

// get from this entity manager our "entity" \ object in $item
// also we can get arrayCollection and then do all in foreach loop
$item = $em->getRepository('repoName')->findOneBy($filter);

// change "entity" / object values we want to edit
$item->setSome('someText')
//...

// call to flush that entity manager from which we create $item
$em->flush();
// after that in db column 'some' will have value 'someText'

// btw after call flush we can still use $item as 'selected object' in
// another $em calls and it will have actual (some = 'someText') values
于 2013-05-18T06:10:01.340 回答
6

不,它不存在像$em->update().
您必须从数据库中获取对象并更新它,或者简单地编写一个自定义查询(使用 DQL)来更新您需要的内容

正如你在这里看到的

UPDATE MyProject\Model\User u SET u.password = 'new' WHERE u.id IN (1, 2, 3)

这是用于更新名为 User 的实体的 DQL 查询示例

最后但并非最不重要的一点是,这个查询必须放在一个特殊的“类”中,称为存储库,其中包含所有自定义 sql (dql)。这是一个很好的做法。

在此处了解有关存储库的更多信息

于 2013-01-30T08:01:31.263 回答
3
  1. 从数据库中获取实体
  2. 更改要修改的值
  3. 刷新实体管理器

无需额外调用更新数据库。EntityManager 使您的模型在 flush() 上保持同步

public function updateAction($id)
    {
    $em = $this->getDoctrine()->getManager();
    $product = $em->getRepository('AppBundle:Product')->find($id);

    if (!$product) {
        throw $this->createNotFoundException(
            'No product found for id '.$id
        );
    }

    $product->setName('New product name!');
    $em->flush();

    return $this->redirectToRoute('homepage');
}

http://symfony.com/doc/current/book/doctrine.html#updating-an-object

于 2013-01-30T08:13:13.097 回答