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

データベースから取得している1行を消去するにはどうすればよいですか?

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を参照してください。多くの「長所」があり、ビルダーを使用するための「短所」はありません。

更新が遅い

また、DQL を使用すると、Doctrine の多くのエンティティ イベントがディスパッチされません。

于 2014-07-28T09:07:56.830 に答える