diff --git a/src/Query.php b/src/Query.php index 5b0ceb7a97c..a869316d3e7 100644 --- a/src/Query.php +++ b/src/Query.php @@ -635,9 +635,10 @@ public function setLockMode(LockMode|int $lockMode): self /** * Get the current lock mode for this query. * - * @return int|null The current lock mode of this query or NULL if no specific lock mode is set. + * @return LockMode|int|null The current lock mode of this query or NULL if no specific lock mode is set. + * @psalm-return LockMode::*|null */ - public function getLockMode(): int|null + public function getLockMode(): LockMode|int|null { $lockMode = $this->getHint(self::HINT_LOCK_MODE); diff --git a/src/UnitOfWork.php b/src/UnitOfWork.php index d1659de272b..4ec0906843b 100644 --- a/src/UnitOfWork.php +++ b/src/UnitOfWork.php @@ -2653,7 +2653,7 @@ private function eagerLoadCollections(array $collections, ToManyInverseSideMappi $entities[] = $collection->getOwner(); } - $found = $this->getEntityPersister($targetEntity)->loadAll([$mappedBy => $entities], $mapping['orderBy'] ?? null); + $found = $this->getEntityPersister($targetEntity)->loadAll([$mappedBy => $entities], $mapping->orderBy); $targetClass = $this->em->getClassMetadata($targetEntity); $targetProperty = $targetClass->getReflectionProperty($mappedBy); diff --git a/tests/Tests/ORM/Cache/Persister/Entity/EntityPersisterTestCase.php b/tests/Tests/ORM/Cache/Persister/Entity/EntityPersisterTestCase.php index dbb4788496d..c590f3a04e1 100644 --- a/tests/Tests/ORM/Cache/Persister/Entity/EntityPersisterTestCase.php +++ b/tests/Tests/ORM/Cache/Persister/Entity/EntityPersisterTestCase.php @@ -6,6 +6,7 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Criteria; +use Doctrine\DBAL\LockMode; use Doctrine\ORM\Cache\Persister\CachedPersister; use Doctrine\ORM\Cache\Persister\Entity\AbstractEntityPersister; use Doctrine\ORM\Cache\Persister\Entity\CachedEntityPersister; @@ -97,7 +98,7 @@ public function testInvokeGetSelectSQL(): void ->with( self::identicalTo(['name' => 'Foo']), self::identicalTo($associationMapping), - self::identicalTo(1), + self::identicalTo(LockMode::OPTIMISTIC), self::identicalTo(2), self::identicalTo(3), self::identicalTo([4]), @@ -107,7 +108,7 @@ public function testInvokeGetSelectSQL(): void self::assertSame('SELECT * FROM foo WERE name = ?', $persister->getSelectSQL( ['name' => 'Foo'], $associationMapping, - 1, + LockMode::OPTIMISTIC, 2, 3, [4], @@ -233,13 +234,21 @@ public function testInvokeLoad(): void self::identicalTo($entity), self::identicalTo($associationMapping), self::identicalTo([1]), - self::identicalTo(2), + self::identicalTo(LockMode::PESSIMISTIC_READ), self::identicalTo(3), self::identicalTo([4]), ) ->willReturn($entity); - self::assertSame($entity, $persister->load(['id' => 1], $entity, $associationMapping, [1], 2, 3, [4])); + self::assertSame($entity, $persister->load( + ['id' => 1], + $entity, + $associationMapping, + [1], + LockMode::PESSIMISTIC_READ, + 3, + [4], + )); } public function testInvokeLoadAll(): void @@ -402,9 +411,9 @@ public function testInvokeLock(): void $this->entityPersister->expects(self::once()) ->method('lock') - ->with(self::identicalTo($identifier), self::identicalTo(1)); + ->with(self::identicalTo($identifier), self::identicalTo(LockMode::OPTIMISTIC)); - $persister->lock($identifier, 1); + $persister->lock($identifier, LockMode::OPTIMISTIC); } public function testInvokeExists(): void diff --git a/tests/Tests/ORM/Query/QueryTest.php b/tests/Tests/ORM/Query/QueryTest.php index 0336c3da6c8..961aafd32ed 100644 --- a/tests/Tests/ORM/Query/QueryTest.php +++ b/tests/Tests/ORM/Query/QueryTest.php @@ -12,9 +12,12 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Driver; use Doctrine\DBAL\Driver\Result; +use Doctrine\DBAL\LockMode; use Doctrine\DBAL\ParameterType; use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Types\Types; +use Doctrine\ORM\EntityManagerInterface; +use Doctrine\ORM\Query; use Doctrine\ORM\Query\Parameter; use Doctrine\ORM\Query\QueryException; use Doctrine\ORM\UnitOfWork; @@ -39,8 +42,7 @@ class QueryTest extends OrmTestCase { - /** @var EntityManagerMock */ - protected $entityManager; + private EntityManagerMock $entityManager; protected function setUp(): void { @@ -80,6 +82,30 @@ public function testSetParameters(): void self::assertEquals($parameters, $query->getParameters()); } + /** @psalm-param LockMode::* $lockMode */ + #[DataProvider('provideLockModes')] + public function testSetLockMode(LockMode|int $lockMode): void + { + $query = $this->entityManager->wrapInTransaction(static function (EntityManagerInterface $em) use ($lockMode): Query { + $query = $em->createQuery('select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1'); + $query->setLockMode($lockMode); + + return $query; + }); + + self::assertSame($lockMode, $query->getLockMode()); + self::assertSame($lockMode, $query->getHint(Query::HINT_LOCK_MODE)); + } + + /** @psalm-return list */ + public static function provideLockModes(): array + { + return [ + [LockMode::PESSIMISTIC_READ], + [LockMode::PESSIMISTIC_WRITE], + ]; + } + public function testFree(): void { $query = $this->entityManager->createQuery('select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1');