php - Doctrine批量删除join表记录

标签 php mysql doctrine-orm doctrine dql

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

________        _________________        ____________
| User |        |   User_Object |        |  Object  |
|------|        |---------------|        |----------|
|  id  |        |     user_id   |        |    id    |
| .... |        |    object_id  |        |   ....   |
|______|        |_______________|        |__________|

我想批量删除相当大的用户集(以及 User_Object 表中与他们关联的记录)。一个一个地删除实体的速度不足以满足我的需求(对于超过 1000 个实体,它需要很长时间)。

//This method is far too slow for my needs
$qb = $this->doctrine->em->createQueryBuilder();
$qb->select('u')
    ->from('Entities\User', 'u')
    ->where("u.whatever= ?1")
    ->setParameter(1, $whatever);
$users = $qb->getQuery()->getResult();

foreach($users as $user)
{
    $this->doctrine->em->remove($user);
    //...

doctrine docs说批量删除实体最有效的是 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

这会因为User_Object连接表中的记录而抛出异常(引用完整性异常)。

所以,我的问题是:如何在批量删除场景中有效地删除连接表中的记录。

我真的很想避免向它抛出原始 SQL,我的其余代码到处都使用实体,如果可能的话,我希望保持这种状态。

编辑: 关系是这样标记的(我使用 yml):

manyToMany:
  objects:
  targetEntity: Object
  inversedBy: users
  cascade: ["remove"]
  joinTable:
    name: User_Object
    joinColumns:
      user_id:
        referencedColumnName: id
    inverseJoinColumns:
      object_id:
        referencedColumnName: id

最佳答案

如果您要删除对象的用户,您还没有设置 Doctrine 行为。 你必须说,如果用户被删除,那么所有相关对象也必须被删除。

/**
 * @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;

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

关于php - Doctrine批量删除join表记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772085/

相关文章:

doctrine-orm - 计算Doctrine2中对数据库的查询

php - 当用户在 CKeditor 源代码中打开某些标签或引号时如何解决?

php - 获取 MySQL 地理点数据并将结果存储在 PHP 变量中

php - 转义 pdo 查询,有必要吗?

mysql - SQL 查询,将表字段移动到列标题

php - Doctrine_Pager 在哪里?

php - 如何在 PHP 中获取值 contentEditable

php - MySQL查询没有结果,一分钟后有结果,记录看起来没有变化

php - Zend Framework 选择选择 Zend_Db_Table

doctrine-orm - Doctrine 2 ORM 使用可恶的 CamelCase 创建类