$em->;删除()symfony2删除所有行

$em->;删除()symfony2删除所有行,symfony,doctrine-orm,Symfony,Doctrine Orm,我在从BD中删除某些内容时遇到问题 问题在于,它不仅删除了我查找的对象(使用findOneBy),而且还删除了与主体id相关的所有对象 //---控制器 $new = $this->getDoctrine()->getManager(); $OBJcar = $new->getRepository('SomeOtherBundle:CarEntityClass') ->findOneBy(array('idOwner' => $idowner, 'idCar

我在从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.";
}
//---探查器(查询)

如何删除从数据库中获取的一行?

使用DQL

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

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

我否决了上面的答案,因为我厌倦了人们使用字符串DQL。 它不是标准化的、非面向对象的(即使在后台dql使用对象),它不使用query builder提供的缓存机制,它不灵活,只是看起来不干净

以下是“正确的方法”(IMHO):

  • 为实体添加存储库类
  • 您可以添加所需的方法,其中包含查询生成器
  • 在传递特定存储库面向对象操作所需的参数时调用该方法
  • 你会得到一个容易处理的结果
  • 代码如下:

    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;
        }
    }
    
    另外,有关查询生成器的详细信息,请参阅。使用builder有很多“优点”,我看不到任何“缺点”

    延迟更新


    此外,在使用DQL时,许多条令的实体事件没有被调度。

    一切看起来都是正确的。。您没有在配置中的任何位置意外使用
    级联删除
    级联所有
    ,是吗?表中有一个复合主键。关系如下所示:创建表schema.car(id\u car bigint NOT NULL,id\u owner bigint NOT NULL,CONSTRAINT car\u pkey主键(id\u car,id\u owner),CONSTRAINT car\u person\u fk外键(id\u owner)引用schema.persons(id)更新时匹配简单删除时不操作不操作,约束car\u type_fk外键(id\u car)引用架构。cartype(id)在更新级联时匹配简单删除级联);实际上,QueryBuilder是分几个步骤有条件地构造DQL查询的:dth这只是一个快速的示例,您的代码也在做同样的事情,它实际上在最后生成了DQL。问题不是关于“干净的解决方案”,而是关于“如何从数据库中删除行”。构造此DQL的最佳方法是什么超出了这个问题的范围—可能是queryBuilder,但也可能是其他方法。你不能说查询生成器是这里唯一的解决方案,因为你不知道用例。它不是唯一的解决方案,但由于我前面描述的原因,它是更好的解决方案。我认为,尽可能给出清晰、最好的答案是非常重要的。人们会在谷歌上搜索这个问题,他们会看到这个答案并使用它,而不会对代码的可维护性和灵活性感到非常担心。这样,当他们需要更改或添加一些逻辑或只是对其进行改进时,通过我的回答,他们可以轻松地完成这项工作,而不必通过谷歌搜索其他问题。同样值得一提的是,如果从EntityRepository类外调用此函数,queryBuilder将需要一个“from”上下文:->from('AppBundle:Supercar','car')它应该是这样的:setParameter(“id”,$carId)
    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;
        }
    }