diff --git a/src/Generator/RepositoryGenerator.php b/src/Generator/RepositoryGenerator.php index 44022a5..cb18f6b 100644 --- a/src/Generator/RepositoryGenerator.php +++ b/src/Generator/RepositoryGenerator.php @@ -84,7 +84,11 @@ private function generateRepository(array $allMetadata, string $bundleName, Clas //parse the columns foreach ($fieldMappings as $fieldMapping) { - $renderedTemplate .= $this->templateService->renderField($fieldMapping, $entityDql); + $renderedTemplate .= $this->templateService->renderField( + $fieldMapping, + $entityDql, + $entityClasspath, + ); } foreach ($associationMappings as $associationMapping) { @@ -95,6 +99,7 @@ private function generateRepository(array $allMetadata, string $bundleName, Clas $entityDql, $targetEntityMetadata, $this->configurator->getEntityDqlName($associationMapping['targetEntity']), + $entityClasspath, ); } diff --git a/src/Generator/TemplateService.php b/src/Generator/TemplateService.php index 25c5ed9..1d866b4 100644 --- a/src/Generator/TemplateService.php +++ b/src/Generator/TemplateService.php @@ -37,6 +37,7 @@ public function renderAssociation( string $entityDql, ClassMetadata $targetEntityMetadata, string $entityDqlTargeted, + string $entityClasspath, ): string { $idType = null; @@ -53,18 +54,23 @@ public function renderAssociation( 'idType' => $idType, 'targetEntity' => $associationMapping['targetEntity'], 'entityDqlTargeted' => $entityDqlTargeted, + 'entityClasspath' => $entityClasspath, ); return $this->twig->render($this->associationTemplate, $parameters); } - public function renderField($fieldMapping, $entityDql): string - { + public function renderField( + $fieldMapping, + $entityDql, + string $entityClasspath, + ): string { $fieldName = $fieldMapping['fieldName']; $parameters = array( 'entityDql' => $entityDql, 'column' => ucfirst($fieldName), 'columnDql' => $fieldName, + 'entityClasspath' => $entityClasspath, ); return $this->twig->render($this->columnTemplate, $parameters); diff --git a/src/Resources/views/Generator/AssociationTemplate.html.twig b/src/Resources/views/Generator/AssociationTemplate.html.twig index 0325aa4..1953e5e 100644 --- a/src/Resources/views/Generator/AssociationTemplate.html.twig +++ b/src/Resources/views/Generator/AssociationTemplate.html.twig @@ -100,3 +100,25 @@ return $qb; } + + public function findBy{{ column }}(mixed $value): array + { + $qb = $this->getNewQueryBuilder(); + static::filterBy{{ column }}($qb, $value); + + return static::getQueryBuilderResult($qb); + } + + public function findOneBy{{ column }}( + mixed $value, + bool $allowNull = false, + ): ?\{{ entityClasspath }} { + $qb = $this->getNewQueryBuilder(); + static::filterBy{{ column }}($qb, $value); + + if ($allowNull) { + return static::getQueryBuilderOneOrNullResult($qb); + } + + return static::getQueryBuilderSingleResult($qb); + } diff --git a/src/Resources/views/Generator/ColumnTemplate.html.twig b/src/Resources/views/Generator/ColumnTemplate.html.twig index c9f452a..e2ab8f1 100644 --- a/src/Resources/views/Generator/ColumnTemplate.html.twig +++ b/src/Resources/views/Generator/ColumnTemplate.html.twig @@ -49,3 +49,25 @@ return $qb; } + + public function findBy{{ column }}(mixed $value): array + { + $qb = $this->getNewQueryBuilder(); + static::filterBy{{ column }}($qb, $value); + + return static::getQueryBuilderResult($qb); + } + + public function findOneBy{{ column }}( + mixed $value, + bool $allowNull = false, + ): ?\{{ entityClasspath }} { + $qb = $this->getNewQueryBuilder(); + static::filterBy{{ column }}($qb, $value); + + if ($allowNull) { + return static::getQueryBuilderOneOrNullResult($qb); + } + + return static::getQueryBuilderSingleResult($qb); + } diff --git a/tests/Repository/MyClassRepositoryBase.php b/tests/Repository/MyClassRepositoryBase.php index e4abacb..1b7ff8d 100644 --- a/tests/Repository/MyClassRepositoryBase.php +++ b/tests/Repository/MyClassRepositoryBase.php @@ -222,6 +222,28 @@ public static function filterNotInId(QueryBuilder $qb, $value, $entityName = 'my return $qb; } + public function findById(mixed $value): array + { + $qb = $this->getNewQueryBuilder(); + static::filterById($qb, $value); + + return static::getQueryBuilderResult($qb); + } + + public function findOneById( + mixed $value, + bool $allowNull = false, + ): ?\Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\MyClass { + $qb = $this->getNewQueryBuilder(); + static::filterById($qb, $value); + + if ($allowNull) { + return static::getQueryBuilderOneOrNullResult($qb); + } + + return static::getQueryBuilderSingleResult($qb); + } + public static function filterByNumber(QueryBuilder $qb, $value, $operator = Comparison::EQ, $entityName = 'myClass', $columnName = 'number'): QueryBuilder { if ($value === null) { @@ -273,6 +295,28 @@ public static function filterNotInNumber(QueryBuilder $qb, $value, $entityName = return $qb; } + public function findByNumber(mixed $value): array + { + $qb = $this->getNewQueryBuilder(); + static::filterByNumber($qb, $value); + + return static::getQueryBuilderResult($qb); + } + + public function findOneByNumber( + mixed $value, + bool $allowNull = false, + ): ?\Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\MyClass { + $qb = $this->getNewQueryBuilder(); + static::filterByNumber($qb, $value); + + if ($allowNull) { + return static::getQueryBuilderOneOrNullResult($qb); + } + + return static::getQueryBuilderSingleResult($qb); + } + public static function filterByName(QueryBuilder $qb, $value, $operator = Comparison::EQ, $entityName = 'myClass', $columnName = 'name'): QueryBuilder { if ($value === null) { @@ -324,6 +368,28 @@ public static function filterNotInName(QueryBuilder $qb, $value, $entityName = ' return $qb; } + public function findByName(mixed $value): array + { + $qb = $this->getNewQueryBuilder(); + static::filterByName($qb, $value); + + return static::getQueryBuilderResult($qb); + } + + public function findOneByName( + mixed $value, + bool $allowNull = false, + ): ?\Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\MyClass { + $qb = $this->getNewQueryBuilder(); + static::filterByName($qb, $value); + + if ($allowNull) { + return static::getQueryBuilderOneOrNullResult($qb); + } + + return static::getQueryBuilderSingleResult($qb); + } + public static function filterByForeignClasses(QueryBuilder $qb, $value, $operator = Comparison::EQ, $entityName = 'myClass', $columnName = 'foreignClasses'): QueryBuilder { //get a uniq index @@ -420,4 +486,26 @@ public static function joinForeignClasses(QueryBuilder $qb, $entityName = 'myCla return $qb; } + + public function findByForeignClasses(mixed $value): array + { + $qb = $this->getNewQueryBuilder(); + static::filterByForeignClasses($qb, $value); + + return static::getQueryBuilderResult($qb); + } + + public function findOneByForeignClasses( + mixed $value, + bool $allowNull = false, + ): ?\Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\MyClass { + $qb = $this->getNewQueryBuilder(); + static::filterByForeignClasses($qb, $value); + + if ($allowNull) { + return static::getQueryBuilderOneOrNullResult($qb); + } + + return static::getQueryBuilderSingleResult($qb); + } } diff --git a/tests/Service/ExpectedMyClassRepositoryBase.txt b/tests/Service/ExpectedMyClassRepositoryBase.txt index e4abacb..1b7ff8d 100644 --- a/tests/Service/ExpectedMyClassRepositoryBase.txt +++ b/tests/Service/ExpectedMyClassRepositoryBase.txt @@ -222,6 +222,28 @@ class MyClassRepositoryBase extends \Doctrine\Bundle\DoctrineBundle\Repository\S return $qb; } + public function findById(mixed $value): array + { + $qb = $this->getNewQueryBuilder(); + static::filterById($qb, $value); + + return static::getQueryBuilderResult($qb); + } + + public function findOneById( + mixed $value, + bool $allowNull = false, + ): ?\Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\MyClass { + $qb = $this->getNewQueryBuilder(); + static::filterById($qb, $value); + + if ($allowNull) { + return static::getQueryBuilderOneOrNullResult($qb); + } + + return static::getQueryBuilderSingleResult($qb); + } + public static function filterByNumber(QueryBuilder $qb, $value, $operator = Comparison::EQ, $entityName = 'myClass', $columnName = 'number'): QueryBuilder { if ($value === null) { @@ -273,6 +295,28 @@ class MyClassRepositoryBase extends \Doctrine\Bundle\DoctrineBundle\Repository\S return $qb; } + public function findByNumber(mixed $value): array + { + $qb = $this->getNewQueryBuilder(); + static::filterByNumber($qb, $value); + + return static::getQueryBuilderResult($qb); + } + + public function findOneByNumber( + mixed $value, + bool $allowNull = false, + ): ?\Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\MyClass { + $qb = $this->getNewQueryBuilder(); + static::filterByNumber($qb, $value); + + if ($allowNull) { + return static::getQueryBuilderOneOrNullResult($qb); + } + + return static::getQueryBuilderSingleResult($qb); + } + public static function filterByName(QueryBuilder $qb, $value, $operator = Comparison::EQ, $entityName = 'myClass', $columnName = 'name'): QueryBuilder { if ($value === null) { @@ -324,6 +368,28 @@ class MyClassRepositoryBase extends \Doctrine\Bundle\DoctrineBundle\Repository\S return $qb; } + public function findByName(mixed $value): array + { + $qb = $this->getNewQueryBuilder(); + static::filterByName($qb, $value); + + return static::getQueryBuilderResult($qb); + } + + public function findOneByName( + mixed $value, + bool $allowNull = false, + ): ?\Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\MyClass { + $qb = $this->getNewQueryBuilder(); + static::filterByName($qb, $value); + + if ($allowNull) { + return static::getQueryBuilderOneOrNullResult($qb); + } + + return static::getQueryBuilderSingleResult($qb); + } + public static function filterByForeignClasses(QueryBuilder $qb, $value, $operator = Comparison::EQ, $entityName = 'myClass', $columnName = 'foreignClasses'): QueryBuilder { //get a uniq index @@ -420,4 +486,26 @@ class MyClassRepositoryBase extends \Doctrine\Bundle\DoctrineBundle\Repository\S return $qb; } + + public function findByForeignClasses(mixed $value): array + { + $qb = $this->getNewQueryBuilder(); + static::filterByForeignClasses($qb, $value); + + return static::getQueryBuilderResult($qb); + } + + public function findOneByForeignClasses( + mixed $value, + bool $allowNull = false, + ): ?\Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\MyClass { + $qb = $this->getNewQueryBuilder(); + static::filterByForeignClasses($qb, $value); + + if ($allowNull) { + return static::getQueryBuilderOneOrNullResult($qb); + } + + return static::getQueryBuilderSingleResult($qb); + } }