php symfony2 Doctrine 删除对象数组

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21677317/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 04:22:01  来源:igfitidea点击:

symfony2 Doctrine delete an array of objects

phpsymfonydoctrine

提问by Davit

I would like to delete all the records from database matching a particular user_id in Symfony2.

我想从数据库中删除与 Symfony2 中特定 user_id 匹配的所有记录。

$em = $this->getDoctrine()->getManager();
$user_service = $em->getRepository('ProjectTestBundle:UserService')
->findByUser($this->getUser()->getId());

This might return a few matching objects, so when I run:

这可能会返回一些匹配的对象,所以当我运行时:

$em->remove($user_service);
$em->flush();

an error occurs:

出现错误:

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

How do I remove all records (objects) matching a particular condition? Btw, when I run an equivalent sql statement in mysql, it works perfectly.

如何删除符合特定条件的所有记录(对象)?顺便说一句,当我在 mysql 中运行等效的 sql 语句时,它运行良好。

回答by Markus Kottl?nder

Why don't you just loop through the objects array?

为什么不循环遍历对象数组?

$user_services = $em->getRepository('ProjectTestBundle:UserService')
->findByUser($this->getUser()->getId());

foreach ($user_services as $user_service) {
    $em->remove($user_service);
}

$em->flush();

回答by COil

You could also use something like this:

你也可以使用这样的东西:

$user_services = $em->getRepository('ProjectTestBundle:UserService')->findByUser($this->getUser()->getId());
array_walk($user_services, array($this, 'deleteEntity'), $em);
$em->flush();

Then add this method in your controller:

然后在你的控制器中添加这个方法:

protected function deleteEntity($entity, $key, $em)
{
    $em->remove(entity);
}

Or simply use:

或者简单地使用:

$user_services = $em->getRepository('ProjectTestBundle:UserService')->findByUser($this->getUser()->getId());
$this->deleteEntities($em, $user_services);
$em->flush();

...

protected function deleteEntities($em, $entities)
{
    foreach ($entities as $entity) {
        $em->remove($entity);
    }
}

Note that when using Propeland the PropelBundle, the PropelObjectCollectionimplements a delete()function so you don't have to do this loop by hand.

请注意,使用Propel和 时PropelBundlePropelObjectCollection实现了一个delete()函数,因此您不必手动执行此循环。

回答by wIRELESS

You can also make use of doctrine query builder deletemethod.

您还可以使用学说查询构建器delete方法。

public function deleteAllByUser(UserInterface $user)
{
    $query = $this->createQueryBuilder('related_entity')
        ->delete()
        ->andWhere('related_entity.user = :user')
        ->setParameter('user', $user)
        ->getQuery();

    return $query->execute();
}

回答by Anis

If you return one object, you just need to write:

如果你返回一个对象,你只需要写:

 ->findOneByUser,

You won't need a foreach loop. If your return is an array, then you need to do ->findByUserand write a for loop:

您不需要 foreach 循环。如果您的返回是一个数组,那么您需要执行->findByUser并编写一个 for 循环:

foreach ($entities as $entity)
{
  //do something
}