10

从 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.";
}

//---分析器(查询)

"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

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

4

2 回答 2

34

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

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

  1. 您为实体添加存储库类
  2. 您使用查询生成器添加所需的方法
  3. 您在传递特定 REPOSITORY OBJECT ORIENTED ACTION 所需的参数时调用该方法
  4. 你得到一个易于处理的结果

这是代码:

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。有很多“优点”,我认为使用 builder 没有“缺点”。

后期更新

另外,在使用 DQL 时,很多 Doctrine 的实体事件都没有被调度。

于 2014-07-28T09:07:56.830 回答
2

使用 DQL

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

这将只删除 ID 为 10 的单辆汽车和 ID 为 4 的所有者。

于 2013-07-16T20:24:01.680 回答