Skip to content

Doctrine tries to delete entities in incorrect order #9376

@jusephe

Description

@jusephe

Bug Report

Q A
BC Break no
Version 2.11.0

Summary

In some cases, Doctrine tries to delete entities in incorrect order and it fails on foreign keys exception. It also happens in 2.10.4

Current behavior

I have 6 entities with circular reference, and I tried to delete 2 of them. But UnitOfWork::commit() fails because of ForeignKeyConstraintViolationException.

The reason is that it first tries to delete the entity set as a foreign key in the second entity, which hasn't been deleted yet.

I investigated it quite a bit and the order of these operations is determined by $commitOrder in UnitOfWork::commit(). It is calculated from all 6 entities, but for the delete itself, the order of those 2 entities is not correct within those 6 entities. It should be sufficient to compute the order for deletions only with those 2 entities set to be deleted. I prepared a test with described behavior and a possible fix. See linked pull request.

How to reproduce

Run the test in a linked pull request with a DB platform supporting foreign key constraints. (i.e., not SQLite)

Expected behavior

UnitOfWork::commit() should delete entities. I prepared a possible fix in the linked pull request. I created a new method called getCommitOrderForDeletions() for computing the correct order of entities set to be deleted. This function is similar to getCommitOrder(), but it operates only with entities set to be deleted.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions