$ em-> remove()symfony2擦除所有行

时间:2013-07-16 19:50:16

标签: symfony doctrine-orm

从BD中删除内容时出现问题。

问题在于它不仅会删除我查找的对象(使用findOneBy),还会删除与主体ID相关的所有对象。

// ---控制器

$new = $this->getDoctrine()->getManager();
$OBJcar = $new->getRepository('SomeOtherBundle:CarEntityClass')
    ->findOneBy(array('idOwner' => $idowner, 'idCar' => $idcar));
if($OBJcar){
  $new->remove($OBJcar);
  $new->flush();
  $msj="The car for an specific owner has been erased.";
}

// --- Profiler(查询)

"START TRANSACTION"
  Parameters: { }
  Time: 0.22 ms
DELETE FROM schema.CarTable WHERE id_owner = ?
  Parameters: ['123456']
  Time: 0.63 ms
"COMMIT"
  Parameters: { }
  Time: 0.63 ms

如何删除我从db获取的一行?

2 个答案:

答案 0 :(得分:32)

我投了上面的答案,因为我厌倦了使用字符串DQL的人。 它不是非标准化的,非面向对象的(即使在后台dql中使用对象操作),它也不使用查询构建器提供的缓存机制,它不灵活,只是看起来不干净。

这是“正确的方式”(恕我直言):

  1. 您为实体添加了存储库类
  2. 您可以使用查询构建器添加所需的方法
  3. 您在传递特定存款对象所需行动所需的参数时调用该方法
  4. 您获得了易于处理的结果
  5. 以下是代码:

    namespace ProjectName\BundleName\Repository;
    use Doctrine\ORM\EntityRepository;
    
    class CarRepository extends EntityRepository
    {
        public function deleteCarWithOwner($ownerId,$carId)
        {
            $isDeleted = $this->createQueryBuilder("car")
                ->delete()
                ->where('car.id  = :carId')->setParameter("carId", $carId)
                ->andWhere('car.idOwner = :ownerId')->setParameter("ownerId", $ownerId)
                ->getQuery()->execute();
    
            return $isDeleted;
        }
    }
    

    另外,请参阅http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html了解查询构建器详细信息。有许多“专业人士”,我认为使用建设者没有“缺点”。

    延迟更新

    此外,使用DQL时不会调度很多Doctrine的实体事件。

答案 1 :(得分:2)

使用DQL

$query = $em->createQuery('DELETE SomeOtherBundle:CarEntityClass c WHERE c.idOwner = 4 AND c.id = 10');
$query->execute(); 

这将只删除ID为10的单车和ID为4的车主。