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;