Cache
9 months ago
Decorator
9 months ago
Event
9 months ago
Exception
9 months ago
Id
9 months ago
Internal
9 months ago
Mapping
9 months ago
Persisters
8 months ago
Proxy
9 months ago
Query
9 months ago
Repository
9 months ago
Tools
9 months ago
Utility
9 months ago
AbstractQuery.php
9 months ago
Cache.php
9 months ago
Configuration.php
9 months ago
EntityManager.php
9 months ago
EntityManagerInterface.php
9 months ago
EntityNotFoundException.php
9 months ago
EntityRepository.php
9 months ago
Events.php
9 months ago
LazyCriteriaCollection.php
9 months ago
NativeQuery.php
9 months ago
NoResultException.php
9 months ago
NonUniqueResultException.php
9 months ago
ORMException.php
9 months ago
ORMInvalidArgumentException.php
9 months ago
ORMSetup.php
9 months ago
OptimisticLockException.php
9 months ago
PersistentCollection.php
9 months ago
PessimisticLockException.php
9 months ago
Query.php
9 months ago
QueryBuilder.php
9 months ago
TransactionRequiredException.php
9 months ago
UnexpectedResultException.php
9 months ago
UnitOfWork.php
9 months ago
Version.php
9 months ago
index.php
9 months ago
EntityRepository.php
139 lines
| 1 | <?php |
| 2 | declare (strict_types=1); |
| 3 | namespace MailPoetVendor\Doctrine\ORM; |
| 4 | if (!defined('ABSPATH')) exit; |
| 5 | use BadMethodCallException; |
| 6 | use MailPoetVendor\Doctrine\Common\Collections\AbstractLazyCollection; |
| 7 | use MailPoetVendor\Doctrine\Common\Collections\Criteria; |
| 8 | use MailPoetVendor\Doctrine\Common\Collections\Selectable; |
| 9 | use MailPoetVendor\Doctrine\Common\Persistence\PersistentObject; |
| 10 | use MailPoetVendor\Doctrine\DBAL\LockMode; |
| 11 | use MailPoetVendor\Doctrine\Deprecations\Deprecation; |
| 12 | use MailPoetVendor\Doctrine\Inflector\Inflector; |
| 13 | use MailPoetVendor\Doctrine\Inflector\InflectorFactory; |
| 14 | use MailPoetVendor\Doctrine\ORM\Exception\NotSupported; |
| 15 | use MailPoetVendor\Doctrine\ORM\Mapping\ClassMetadata; |
| 16 | use MailPoetVendor\Doctrine\ORM\Query\ResultSetMappingBuilder; |
| 17 | use MailPoetVendor\Doctrine\ORM\Repository\Exception\InvalidMagicMethodCall; |
| 18 | use MailPoetVendor\Doctrine\Persistence\ObjectRepository; |
| 19 | use function array_slice; |
| 20 | use function class_exists; |
| 21 | use function lcfirst; |
| 22 | use function sprintf; |
| 23 | use function str_starts_with; |
| 24 | use function substr; |
| 25 | class EntityRepository implements ObjectRepository, Selectable |
| 26 | { |
| 27 | protected $_entityName; |
| 28 | protected $_em; |
| 29 | protected $_class; |
| 30 | private static $inflector; |
| 31 | public function __construct(EntityManagerInterface $em, ClassMetadata $class) |
| 32 | { |
| 33 | $this->_entityName = $class->name; |
| 34 | $this->_em = $em; |
| 35 | $this->_class = $class; |
| 36 | } |
| 37 | public function createQueryBuilder($alias, $indexBy = null) |
| 38 | { |
| 39 | return $this->_em->createQueryBuilder()->select($alias)->from($this->_entityName, $alias, $indexBy); |
| 40 | } |
| 41 | public function createResultSetMappingBuilder($alias) |
| 42 | { |
| 43 | $rsm = new ResultSetMappingBuilder($this->_em, ResultSetMappingBuilder::COLUMN_RENAMING_INCREMENT); |
| 44 | $rsm->addRootEntityFromClassMetadata($this->_entityName, $alias); |
| 45 | return $rsm; |
| 46 | } |
| 47 | public function createNamedQuery($queryName) |
| 48 | { |
| 49 | Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/issues/8592', 'Named Queries are deprecated, here "%s" on entity %s. Move the query logic into EntityRepository', $queryName, $this->_class->name); |
| 50 | return $this->_em->createQuery($this->_class->getNamedQuery($queryName)); |
| 51 | } |
| 52 | public function createNativeNamedQuery($queryName) |
| 53 | { |
| 54 | Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/issues/8592', 'Named Native Queries are deprecated, here "%s" on entity %s. Move the query logic into EntityRepository', $queryName, $this->_class->name); |
| 55 | $queryMapping = $this->_class->getNamedNativeQuery($queryName); |
| 56 | $rsm = new Query\ResultSetMappingBuilder($this->_em); |
| 57 | $rsm->addNamedNativeQueryMapping($this->_class, $queryMapping); |
| 58 | return $this->_em->createNativeQuery($queryMapping['query'], $rsm); |
| 59 | } |
| 60 | public function clear() |
| 61 | { |
| 62 | Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/issues/8460', 'Calling %s() is deprecated and will not be supported in Doctrine ORM 3.0.', __METHOD__); |
| 63 | if (!class_exists(PersistentObject::class)) { |
| 64 | throw NotSupported::createForPersistence3(sprintf('Partial clearing of entities for class %s', $this->_class->rootEntityName)); |
| 65 | } |
| 66 | $this->_em->clear($this->_class->rootEntityName); |
| 67 | } |
| 68 | public function find($id, $lockMode = null, $lockVersion = null) |
| 69 | { |
| 70 | return $this->_em->find($this->_entityName, $id, $lockMode, $lockVersion); |
| 71 | } |
| 72 | public function findAll() |
| 73 | { |
| 74 | return $this->findBy([]); |
| 75 | } |
| 76 | public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null) |
| 77 | { |
| 78 | $persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName); |
| 79 | return $persister->loadAll($criteria, $orderBy, $limit, $offset); |
| 80 | } |
| 81 | public function findOneBy(array $criteria, ?array $orderBy = null) |
| 82 | { |
| 83 | $persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName); |
| 84 | return $persister->load($criteria, null, null, [], null, 1, $orderBy); |
| 85 | } |
| 86 | public function count(array $criteria) |
| 87 | { |
| 88 | return $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName)->count($criteria); |
| 89 | } |
| 90 | public function __call($method, $arguments) |
| 91 | { |
| 92 | if (str_starts_with($method, 'findBy')) { |
| 93 | return $this->resolveMagicCall('findBy', substr($method, 6), $arguments); |
| 94 | } |
| 95 | if (str_starts_with($method, 'findOneBy')) { |
| 96 | return $this->resolveMagicCall('findOneBy', substr($method, 9), $arguments); |
| 97 | } |
| 98 | if (str_starts_with($method, 'countBy')) { |
| 99 | return $this->resolveMagicCall('count', substr($method, 7), $arguments); |
| 100 | } |
| 101 | throw new BadMethodCallException(sprintf('Undefined method "%s". The method name must start with ' . 'either findBy, findOneBy or countBy!', $method)); |
| 102 | } |
| 103 | protected function getEntityName() |
| 104 | { |
| 105 | return $this->_entityName; |
| 106 | } |
| 107 | public function getClassName() |
| 108 | { |
| 109 | return $this->getEntityName(); |
| 110 | } |
| 111 | protected function getEntityManager() |
| 112 | { |
| 113 | return $this->_em; |
| 114 | } |
| 115 | protected function getClassMetadata() |
| 116 | { |
| 117 | return $this->_class; |
| 118 | } |
| 119 | public function matching(Criteria $criteria) |
| 120 | { |
| 121 | $persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName); |
| 122 | return new LazyCriteriaCollection($persister, $criteria); |
| 123 | } |
| 124 | private function resolveMagicCall(string $method, string $by, array $arguments) |
| 125 | { |
| 126 | if (!$arguments) { |
| 127 | throw InvalidMagicMethodCall::onMissingParameter($method . $by); |
| 128 | } |
| 129 | if (self::$inflector === null) { |
| 130 | self::$inflector = InflectorFactory::create()->build(); |
| 131 | } |
| 132 | $fieldName = lcfirst(self::$inflector->classify($by)); |
| 133 | if (!($this->_class->hasField($fieldName) || $this->_class->hasAssociation($fieldName))) { |
| 134 | throw InvalidMagicMethodCall::becauseFieldNotFoundIn($this->_entityName, $fieldName, $method . $by); |
| 135 | } |
| 136 | return $this->{$method}([$fieldName => $arguments[0]], ...array_slice($arguments, 1)); |
| 137 | } |
| 138 | } |
| 139 |