2013-07-16 34 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,但它也可能是其他的東西。你不能說查詢生成器是唯一的解決方案,因爲你不知道用例。 –