我在从 BD 中删除某些内容时遇到问题。
问题在于,它不仅删除了我查找的对象(使用 findOneBy),还删除了与主体 id 相关的所有对象。
//--- Controller
$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.";
}
//---探查器(查询)
"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
如何删除我从数据库中获取的一行?
最佳答案
我否决了上面的答案,因为我厌倦了人们使用字符串 DQL。 它不是标准化的、非面向对象的(即使在后台 dql 与对象一起操作),它不使用查询生成器提供的缓存机制,它不灵活并且看起来不干净。
这是“正确的方法”(恕我直言):
- 您为实体添加存储库类
- 您可以添加所需的方法以及其中的查询生成器
- 您可以在传递特定面向存储库对象的操作所需的参数时调用该方法
- 您将获得易于处理的结果
代码如下:
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 实体事件。
关于symfony - $em->remove() symfony2 删除所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17685709/