diff --git a/src/Mapping/AssociationMapping.php b/src/Mapping/AssociationMapping.php index 74bef09f9d..e5ef0ffcca 100644 --- a/src/Mapping/AssociationMapping.php +++ b/src/Mapping/AssociationMapping.php @@ -135,7 +135,13 @@ public static function fromMappingArray(array $mappingArray): static continue; } - assert($mapping instanceof ManyToManyOwningSideMapping); + if (! $mapping instanceof ManyToManyOwningSideMapping) { + throw new MappingException( + "Mapping error on field '" . + $mapping->fieldName . "' in " . $mapping->sourceEntity . + " : 'joinTable' can only be set on many-to-many owning side.", + ); + } $mapping->joinTable = JoinTableMapping::fromMappingArray($value); diff --git a/tests/Tests/ORM/Functional/InvalidMappingDefinitionTest.php b/tests/Tests/ORM/Functional/InvalidMappingDefinitionTest.php new file mode 100644 index 0000000000..4a69070b3d --- /dev/null +++ b/tests/Tests/ORM/Functional/InvalidMappingDefinitionTest.php @@ -0,0 +1,133 @@ +expectException(MappingException::class); + $this->expectExceptionMessage("Mapping error on field 'owners' in Doctrine\Tests\ORM\Functional\OwnedSideEntity : 'joinTable' can only be set on many-to-many owning side."); + + $this->createSchemaForModels( + OwningSideEntity::class, + OwnedSideEntity::class, + ); + } +} + +#[Table(name: 'owning_side_entities1')] +#[Entity] +class OwningSideEntity +{ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(type: 'integer')] + private int $id; + + #[ORM\ManyToMany(targetEntity: OwnedSideEntity::class, inversedBy: 'owners')] + #[ORM\JoinTable(name: 'owning_owned')] + private Collection $relations; + + public function __construct() + { + $this->relations = new ArrayCollection(); + } + + public function getId(): int + { + return $this->id; + } + + public function getRelations(): Collection + { + return $this->relations; + } + + public function addRelation(OwnedSideEntity $ownedSide): void + { + if (! $this->relations->contains($ownedSide)) { + $this->relations->add($ownedSide); + $ownedSide->addOwner($this); + } + } + + public function removeRelation(OwnedSideEntity $ownedSide): void + { + if ($this->relations->removeElement($ownedSide)) { + $ownedSide->removeOwner($this); + } + } +} + +#[Table(name: 'owned_side_entities1')] +#[Entity] +class OwnedSideEntity +{ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(type: 'integer')] + private int $id; + + #[ORM\Column(type: 'string', length: 255)] + private string $data; + + #[ORM\ManyToMany(targetEntity: OwningSideEntity::class, mappedBy: 'relations')] + #[ORM\JoinTable(name: 'owning_owned')] + private Collection $owners; + + public function __construct() + { + $this->owners = new ArrayCollection(); + } + + public function getId(): int + { + return $this->id; + } + + public function getData(): string + { + return $this->data; + } + + public function setData(string $data): void + { + $this->data = $data; + } + + public function getOwners(): Collection + { + return $this->owners; + } + + public function addOwner(OwningSideEntity $owningSide): void + { + if (! $this->owners->contains($owningSide)) { + $this->owners->add($owningSide); + } + } + + public function removeOwner(OwningSideEntity $owningSide): void + { + $this->owners->removeElement($owningSide); + } +}