从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获取的一行?
答案 0 :(得分:32)
我投了上面的答案,因为我厌倦了使用字符串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的实体事件。
答案 1 :(得分:2)
使用DQL
$query = $em->createQuery('DELETE SomeOtherBundle:CarEntityClass c WHERE c.idOwner = 4 AND c.id = 10');
$query->execute();
这将只删除ID为10的单车和ID为4的车主。