$em->;删除()symfony2删除所有行
我在从BD中删除某些内容时遇到问题 问题在于,它不仅删除了我查找的对象(使用findOneBy),而且还删除了与主体id相关的所有对象 //---控制器$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
$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;
}
}