diff --git a/lib/Doctrine/ORM/ORMInvalidArgumentException.php b/lib/Doctrine/ORM/ORMInvalidArgumentException.php index 796d2c5a5..68bb6f91d 100644 --- a/lib/Doctrine/ORM/ORMInvalidArgumentException.php +++ b/lib/Doctrine/ORM/ORMInvalidArgumentException.php @@ -216,11 +216,7 @@ class ORMInvalidArgumentException extends \InvalidArgumentException */ public static function invalidAssociation(ClassMetadata $targetClass, $assoc, $actualValue) { - $expectedType = 'Doctrine\Common\Collections\Collection|array'; - - if (($assoc['type'] & ClassMetadata::TO_ONE) > 0) { - $expectedType = $targetClass->getName(); - } + $expectedType = $targetClass->getName(); return new self(sprintf( 'Expected value of type "%s" for association field "%s#$%s", got "%s" instead.', diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/GH6029Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/GH6029Test.php new file mode 100644 index 000000000..50696a516 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/GH6029Test.php @@ -0,0 +1,137 @@ +setUpEntitySchema( + [ + GH6029User::class, + GH6029Group::class, + GH6029Group2::class, + GH6029Product::class, + GH6029Feature::class, + ] + ); + } + + /** + * Verifies that when wrong entity is persisted via relationship field, the error message does not correctly state + * the expected class name. + * + * @group 6029 + */ + public function testManyToManyAssociation() : void + { + $user = new GH6029User(); + $user->groups->add(new GH6029Group2()); + + $this->expectException(ORMInvalidArgumentException::class); + $this->expectExceptionMessage( + sprintf( + 'Expected value of type "%s" for association field "%s#$groups", got "%s" instead.', + GH6029Group::class, + GH6029User::class, + GH6029Group2::class + ) + ); + + $this->_em->persist($user); + $this->_em->flush(); + } + + /** + * Verifies that when wrong entity is persisted via relationship field, the error message does not correctly state + * the expected class name. + * + * @group 6029 + */ + public function testOneToManyAssociation() : void + { + $product = new GH6029Product(); + $product->features->add(new GH6029Group2()); + + $this->expectException(ORMInvalidArgumentException::class); + $this->expectExceptionMessage( + sprintf( + 'Expected value of type "%s" for association field "%s#$features", got "%s" instead.', + GH6029Feature::class, + GH6029Product::class, + GH6029Group2::class + ) + ); + + $this->_em->persist($product); + $this->_em->flush(); + } +} + +/** @Entity */ +class GH6029User +{ + /** @Id @Column(type="integer") @GeneratedValue */ + public $id; + + /** @ManyToMany(targetEntity=GH6029Group::class, cascade={"all"}) */ + public $groups; + + public function __construct() + { + $this->groups = new ArrayCollection(); + } +} + +/** @Entity */ +class GH6029Group +{ + /** @Id @Column(type="integer") @GeneratedValue */ + public $id; +} + +/** @Entity */ +class GH6029Group2 +{ + /** @Id @Column(type="integer") @GeneratedValue */ + public $id; +} + +/** @Entity */ +class GH6029Product +{ + /** @Id @Column(type="integer") @GeneratedValue */ + public $id; + + /** + * @OneToMany(targetEntity=GH6029Feature::class, mappedBy="product", cascade={"all"}) + */ + public $features; + + public function __construct() + { + $this->features = new ArrayCollection(); + } +} + +/** @Entity */ +class GH6029Feature +{ + /** @Id @Column(type="integer") @GeneratedValue */ + public $id; + + /** + * @ManyToOne(targetEntity=GH6029Product::class, inversedBy="features") + * @JoinColumn(name="product_id", referencedColumnName="id") + */ + public $product; +}