[PR #5858] Exporters should only inspect joinColumns for owning side in bi-directional OneToOne #9758

Open
opened 2026-01-22 16:05:19 +01:00 by admin · 0 comments
Owner

Original Pull Request: https://github.com/doctrine/orm/pull/5858

State: closed
Merged: Yes


After having run the YamlExporter in one of our projects there was a weird behavior when a bi-directional OneToOne association was defined.

I managed to replicate the behavior with adding an inversed bi-directional mapping to the test metadata:

Doctrine.Tests.ORM.Tools.Export.User.dcm.yml

#snip
  oneToOne:
    address:
      targetEntity: Doctrine\Tests\ORM\Tools\Export\Address
      joinColumn:
        name: address_id
        referencedColumnName: id
        onDelete: CASCADE
      cascade: [ persist ]
      inversedBy: user
      orphanRemoval: true
      fetch: EAGER
    cart:
      targetEntity: Doctrine\Tests\ORM\Tools\Export\Cart
      mappedBy: user
      cascade: [ remove ]
#snip
$ ./vendor/bin/phpunit -vv tests/Doctrine/Tests/ORM/Tools/Export/YamlClassMetadataExporterTest.php
PHPUnit 4.8.26-3-ga973e60 by Sebastian Bergmann and contributors.

Runtime:    PHP 5.6.22-1~dotdeb+7.1 with Xdebug 2.3.3
Configuration:  /vagrant/libs/doctrine2/phpunit.xml.dist

ESSSSSSSSSSSSSS

Time: 156 ms, Memory: 9.75MB

There was 1 error:

1) Doctrine\Tests\ORM\Tools\Export\YamlClassMetadataExporterTest::testExportDirectoryAndFilesAreCreated
Undefined index: joinColumns

/vagrant/libs/doctrine2/lib/Doctrine/ORM/Tools/Export/Driver/YamlExporter.php:166
/vagrant/libs/doctrine2/lib/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php:138
/vagrant/libs/doctrine2/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php:121

So the problem is that the joinColumn array index is not set for the inversed side but will still be inspected. After applying the check for $associationMapping['isOwningSide'] === true ? $associationMapping['joinColumns'] : array(); the export works as expected.

Doctrine.Tests.ORM.Tools.Export.ExportedUser.dcm.yml

# snip
    oneToOne:
        address:
            targetEntity: Doctrine\Tests\ORM\Tools\Export\Address
            cascade:
                - remove
                - persist
            fetch: EAGER
            mappedBy: null
            inversedBy: user
            joinColumns:
                address_id:
                    referencedColumnName: id
                    onDelete: CASCADE
            orphanRemoval: true
        cart:
            targetEntity: Doctrine\Tests\ORM\Tools\Export\Cart
            cascade:
                - remove
            fetch: LAZY
            mappedBy: user
            inversedBy: null
            joinColumns: {  }
            orphanRemoval: false
# snip

EDIT

Same applies to the PhpExporter when duplicating the test case to the test metadata:

$ ./vendor/bin/phpunit -vv tests/Doctrine/Tests/ORM/Tools/Export
PHPUnit 4.8.26-3-ga973e60 by Sebastian Bergmann and contributors.

Runtime:    PHP 5.6.22-1~dotdeb+7.1 with Xdebug 2.3.3
Configuration:  /vagrant/libs/doctrine2/phpunit.xml.dist

......S.......SESSSSSSSSSSSSSS......................S........

Time: 410 ms, Memory: 13.00MB

There was 1 error:

1) Doctrine\Tests\ORM\Tools\Export\PhpClassMetadataExporterTest::testExportDirectoryAndFilesAreCreated
Undefined index: joinColumns

/vagrant/libs/doctrine2/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php:120
/vagrant/libs/doctrine2/lib/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php:138
/vagrant/libs/doctrine2/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php:125
**Original Pull Request:** https://github.com/doctrine/orm/pull/5858 **State:** closed **Merged:** Yes --- After having run the YamlExporter in one of our projects there was a weird behavior when a bi-directional OneToOne association was defined. I managed to replicate the behavior with adding an inversed bi-directional mapping to the test metadata: `Doctrine.Tests.ORM.Tools.Export.User.dcm.yml` ``` #snip oneToOne: address: targetEntity: Doctrine\Tests\ORM\Tools\Export\Address joinColumn: name: address_id referencedColumnName: id onDelete: CASCADE cascade: [ persist ] inversedBy: user orphanRemoval: true fetch: EAGER cart: targetEntity: Doctrine\Tests\ORM\Tools\Export\Cart mappedBy: user cascade: [ remove ] #snip ``` ``` $ ./vendor/bin/phpunit -vv tests/Doctrine/Tests/ORM/Tools/Export/YamlClassMetadataExporterTest.php PHPUnit 4.8.26-3-ga973e60 by Sebastian Bergmann and contributors. Runtime: PHP 5.6.22-1~dotdeb+7.1 with Xdebug 2.3.3 Configuration: /vagrant/libs/doctrine2/phpunit.xml.dist ESSSSSSSSSSSSSS Time: 156 ms, Memory: 9.75MB There was 1 error: 1) Doctrine\Tests\ORM\Tools\Export\YamlClassMetadataExporterTest::testExportDirectoryAndFilesAreCreated Undefined index: joinColumns /vagrant/libs/doctrine2/lib/Doctrine/ORM/Tools/Export/Driver/YamlExporter.php:166 /vagrant/libs/doctrine2/lib/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php:138 /vagrant/libs/doctrine2/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php:121 ``` So the problem is that the `joinColumn` array index is not set for the inversed side but will still be inspected. After applying the check for `$associationMapping['isOwningSide'] === true ? $associationMapping['joinColumns'] : array();` the export works as expected. `Doctrine.Tests.ORM.Tools.Export.ExportedUser.dcm.yml` ``` # snip oneToOne: address: targetEntity: Doctrine\Tests\ORM\Tools\Export\Address cascade: - remove - persist fetch: EAGER mappedBy: null inversedBy: user joinColumns: address_id: referencedColumnName: id onDelete: CASCADE orphanRemoval: true cart: targetEntity: Doctrine\Tests\ORM\Tools\Export\Cart cascade: - remove fetch: LAZY mappedBy: user inversedBy: null joinColumns: { } orphanRemoval: false # snip ``` **EDIT** Same applies to the `PhpExporter` when duplicating the test case to the test metadata: ``` $ ./vendor/bin/phpunit -vv tests/Doctrine/Tests/ORM/Tools/Export PHPUnit 4.8.26-3-ga973e60 by Sebastian Bergmann and contributors. Runtime: PHP 5.6.22-1~dotdeb+7.1 with Xdebug 2.3.3 Configuration: /vagrant/libs/doctrine2/phpunit.xml.dist ......S.......SESSSSSSSSSSSSSS......................S........ Time: 410 ms, Memory: 13.00MB There was 1 error: 1) Doctrine\Tests\ORM\Tools\Export\PhpClassMetadataExporterTest::testExportDirectoryAndFilesAreCreated Undefined index: joinColumns /vagrant/libs/doctrine2/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php:120 /vagrant/libs/doctrine2/lib/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php:138 /vagrant/libs/doctrine2/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php:125 ```
admin added the pull-request label 2026-01-22 16:05:19 +01:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: doctrine/archived-orm#9758