2013-07-16 33 views
7

从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 

如何删除一行我从数据库得到些什么?

+2

一切都看起来正确..你不是意外地在你的配置中的任何地方使用'cascade remove'或'cascade all',对吗? –

+0

我在桌上有一个复合主键。的关系是这样的: CREATE TABLE schema.car ( id_car BIGINT NOT NULL, id_owner BIGINT NOT NULL, 约束car_pkey PRIMARY KEY(id_car,id_owner), 约束car_person_fk外键(id_owner) 参考schema.persons (ID)MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, 约束car_type_fk外键(id_car) 参考schema.cartype(ID)MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE ); –

回答

4

使用DQL

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

这将删除只单一的汽车用ID是10和拥有者ID 4

+0

完美,谢谢! –

23

我否决了答案上面,因为我已经厌倦了使用字符串DQLs人。 它不是非标准化的,非面向对象的(即使在后台dql使用对象进行操作),它不使用查询构建器提供的缓存机制,它不灵活,只是看起来不干净。

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

  1. 您添加该存储库类实体
  2. 您添加您在它需要一个查询生成器方法
  3. 你调用方法而需要通过特定的存储库对象面向行动参数
  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 = :id')->setParameter("id", $id) 
      ->andWhere('car.idOwner = :owner')->setParameter("owner", $ownerId) 
      ->getQuery()->execute(); 

     return $isDeleted; 
    } 
} 

此外,查询构建器详细信息请参阅http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html。有很多“优点”,我没有看到使用建设者的“缺点”。

LATE UPDATE

而且,很多学说的实体事件的使用DQL时,不会出动。

+1

实际上,QueryBuilder在几个步骤中有条件地构造一个DQL查询:D – Diablo

+0

我从来没有说过它不是。 – drakonli

+1

这只是一个快速的例子,你的代码做的是相同的东西,它实际上在最后生成DQL。问题不是关于“干净的解决方案”,而是关于“如何从数据库中删除行”。构建这个DQL的最好方法是超出这个问题的范围,它可能是queryBuilder,但它也可能是其他的东西。你不能说查询生成器是唯一的解决方案,因为你不知道用例。 –