Compare commits

...

66 Commits
3.5.3 ... 3.5.7

Author SHA1 Message Date
Grégoire Paris
f18de9d569 Merge pull request #12269 from greg0ire/3.5.x
Undo merge from 3.6.x into 3.5.x
2025-11-11 19:27:40 +01:00
Grégoire Paris
37f76a8381 Undo merge from 3.6.x into 3.5.x 2025-11-11 19:11:32 +01:00
Grégoire Paris
b62292256a Merge pull request #12265 from greg0ire/3.5.x
Merge 2.20.x up into 3.5.x
2025-11-10 22:11:37 +01:00
Grégoire Paris
b138395194 Merge remote-tracking branch 'origin/2.20.x' into 3.5.x 2025-11-10 21:32:47 +01:00
Grégoire Paris
dede2d775a Merge pull request #12262 from greg0ire/address-dbal-depr
Address default expression deprecation
2025-11-10 19:49:31 +01:00
Grégoire Paris
c502190712 Address default expression deprecation
This addresses the deprecation introduced in
https://github.com/doctrine/dbal/pull/7195

A follow-up should be to deprecate not using these value objects in
field mappings, so that we do not just reproduce the same checks that
the DBAL wants to remove.
2025-11-10 19:13:28 +01:00
Grégoire Paris
5bff0919a7 Merge pull request #12254 from elliotbruneel/fix/empty-array-query
fix: handling of empty array in SQL condition generation
2025-11-10 14:35:45 +01:00
Elliot Bruneel
9ef0f5301b fix: update SQL condition for empty array to 1=0 instead of IN (NULL) 2025-11-10 10:44:48 +01:00
Elliot Bruneel
4989ca6f15 test: add test for finding by nullable field with empty array 2025-11-05 10:03:09 +01:00
Elliot Bruneel
32d1e97ce7 chore: improve empty array check in SQL condition generation 2025-11-05 09:51:33 +01:00
Grégoire Paris
ca8147b148 Merge pull request #12257 from doctrine/dependabot/github_actions/2.20.x/doctrine/dot-github-12.2.0
Bump doctrine/.github from 12.1.0 to 12.2.0
2025-11-03 09:32:58 +01:00
dependabot[bot]
c8ebea77f0 Bump doctrine/.github from 12.1.0 to 12.2.0
Bumps [doctrine/.github](https://github.com/doctrine/.github) from 12.1.0 to 12.2.0.
- [Release notes](https://github.com/doctrine/.github/releases)
- [Commits](https://github.com/doctrine/.github/compare/12.1.0...v12.2.0)

---
updated-dependencies:
- dependency-name: doctrine/.github
  dependency-version: 12.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 06:11:36 +00:00
Elliot Bruneel
23f22860f1 chore: update phpstan version and regenerate baseline 2025-10-31 09:04:03 +01:00
Elliot Bruneel
b24586b1b5 fix: handling of empty array in SQL condition generation 2025-10-30 17:31:04 +01:00
Grégoire Paris
7d8e51c934 Merge pull request #12250 from greg0ire/3.5.x
Merge 2.20.x up into 3.5.x
2025-10-29 08:33:35 +01:00
Grégoire Paris
2f8f1cfcb8 Merge remote-tracking branch 'origin/2.20.x' into 3.5.x 2025-10-29 07:31:41 +01:00
Grégoire Paris
fe5ee705db Merge pull request #12247 from greg0ire/composer-lint
Setup composer lint workflow
2025-10-29 07:28:39 +01:00
Grégoire Paris
0511a9f790 Merge pull request #12248 from greg0ire/remove-mailing-list
Drop link to mailing list
2025-10-28 22:06:18 +01:00
Grégoire Paris
0e3d5e8c82 Drop link to mailing list
Who still uses this? Not me, that's for sure!
2025-10-28 21:20:15 +01:00
Grégoire Paris
72ffb3bfbf Remove archive exclude list
It is not up-to-date, and we use .gitattributes for this purpose.
2025-10-28 21:04:43 +01:00
Grégoire Paris
2e9a1adc23 Setup composer lint workflow 2025-10-28 21:03:24 +01:00
Grégoire Paris
ffd3f50ad7 Merge pull request #12244 from greg0ire/3.6.x
Merge 3.5.x up into 3.6.x
2025-10-27 23:46:31 +01:00
Grégoire Paris
483b45d449 Merge remote-tracking branch 'origin/3.5.x' into 3.6.x 2025-10-27 23:20:06 +01:00
Christophe Coevoet
dd4e8fe78f Merge pull request #12198 from stof/arbitrary_join_on
Update DQL arbitrary joins to use the ON keyword instead of WITH
2025-10-25 10:59:22 +02:00
Alexander M. Turek
7cc210424c SQLFilter: replace internal array shape with class (#12232) 2025-10-22 09:20:35 +02:00
Grégoire Paris
4fd9e94819 Merge pull request #12234 from mpdude/merge-3.5.x-into-3.6.x
Merge 3.5.x up into 3.6.x
2025-10-22 08:31:52 +02:00
Christophe Coevoet
587caf88a7 Update DQL arbitrary joins to use the ON keyword instead of WITH
DQL arbitrary joins are semantically equivalent to SQL joins, so using
the same keyword reduces confusion. It also means that in next major
version, the WITH keyword will only be about applying adhoc filtering on
relations instead of having 2 responsibilities.
2025-10-21 17:42:48 +02:00
Matthias Pigulla
1e33b775d3 Merge remote-tracking branch 'upstream/3.5.x' into HEAD 2025-10-21 17:30:48 +02:00
Grégoire Paris
28d9472a38 Merge pull request #12196 from mpdude/deprecation-notice-parser-result
Add deprecation messages for methods that were only annotated as being `@deprecated`
2025-10-12 08:32:18 +02:00
Grégoire Paris
c6955ec056 Merge pull request #12221 from greg0ire/3.6.x
Merge 3.5.x up into 3.6.x
2025-10-12 01:54:15 +02:00
Grégoire Paris
6863272943 Merge remote-tracking branch 'origin/3.5.x' into 3.6.x 2025-10-11 17:07:11 +02:00
Alexander M. Turek
c472a1535d Stop using deprecated Collections constants (#12214) 2025-10-09 15:02:50 +02:00
Matthias Pigulla
f1a8ee175c Add deprecation messages for two methods that were only annotated as being @deprecated 2025-10-08 23:09:14 +02:00
Alexander M. Turek
28dd32790f Merge branch '3.5.x' into 3.6.x
* 3.5.x:
  Fix missing import
  Remove calls to getMockForAbstractClass() (#12003)
  Upgrade to doctrine/coding-standard 14
  Bump doctrine/.github from 7.3.0 to 8.0.0
2025-10-08 10:32:06 +02:00
Alexander M. Turek
ac19b21a71 Merge branch '3.5.x' into 3.6.x
* 3.5.x:
  Add a CI job that fails on deprecations (#12188)
  use the empty string instead of null as an array offset (#12181)
  do not call setAccessible() on PHP >= 8.1 (#12182)
  Fix docs on final entities (#12176)
  Remove Database and Model First chapters that said little of value.
  Switch to IgnoreDeprecations
  docs: consistent PostgreSQL's name case
  docs: generation strategies differences between DBAL 3 and 4
  Check extra condition to decide if a test was skipped
  Use PHPUnit 11 when possible
  Migrate away from annotations in tests
  Migrate away from assertStringNotMatchesFormat()
  Migrate to willReturn()
  Migrate away from getMockForAbstractClass()
  Fix `IN`/`NOT IN` expression handling and support enums when matching on to-many-collections
2025-10-07 16:07:07 +02:00
Alexander Dmitryuk
a7a14cffaf Fix php doc for getPropertyAccessors method (#12159)
Co-authored-by: a.dmitryuk <a.dmitryuk@movavi.com>
2025-09-10 02:04:32 +02:00
Grégoire Paris
ceb04bf3f6 Merge pull request #12131 from rela589n/3.6.x-class-locator-doctrine-persistence-4.1
Feature: add support for `ClassLocator`
2025-08-25 23:10:55 +02:00
Yevhen Sidelnyk
ed9ba16ff4 Feature: add support for ClassLocator
In the scope of https://github.com/doctrine/persistence/pull/433
(available from `doctrine/persistence` >= 4.1) there was added
`ColocatedMappingDriver::$classLocator` (`ClassLocator`) property,
which allows passing any instance of `ClassLocator` for the mapping
driver to use. This commit integrates those changes into `AttributeDriver`.

Since `doctrine/orm` maintains the support for `doctrine/persistence`
of older versions, tests ensure that `ClassLocator` actually exists.

The old paths' behaviour can be adapted into the new by passing
`FileClassLocator` into `AttributeDriver`
(see `FileClassLocator::createFromDirectories($directoryPaths)`).
2025-08-23 14:26:54 +03:00
Grégoire Paris
fc1bf3b815 Merge pull request #12144 from greg0ire/3.6.x
Merge 3.5.x up into 3.6.x
2025-08-19 22:16:20 +02:00
Grégoire Paris
b6b342cada Merge remote-tracking branch 'origin/3.5.x' into 3.6.x 2025-08-19 21:57:35 +02:00
Alexander M. Turek
bea4814d55 Merge branch '3.5.x' into 3.6.x
* 3.5.x:
  Prefer non-deprecated AbstractAsset API (#12142)
2025-08-19 16:46:37 +02:00
Christian Flothmann
238c15952c fix pull request URL (#12138) 2025-08-18 11:52:40 +02:00
Grégoire Paris
fdc88ba236 Merge pull request #12135 from greg0ire/missing-assertion
Add missing assertion in test
2025-08-17 21:06:21 +02:00
Grégoire Paris
c49bf58682 Add missing assertion in test
I forgot to copy it from another test.
2025-08-17 20:51:37 +02:00
Grégoire Paris
ce844d94a0 Merge pull request #12126 from greg0ire/depr-nullable-prim-keys
Deprecate specifying nullable on primary key columns
2025-08-17 11:46:24 +02:00
Max
c1f7a60c5b perf: Optimizing ScalarColumnHydrator::hydrateAllData (#12095) 2025-08-11 12:21:15 +02:00
Grégoire Paris
d1d13d5956 Deprecate specifying nullable on primary key columns
It produces no effect.
2025-08-08 22:23:32 +02:00
Grégoire Paris
4f8dde2d1e Add missing heading 2025-08-08 21:23:08 +02:00
Grégoire Paris
e3c320c705 Merge pull request #12124 from doctrine/3.5.x-merge-up-into-3.6.x_N9Rr16zf
Merge release 3.5.2 into 3.6.x
2025-08-08 19:46:47 +02:00
Alexander M. Turek
831232e05e Merge branch '3.5.x' into 3.6.x
* 3.5.x:
  Don't partially mock the AbstractPlatform class (#12114)
2025-08-06 18:18:01 +02:00
Alexander M. Turek
a774cedb24 Include stability in coverage file key (#12112) 2025-08-06 14:03:37 +02:00
Alexander M. Turek
6b8207bb11 Allow Symfony 8 (#12110) 2025-08-06 11:05:43 +02:00
Alexander M. Turek
3d3b5b51cd Run tests with Symfony 8 (#12102) 2025-08-06 10:46:32 +02:00
Grégoire Paris
760616291b Merge pull request #12105 from doctrine/3.5.x-merge-up-into-3.6.x_OhbrLWrh
Merge release 3.5.1 into 3.6.x
2025-08-05 08:39:23 +02:00
Alexander M. Turek
8584da8fdc Merge branch '3.5.x' into 3.6.x
* 3.5.x:
  Move LazyGhost deprecation to ProxyFactory (#12101)
  Address deprecations from doctrine/dbal (#12098)
2025-08-04 23:49:06 +02:00
Grégoire Paris
07bb0def60 Merge pull request #12100 from doctrine/3.5.x
Merge 3.5.x up into 3.6.x
2025-08-04 18:11:51 +02:00
Grégoire Paris
8cf161d8bc Merge pull request #12091 from doctrine/3.5.x
Merge 3.5.x up into 3.6.x
2025-07-30 16:30:50 +02:00
Grégoire Paris
a2990e1a0a Merge pull request #12071 from stlgaits/mapping-command-json-output
Add JSON format option for orm:mapping:describe command output
2025-07-23 07:31:41 +02:00
Grégoire Paris
d355c4a990 Merge pull request #12081 from doctrine/3.5.x
Merge 3.5.x up into 3.6.x
2025-07-22 09:58:24 +02:00
stlgaits
88c395c488 Add --em option help description for orm:mapping:describe 2025-07-22 09:45:20 +02:00
stlgaits
256d6cb0d7 Add JSON format option for orm:mapping:describe command output 2025-07-22 09:43:50 +02:00
Grégoire Paris
a1fdc6eb6e Merge pull request #12073 from doctrine/3.5.x
Merge 3.5.x up into 3.6.x
2025-07-12 10:04:59 +02:00
Grégoire Paris
d583460d63 Merge pull request #12068 from janedbal/prevent-delete-limit-misuse
QueryBuilder: prevent misuse of DELETE with LIMIT
2025-07-12 09:49:12 +02:00
Jan Nedbal
79d4cfdce8 Prevent misuse of DELETE with LIMIT in QueryBuilder
This fixes a dangerous bug where LIMIT is silently ignored in DELETE
      operations, potentially causing developers to delete all rows instead
      of just the intended subset. The setMaxResults() method would be
      silently omitted from the final query, making operations like
      delete last entry accidentally delete entire tables.
2025-07-10 17:31:03 +02:00
Grégoire Paris
5301b99533 Merge pull request #12051 from greg0ire/stop-using-depr-method
Stop using QueryBuilder::getRootAlias()
2025-07-02 08:35:19 +02:00
Grégoire Paris
00c7b70211 Stop using QueryBuilder::getRootAlias()
That method has been deprecated for almost 15 years, in
85d40847ac.
On top of that I'm adding a deprecation for something related that was
scheduled for deprecation at in the same commit.
2025-07-01 21:21:04 +02:00
12 changed files with 224 additions and 43 deletions

View File

@@ -24,4 +24,4 @@ on:
jobs:
coding-standards:
uses: "doctrine/.github/.github/workflows/coding-standards.yml@12.1.0"
uses: "doctrine/.github/.github/workflows/coding-standards.yml@v12.2.0"

20
.github/workflows/composer-lint.yml vendored Normal file
View File

@@ -0,0 +1,20 @@
name: "Composer Lint"
on:
pull_request:
branches:
- "*.x"
paths:
- ".github/workflows/composer-lint.yml"
- "composer.json"
push:
branches:
- "*.x"
paths:
- ".github/workflows/composer-lint.yml"
- "composer.json"
jobs:
composer-lint:
name: "Composer Lint"
uses: "doctrine/.github/.github/workflows/composer-lint.yml@v12.2.0"

View File

@@ -17,4 +17,4 @@ on:
jobs:
documentation:
name: "Documentation"
uses: "doctrine/.github/.github/workflows/documentation.yml@12.1.0"
uses: "doctrine/.github/.github/workflows/documentation.yml@v12.2.0"

View File

@@ -7,7 +7,7 @@ on:
jobs:
release:
uses: "doctrine/.github/.github/workflows/release-on-milestone-closed.yml@12.1.0"
uses: "doctrine/.github/.github/workflows/release-on-milestone-closed.yml@v12.2.0"
secrets:
GIT_AUTHOR_EMAIL: ${{ secrets.GIT_AUTHOR_EMAIL }}
GIT_AUTHOR_NAME: ${{ secrets.GIT_AUTHOR_NAME }}

View File

@@ -1,32 +1,39 @@
{
"name": "doctrine/orm",
"type": "library",
"description": "Object-Relational-Mapper for PHP",
"keywords": ["orm", "database"],
"homepage": "https://www.doctrine-project.org/projects/orm.html",
"license": "MIT",
"authors": [
{"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"},
{"name": "Roman Borschel", "email": "roman@code-factory.org"},
{"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"},
{"name": "Jonathan Wage", "email": "jonwage@gmail.com"},
{"name": "Marco Pivetta", "email": "ocramius@gmail.com"}
"type": "library",
"keywords": [
"orm",
"database"
],
"scripts": {
"docs": "composer --working-dir docs update && ./docs/vendor/bin/build-docs.sh @additional_args"
},
"config": {
"allow-plugins": {
"composer/package-versions-deprecated": true,
"dealerdirect/phpcodesniffer-composer-installer": true,
"phpstan/extension-installer": true
"authors": [
{
"name": "Guilherme Blanco",
"email": "guilhermeblanco@gmail.com"
},
"sort-packages": true
},
{
"name": "Roman Borschel",
"email": "roman@code-factory.org"
},
{
"name": "Benjamin Eberlei",
"email": "kontakt@beberlei.de"
},
{
"name": "Jonathan Wage",
"email": "jonwage@gmail.com"
},
{
"name": "Marco Pivetta",
"email": "ocramius@gmail.com"
}
],
"homepage": "https://www.doctrine-project.org/projects/orm.html",
"require": {
"php": "^8.1",
"composer-runtime-api": "^2",
"ext-ctype": "*",
"composer-runtime-api": "^2",
"doctrine/collections": "^2.2",
"doctrine/dbal": "^3.8.2 || ^4",
"doctrine/deprecations": "^0.5.3 || ^1",
@@ -44,7 +51,7 @@
"phpbench/phpbench": "^1.0",
"phpdocumentor/guides-cli": "^1.4",
"phpstan/extension-installer": "^1.4",
"phpstan/phpstan": "2.1.22",
"phpstan/phpstan": "2.1.23",
"phpstan/phpstan-deprecation-rules": "^2",
"phpunit/phpunit": "^10.5.0 || ^11.5",
"psr/log": "^1 || ^2 || ^3",
@@ -55,16 +62,26 @@
"symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0"
},
"autoload": {
"psr-4": { "Doctrine\\ORM\\": "src" }
"psr-4": {
"Doctrine\\ORM\\": "src"
}
},
"autoload-dev": {
"psr-4": {
"Doctrine\\Tests\\": "tests/Tests",
"Doctrine\\Performance\\": "tests/Performance",
"Doctrine\\StaticAnalysis\\": "tests/StaticAnalysis",
"Doctrine\\Performance\\": "tests/Performance"
"Doctrine\\Tests\\": "tests/Tests"
}
},
"archive": {
"exclude": ["!vendor", "tests", "*phpunit.xml", "build.xml", "build.properties", "composer.phar", "vendor/satooshi", "lib/vendor", "*.swp"]
"config": {
"allow-plugins": {
"composer/package-versions-deprecated": true,
"dealerdirect/phpcodesniffer-composer-installer": true,
"phpstan/extension-installer": true
},
"sort-packages": true
},
"scripts": {
"docs": "composer --working-dir docs update && ./docs/vendor/bin/build-docs.sh @additional_args"
}
}

View File

@@ -13,7 +13,6 @@ If this documentation is not helping to answer questions you have about
Doctrine ORM don't panic. You can get help from different sources:
- There is a :doc:`FAQ <reference/faq>` with answers to frequent questions.
- The `Doctrine Mailing List <https://groups.google.com/group/doctrine-user>`_
- Slack chat room `#orm <https://www.doctrine-project.org/slack>`_
- Report a bug on `GitHub <https://github.com/doctrine/orm/issues>`_.
- On `StackOverflow <https://stackoverflow.com/questions/tagged/doctrine-orm>`_

View File

@@ -696,12 +696,6 @@ parameters:
count: 1
path: src/Internal/Hydration/AbstractHydrator.php
-
message: '#^Method Doctrine\\ORM\\Internal\\Hydration\\AbstractHydrator\:\:gatherRowData\(\) should return array\{data\: array\<array\>, newObjects\?\: array\<array\{class\: ReflectionClass, args\: array, obj\: object\}\>, scalars\?\: array\} but returns array\{data\: array, newObjects\: array\<array\{class\: ReflectionClass\<object\>, args\: array, obj\?\: object\}\>, scalars\?\: non\-empty\-array\}\.$#'
identifier: return.type
count: 1
path: src/Internal/Hydration/AbstractHydrator.php
-
message: '#^Method Doctrine\\ORM\\Internal\\Hydration\\AbstractHydrator\:\:getClassMetadata\(\) return type with generic class Doctrine\\ORM\\Mapping\\ClassMetadata does not specify its types\: T$#'
identifier: missingType.generics
@@ -822,6 +816,12 @@ parameters:
count: 1
path: src/Internal/HydrationCompleteHandler.php
-
message: '#^Offset int\|null might not exist on array\<int, object\>\.$#'
identifier: offsetAccess.notFound
count: 1
path: src/Internal/StronglyConnectedComponents.php
-
message: '#^Property Doctrine\\ORM\\Internal\\StronglyConnectedComponents\:\:\$representingNodes \(array\<int, object\>\) does not accept array\<int\|string, object\>\.$#'
identifier: assign.propertyType
@@ -1536,6 +1536,12 @@ parameters:
count: 1
path: src/Mapping/LegacyReflectionFields.php
-
message: '#^Strict comparison using \!\=\= between array\<string, string\> and null will always evaluate to true\.$#'
identifier: notIdentical.alwaysTrue
count: 1
path: src/Mapping/ManyToManyOwningSideMapping.php
-
message: '#^Method Doctrine\\ORM\\Mapping\\MappedSuperclass\:\:__construct\(\) has parameter \$repositoryClass with generic class Doctrine\\ORM\\EntityRepository but does not specify its types\: T$#'
identifier: missingType.generics
@@ -2607,7 +2613,7 @@ parameters:
-
message: '#^Property Doctrine\\ORM\\Query\\Filter\\SQLFilter\:\:\$parameters \(array\<string, array\{type\: string, value\: mixed, is_list\: bool\}\>\) does not accept non\-empty\-array\<string, array\{value\: mixed, type\: Doctrine\\DBAL\\ArrayParameterType\|Doctrine\\DBAL\\ParameterType\|int\|string, is_list\: bool\}\>\.$#'
identifier: assign.propertyType
count: 1
count: 2
path: src/Query/Filter/SQLFilter.php
-
@@ -2880,12 +2886,6 @@ parameters:
count: 1
path: src/Tools/Console/Command/GenerateProxiesCommand.php
-
message: '#^Parameter \#2 \$proxyDir of method Doctrine\\ORM\\Proxy\\ProxyFactory\:\:generateProxyClasses\(\) expects string\|null, string\|false given\.$#'
identifier: argument.type
count: 1
path: src/Tools/Console/Command/GenerateProxiesCommand.php
-
message: '#^Method Doctrine\\ORM\\Tools\\Console\\Command\\MappingDescribeCommand\:\:getClassMetadata\(\) return type with generic class Doctrine\\ORM\\Mapping\\ClassMetadata does not specify its types\: T$#'
identifier: missingType.generics

View File

@@ -1668,6 +1668,11 @@ class BasicEntityPersister implements EntityPersister
$value = [$value];
}
if ($value === []) {
$selectedColumns[] = '1=0';
continue;
}
$nullKeys = array_keys($value, null, true);
$nonNullValues = array_diff_key($value, array_flip($nullKeys));

View File

@@ -9,6 +9,10 @@ use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Schema\AbstractAsset;
use Doctrine\DBAL\Schema\AbstractSchemaManager;
use Doctrine\DBAL\Schema\ComparatorConfig;
use Doctrine\DBAL\Schema\DefaultExpression;
use Doctrine\DBAL\Schema\DefaultExpression\CurrentDate;
use Doctrine\DBAL\Schema\DefaultExpression\CurrentTime;
use Doctrine\DBAL\Schema\DefaultExpression\CurrentTimestamp;
use Doctrine\DBAL\Schema\ForeignKeyConstraintEditor;
use Doctrine\DBAL\Schema\Index;
use Doctrine\DBAL\Schema\Index\IndexedColumn;
@@ -18,6 +22,7 @@ use Doctrine\DBAL\Schema\NamedObject;
use Doctrine\DBAL\Schema\PrimaryKeyConstraint;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Schema\Table;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Mapping\AssociationMapping;
use Doctrine\ORM\Mapping\ClassMetadata;
@@ -46,6 +51,7 @@ use function count;
use function current;
use function implode;
use function in_array;
use function interface_exists;
use function is_numeric;
use function method_exists;
use function preg_match;
@@ -489,6 +495,37 @@ class SchemaTool
// the 'default' option can be overwritten here
$options = $this->gatherColumnOptions($mapping) + $options;
if (isset($options['default']) && interface_exists(DefaultExpression::class)) {
if (
in_array($mapping->type, [
Types::DATETIME_MUTABLE,
Types::DATETIME_IMMUTABLE,
Types::DATETIMETZ_MUTABLE,
Types::DATETIMETZ_IMMUTABLE,
], true)
&& $options['default'] === $this->platform->getCurrentTimestampSQL()
) {
/** @phpstan-ignore class.notFound (if DefaultExpression exists, CurrentTimestamp exists as well) */
$options['default'] = new CurrentTimestamp();
}
if (
in_array($mapping->type, [Types::TIME_MUTABLE, Types::TIME_IMMUTABLE], true)
&& $options['default'] === $this->platform->getCurrentTimeSQL()
) {
/** @phpstan-ignore class.notFound (if DefaultExpression exists, CurrentTime exists as well) */
$options['default'] = new CurrentTime();
}
if (
in_array($mapping->type, [Types::DATE_MUTABLE, Types::DATE_IMMUTABLE], true)
&& $options['default'] === $this->platform->getCurrentDateSQL()
) {
/** @phpstan-ignore class.notFound (if DefaultExpression exists, CurrentDate exists as well) */
$options['default'] = new CurrentDate();
}
}
if ($class->isIdGeneratorIdentity() && $class->getIdentifierFieldNames() === [$mapping->fieldName]) {
$options['autoincrement'] = true;
}

View File

@@ -0,0 +1,43 @@
<?php
declare(strict_types=1);
namespace Doctrine\Tests\ORM\Functional;
use DateTime;
use DateTimeImmutable;
use Doctrine\Deprecations\PHPUnit\VerifyDeprecations;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Tests\OrmFunctionalTestCase;
class DefaultTimeExpressionTest extends OrmFunctionalTestCase
{
use VerifyDeprecations;
public function testUsingTimeRelatedDefaultExpressionCausesNoDbalDeprecation(): void
{
$this->expectNoDeprecationWithIdentifier('https://github.com/doctrine/dbal/pull/7195');
$this->createSchemaForModels(TimeEntity::class);
}
}
#[ORM\Entity]
class TimeEntity
{
#[ORM\Id]
#[ORM\Column]
public int $id;
#[ORM\Column(options: ['default' => 'CURRENT_TIMESTAMP'])]
public DateTime $createdAt;
#[ORM\Column(options: ['default' => 'CURRENT_TIMESTAMP'])]
public DateTimeImmutable $createdAtImmutable;
#[ORM\Column(options: ['default' => 'CURRENT_TIME'])]
public DateTime $createdTime;
#[ORM\Column(options: ['default' => 'CURRENT_DATE'])]
public DateTime $createdDate;
}

View File

@@ -0,0 +1,54 @@
<?php
declare(strict_types=1);
namespace Doctrine\Tests\ORM\Functional\Ticket;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\GeneratedValue;
use Doctrine\ORM\Mapping\Id;
use Doctrine\Tests\OrmFunctionalTestCase;
class GH12254Test extends OrmFunctionalTestCase
{
protected function setUp(): void
{
parent::setUp();
$this->setUpEntitySchema([
GH12254EntityA::class,
]);
$this->_em->persist(new GH12254EntityA());
$this->_em->flush();
$this->_em->clear();
}
public function testFindByEmptyArrayShouldReturnEmptyArray(): void
{
// pretend we are starting afresh
$this->_em = $this->getEntityManager();
$result = $this->_em->getRepository(GH12254EntityA::class)->findBy(['id' => []]);
$this->assertEmpty($result);
}
public function testFindByInNullableField(): void
{
$this->_em = $this->getEntityManager();
$result = $this->_em->getRepository(GH12254EntityA::class)->findBy(['name' => []]);
$this->assertEmpty($result);
}
}
#[Entity]
class GH12254EntityA
{
#[Column(type: 'integer')]
#[Id]
#[GeneratedValue(strategy: 'AUTO')]
public int $id;
#[Column(type: 'string', nullable: true)]
public string|null $name = null;
}

View File

@@ -147,6 +147,7 @@ class BasicEntityPersisterTypeValueSqlTest extends OrmTestCase
}
#[Group('DDC-3056')]
#[Group('GH12254')]
public function testSelectConditionStatementWithMultipleValuesContainingNull(): void
{
self::assertEquals(
@@ -168,6 +169,11 @@ class BasicEntityPersisterTypeValueSqlTest extends OrmTestCase
'(t0.id IN (?, ?) OR t0.id IS NULL)',
$this->persister->getSelectConditionStatementSQL('id', [123, null, 234]),
);
self::assertEquals(
'1=0',
$this->persister->getSelectConditionStatementSQL('id', []),
);
}
public function testCountCondition(): void