Php 批量删除联接表记录

Php 批量删除联接表记录,php,mysql,doctrine-orm,doctrine,dql,Php,Mysql,Doctrine Orm,Doctrine,Dql,我在两个实体之间有一个正常的多对多关系:用户和对象 ________ _________________ ____________ | User | | User_Object | | Object | |------| |---------------| |----------| | id | | user_id | | id | | .... |

我在两个实体之间有一个正常的多对多关系:用户和对象

________        _________________        ____________
| User |        |   User_Object |        |  Object  |
|------|        |---------------|        |----------|
|  id  |        |     user_id   |        |    id    |
| .... |        |    object_id  |        |   ....   |
|______|        |_______________|        |__________|
我想批量删除相当大的用户集(以及User\u Object表中与其相关联的记录)。逐个删除实体的速度不够快,无法满足我的需要(对于>1000个实体,需要很长时间)

他们说,批量删除实体最有效的方法是DQL,这会给我一些类似的信息:

$qb = $this->doctrine->em->createQuery('delete from Entities\User u where u.whatever = ?1');
$qb->setParameter(1, $whatever);
$numDeleted = $qb->execute(); //This will throw because of User_Object records
由于用户\对象联接表中的记录,这将引发异常(引用完整性异常)

因此,我的问题是:在批量删除场景中,如何高效地删除联接表中的记录

我真的希望避免向它抛出原始SQL,我的代码的其余部分在任何地方都使用实体,如果可能的话,我希望保持这种方式

编辑:
关系标记为(我使用yml):


如果要删除对象的用户,则尚未设置条令行为。 你必须说,如果用户被删除,那么所有相关的对象也必须被删除

/**
 * @ORM\ManyToMany(targetEntity="User", mappedBy="objects", cascade={"remove"})
 */
protected $users;


/**
 * @ORM\ManyToMany(targetEntity="Object", inversedBy="users", cascade={"persist", "remove"})
 * @ORM\JoinTable(name="user_object",
 * joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 * inverseJoinColumns={@ORM\JoinColumn(name="object_id", referencedColumnName="id")}
 * )
 */
protected $objects;

这是一个例子。我没有测试它

该关系被标记为级联删除。我用我的yml定义编辑了我的问题。我认为这就是它与EntityManager(但不是直接与DQL)一起工作的原因。可能吗?无论如何,即使使用cascade remove,它也不起作用。我仍然得到与以前相同的错误。您在用户端定义了级联删除,但在对象端没有定义。级联选项必须在反面定义,因为您要删除的是用户而不是对象。当您使用DQL删除数据库中的内容时,要通过关系继续删除,您也可以使用onDelete选项。onDelete选项用于数据库端,而不是级联。级联在内存端使用。
manyToMany:
  objects:
  targetEntity: Object
  inversedBy: users
  cascade: ["remove"]
  joinTable:
    name: User_Object
    joinColumns:
      user_id:
        referencedColumnName: id
    inverseJoinColumns:
      object_id:
        referencedColumnName: id
/**
 * @ORM\ManyToMany(targetEntity="User", mappedBy="objects", cascade={"remove"})
 */
protected $users;


/**
 * @ORM\ManyToMany(targetEntity="Object", inversedBy="users", cascade={"persist", "remove"})
 * @ORM\JoinTable(name="user_object",
 * joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 * inverseJoinColumns={@ORM\JoinColumn(name="object_id", referencedColumnName="id")}
 * )
 */
protected $objects;