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

ib.*_*mer 10 symfony doctrine-orm

从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.";
}
Run Code Online (Sandbox Code Playgroud)

// --- 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
Run Code Online (Sandbox Code Playgroud)

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

dra*_*nli 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

另请参阅http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html以获取查询构建器详细信息.有许多"专业人士",我认为使用建设者没有"缺点".

最后更新

此外,使用DQL时不会调度很多Doctrine的实体事件.

  • 它不是唯一的解决方案,但它是我之前描述的原因的更好的解决方案.恕我直言,提供干净,最佳版本的答案是非常重要的.人们会谷歌这个问题,他们会看到这个答案,并将使用它,而不是非常关心代码的可维护性和灵活性.这样,当他们需要更改或添加一些逻辑或只是对其进行改进时,那么使用我的回答他们可以轻松地做到这一点而不是谷歌附加问题. (3认同)

Nor*_*icz 2

使用DQL

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

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