从关系表中删除Doctrine DQL

时间:2013-11-17 19:25:12

标签: symfony orm doctrine-orm dql

使用Doctrine 2和Symfony 2.0。

我有两个Doctrine实体(让我们假设EntityA和EntityB)。

我们之间有一个ManyToMany关系。因此,已在数据库中创建了EntityA_EntityB表。

使用DQL或QueryBuilder,如何从该关系表中删除EntityA_EntityB?

Docrtine提供类似的功能来执行类似的操作:

->delete()
 ->from('EntityA a')
 ->where('a.id', '?', $id);

但我真的不知道如何从关系表中删除行。

1 个答案:

答案 0 :(得分:3)

$em = ...; // instance of `EntityManager`

// fetch both objects if ID is known
$a = $em->getRepository("YourProjectNamespace:EntityA")->find($id_of_A);
$b = $em->getRepository("YourProjectNamespace:EntityB")->find($id_of_B);

// suppose you have `EntityA::getObjectsOfTypeB` which retrieves all of linked objects of type `EntityB`.
// This method return instacne of ArrayCollection
$a->getObjectsOfTypeB()->removeElement($b);
$em->flush();

这样的东西?

基本上,您需要从collection中删除相关对象,而不是删除关系本身。你想直接删除关系,你总是可以使用纯SQL,但在DQL中是不可能的。

通过DBAL连接对象的原始DELETE SQL语句

$conn = $this->getDoctrine()->getManager()->getConnection();
$stmt = $conn->prepare("DELETE FROM EntityAEntityB WHERE id_b IN (:ids_of_b)");
$stmt->bindParam('ids_of_b', $to_delete_ids); // BEWARE: this array has to have at least one element
$stmt->executeUpdate();