Compare commits

...

1254 Commits

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
Grégoire Paris
1220edf953 Merge pull request #12241 from greg0ire/3.5.x
Merge 2.20.x up into 3.5.x
2025-10-27 23:06:52 +01:00
Grégoire Paris
7e4693d629 Merge remote-tracking branch 'origin/2.20.x' into 3.5.x 2025-10-27 22:34:13 +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
Grégoire Paris
4f36f0129a Merge pull request #12236 from eltharin/bugfix_fieldalias_entityInDto
bugfix - add fieldAlias for entities in dto
2025-10-23 08:51:42 +02:00
eltharin
f71aa73ef1 bugfix - add fieldAlias for entities in dto 2025-10-22 21:14:42 +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
c6207b1793 Merge pull request #12202 from greg0ire/missing-suffix
Add missing "Test" suffix
2025-10-20 08:01:47 +02:00
Grégoire Paris
8c92903430 Specify the length of VARCHAR columns
Platforms in the MySQL/MariaDB family require that.
2025-10-18 14:26:12 +02:00
Grégoire Paris
8616a98023 Add missing "Test" suffix
That test never got executed.
2025-10-18 14:16:07 +02:00
Grégoire Paris
7602a5341c Merge pull request #12224 from greg0ire/3.5.x
Merge 2.20.x up into 3.5.x
2025-10-13 23:12:23 +02:00
Grégoire Paris
214b1ad739 Merge remote-tracking branch 'origin/2.20.x' into 3.5.x 2025-10-13 22:53:09 +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
cf11f1e453 Add ORDER BY clause to SELECT query (#12222)
The order of results is not guaranteed unless we do so, and the test can
fail in some cases:

	There was 1 failure:

	1) Doctrine\Tests\ORM\Functional\QueryTest::testToIterableWithMixedResultArbitraryJoinsScalars
	Failed asserting that two strings are equal.
	--- Expected
	+++ Actual
	@@ @@
	-'Doctrine 2'
	+'lala 2'

	/home/runner/work/orm/orm/tests/Tests/ORM/Functional/QueryTest.php:481
2025-10-12 02:02:42 +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
Grégoire Paris
eae6577ce2 Merge pull request #12219 from greg0ire/rework-upgrade-md
Move introduction outside of paragraph about 3.x
2025-10-11 17:05:17 +02:00
Grégoire Paris
e3106d439d Move introduction outside of paragraph about 3.x
It is not specific to 3.x and should stay forever.
2025-10-11 09:41:24 +02:00
Alexander M. Turek
40aa44914f Ignore DBAL deprecation that we cannot fix (yet) (#12218) 2025-10-09 23:48:42 +02:00
Grégoire Paris
7c8a528914 Merge pull request #12211 from greg0ire/3.5.x
Merge 2.20.x up into 3.5.x
2025-10-09 22:07:50 +02:00
Grégoire Paris
40fedadecf Merge pull request #12217 from derrabus/bugfix/deprecated-get-name
Fix DBAL deprecation
2025-10-09 15:42:59 +02:00
Alexander M. Turek
0d97a44f28 Fix DBAL deprecation 2025-10-09 15:24:06 +02:00
Alexander M. Turek
c472a1535d Stop using deprecated Collections constants (#12214) 2025-10-09 15:02:50 +02:00
Grégoire Paris
64cd5cad20 Merge remote-tracking branch 'origin/2.20.x' into 3.5.x 2025-10-09 08:05:48 +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
d3e1440175 Handle quoted PK columns properly on DBAL 4 (#12208) 2025-10-08 18:25:12 +02:00
Benjamin Eberlei
a9bd00a70b Improve migration docs from ORM 2 to 3. (#12207)
* Improve migration docs from ORM 2 to 3.

* Improve wording

* Hint about following deprecations.
2025-10-08 16:37:16 +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
4f3a5c5514 Merge pull request #12201 from derrabus/bugfix/missing-import 2025-10-07 22:57:47 +02:00
Alexander M. Turek
6641989e35 Fix missing import 2025-10-07 18:02:20 +02:00
Alexander M. Turek
8ca72a4e96 Merge branch '2.20.x' into 3.5.x
* 2.20.x:
  Remove calls to getMockForAbstractClass() (#12003)
2025-10-07 17:25:14 +02:00
Alexander M. Turek
daf74b74b5 Merge commit 'c1af765960bf88cb5109f74a05d24c4df9aaf76a' into 3.5.x
* commit 'c1af765960bf88cb5109f74a05d24c4df9aaf76a':
  Upgrade to doctrine/coding-standard 14
  Bump doctrine/.github from 7.3.0 to 8.0.0
2025-10-07 16:49: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 M. Turek
c6db9feade Add a CI job that fails on deprecations (#12188) 2025-10-07 16:03:42 +02:00
Alexander M. Turek
86d847edb8 Merge branch '2.20.x' into 3.5.x
* 2.20.x:
  use the empty string instead of null as an array offset (#12181)
  do not call setAccessible() on PHP >= 8.1 (#12182)
2025-10-07 15:23:19 +02:00
Massimiliano Arione
8ad560c34d Fix docs on final entities (#12176) 2025-09-26 00:28:08 +02:00
Grégoire Paris
ccfb620f31 Merge pull request #12175 from beberlei/Docs-RemoveDatabaseFirstChapter
Remove Database and Model First chapters that said little of value.
2025-09-21 22:00:51 +02:00
Benjamin Eberlei
94c4d48ae5 Remove Database and Model First chapters that said little of value. 2025-09-21 21:06:16 +02:00
Grégoire Paris
2ca63df90c Merge pull request #12161 from greg0ire/proper-attribute
Switch to IgnoreDeprecations
2025-09-12 08:23:02 +02:00
Grégoire Paris
0d4413c248 Switch to IgnoreDeprecations
Rather than disabling the error handler, this attribute available since
PHPUnit 10.5 allows to be more fine-grained and ignore only the deprecations.
2025-09-10 23:58:13 +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
48434f4c53 Merge pull request #12150 from greg0ire/3.5.x
Merge 2.20.x up into 3.5.x
2025-08-28 07:45:06 +02:00
Grégoire Paris
200a505f36 Merge pull request #12148 from lucasmirloup/docs/generation-strategies-dbal-4
docs: generation strategies: differences between DBAL 3 and 4
2025-08-27 07:42:53 +02:00
Grégoire Paris
17d7814fdc Merge remote-tracking branch 'origin/2.20.x' into 3.5.x 2025-08-27 00:02:52 +02:00
Lucas Mirloup
f7d4e379bc docs: consistent PostgreSQL's name case 2025-08-26 11:37:07 +02:00
Lucas Mirloup
c164ae434f docs: generation strategies differences between DBAL 3 and 4 2025-08-26 11:03:48 +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
Grégoire Paris
21e9fcbfbb Merge pull request #12146 from greg0ire/upg-phpunit
PHPUnit 11
2025-08-24 08:30:10 +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
Gregoire PARIS
db456976ed Check extra condition to decide if a test was skipped
It seems that this could happen with PHPUnit 10, then tearDown() would
crash when calling `clear()` on null, but then PHPUnit 10 did not show
that exception.
2025-08-21 13:40:44 +02:00
Grégoire Paris
2d9091778f Use PHPUnit 11 when possible 2025-08-21 13:39:49 +02:00
Grégoire Paris
17059e5265 Migrate away from annotations in tests 2025-08-21 13:39:49 +02:00
Grégoire Paris
680a9ef632 Migrate away from assertStringNotMatchesFormat()
It has been deprecated.
2025-08-21 13:39:48 +02:00
Grégoire Paris
9d5f112c7e Migrate to willReturn()
self::returnValue() and self::onConsecutiveCalls() has been deprecated.
2025-08-21 13:39:48 +02:00
Grégoire Paris
b7423c96cf Migrate away from getMockForAbstractClass()
It has been deprecated.
2025-08-21 13:39:46 +02: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
Grégoire Paris
28735afae3 Merge pull request #12143 from greg0ire/3.5.x
Merge 2.20.x up into 3.5.x
2025-08-19 21:56:34 +02:00
Grégoire Paris
0f229fbb4b Merge remote-tracking branch 'origin/2.20.x' into 3.5.x 2025-08-19 21:44:21 +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
Alexander M. Turek
85c13edc80 Prefer non-deprecated AbstractAsset API (#12142)
Co-authored-by: Christian Flothmann <christian.flothmann@open.de>
2025-08-19 16:46:03 +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
Grégoire Paris
5a541b8b3a Merge pull request #12121 from greg0ire/3.5.x
Merge 2.20.x up into 3.5.x
2025-08-08 19:00:40 +02:00
Grégoire Paris
9fb9cc46e4 Merge remote-tracking branch 'origin/2.20.x' into 3.5.x 2025-08-08 09:03:30 +02:00
Grégoire Paris
781ed30926 Merge pull request #12108 from greg0ire/address-deprecations
Address deprecations
2025-08-08 08:25:29 +02:00
Grégoire Paris
257c5094c4 Use not nullable columns when part of the primary key
Using a nullable column that references another table as part of a
primary key makes no sense, and is ignored by DBAL. Let us ignore it at
the ORM level.
2025-08-06 23:06:28 +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
66e0e92816 Don't partially mock the AbstractPlatform class (#12114) 2025-08-06 18:12:23 +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
Grégoire Paris
64444dcfd5 Merge pull request #12088 from greg0ire/quote-parts
Quote parts of the table name
2025-08-05 08:05:51 +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
Alexander M. Turek
eb2cd5375c Move LazyGhost deprecation to ProxyFactory (#12101) 2025-08-04 23:48:11 +02:00
Grégoire Paris
de7140e105 Address deprecations from doctrine/dbal (#12098)
- Non-standard flags are deprecated.
- Index::getColumns() is deprecated.
2025-08-04 23:47:55 +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
85d66de9df Improve comment
This comment is rendered useless by the phpdoc comment below it.
Instead, we can comment on what exactly "quoted" means.
2025-07-31 22:54:44 +02:00
Grégoire Paris
1b98be31ce Convert test into 2 unit tests
That test was testing too many thing and not really making it clear what
the expected output was, given some output. Instead, let us create 2
tests, each pertaining to the class under test.
2025-07-31 22:53:35 +02:00
Grégoire Paris
61f2752a80 Quote parts of the table name
In aa141bf001, I wrongly assumed that
$tableName would never contain a dot as I was not able to write a test
that caused that to happen.

The secret recipe appears to be to define a schema and to quote the
table name.

To fix it for the table name, I am calling quoteSingleIdentifier()
before doing the concatenation between schema name and table name.

To fix it for the sequence name, which seems only useful when using DBAL
3 for some reason, I reuse some of the logic of the deprecated method.

Fixes #12041
2025-07-31 21:49:43 +02:00
Grégoire Paris
f3371e1773 Merge pull request #12094 from greg0ire/simplify-test
Remove if statement
2025-07-31 17:12:39 +02:00
Grégoire Paris
6476894dc4 Remove if statement
Tests should not have conditional logic, and since a41c6d3, the else
branch of this conditional statement is dead.
2025-07-31 09:01:52 +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
0f32569a7a Merge pull request #12083 from greg0ire/depr-reflFields
Deprecate ClassMetadata::$reflFields
2025-07-27 23:19:29 +02:00
Gregoire PARIS
d99f74c704 Deprecate ClassMetadata::$reflFields
It is replaced with property accessors since
https://github.com/doctrine/orm/pull/11659
2025-07-24 09:55:19 +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
62ca8424d8 Merge pull request #12080 from greg0ire/3.5.x
Merge 2.20.x up into 3.5.x
2025-07-22 09:35:03 +02:00
Gregoire PARIS
3f2209a571 Merge remote-tracking branch 'origin/2.20.x' into 3.5.x 2025-07-22 09:09:21 +02:00
Grégoire Paris
e714b1a2fc Merge pull request #12075 from andrew-demb/patch-1
📖 Actualize code block to be compatible with DBAL v4, use modern PHP
2025-07-15 18:16:50 +02:00
Benjamin Morel
ec0bf05853 Use PHP attributes syntax in schema validator message (#12074) 2025-07-15 00:24:16 +02:00
Andrii Dembitskyi
dc58aa3ea1 📖 Actualize code block to be compatible with DBAL v4, use modern PHP 2025-07-14 20:15:18 +03:00
Grégoire Paris
23b74e4f8b Merge pull request #12063 from wmouwen/test/gh-10788
Proxy class with BackedEnum as primary key does not convert the enum
2025-07-14 10:04:21 +02:00
Willem Mouwen
d2b699e6f5 fix: Convert BackedEnum to scalar value when binding a parameter 2025-07-12 20:50:25 +02:00
Willem Mouwen
0338d69324 test: Store an entity with a proxy association that has a BackedEnum primary identifier 2025-07-12 20:50:19 +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
Grégoire Paris
2c01dac173 Merge pull request #12072 from greg0ire/update-baseline
Update baseline because of doctrine/dbal 4.3.0
2025-07-12 09:46:50 +02:00
Grégoire Paris
137ecb491a Update baseline because of doctrine/dbal 4.3.0
This should fix the build. Maybe some of the reported issues can be
addressed, but if that is the case, it should probably be done on the
next minor branch.
2025-07-11 18:42:54 +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
f38ee09082 Merge pull request #12062 from janedbal/binary-id-eager-fetch-reupload
Fix unhandled ParameterType case for binary PKs
2025-07-10 17:05:57 +02:00
Jan Nedbal
6ab858a5c5 Apply suggestion from @greg0ire
Co-authored-by: Grégoire Paris <postmaster@greg0ire.fr>
2025-07-10 16:54:02 +02:00
Jan Nedbal
3dca27ce0d Fix unhandled ParameterType case for binary PKs
Add proper handling for binary primary key parameter types that were
  previously causing runtime exceptions. The existing parameter type
  switch statement was missing a case for binary types, leading to
  unhandled scenarios when working with binary primary keys.

  This ensures consistent parameter type handling across all supported
  primary key data types in the ORM.
2025-07-07 12:07:52 +02:00
Grégoire Paris
e19704e1f8 Merge pull request #12056 from greg0ire/switch-to-tags
Remove branchName from unmaintained branch
2025-07-04 07:50:39 +02:00
Grégoire Paris
9437675d3b Remove branchName from unmaintained branch
Since https://github.com/doctrine/doctrine-website/pull/372, they are no
longer necessary, it's possible to rely on tags. Once this is merged,
the branches can be removed.
2025-07-02 23:32:01 +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
63409d638c Merge pull request #12048 from greg0ire/update-branch-metadata
Update branch metadata for 3.5.0
2025-07-02 08:12:04 +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
Grégoire Paris
9b9160b206 Update branch metadata for 3.5.0
3.5.0 has been released.

- 3.6.x is the new upcoming branch;
- 3.5.x is now the current branch;
- 3.4.x is no longer maintained.
2025-07-01 19:45:42 +02:00
Grégoire Paris
6deec3655b Merge pull request #12046 from greg0ire/3.5.x
Merge 3.4.x up into 3.5.x
2025-07-01 19:40:53 +02:00
Grégoire Paris
7f40422d21 Merge remote-tracking branch 'origin/3.4.x' into 3.5.x 2025-07-01 19:13:12 +02:00
Grégoire Paris
e67fa5388b Merge pull request #12043 from beberlei/Bugfix-DisableNativeLazyLogicException
Only throw PHP 8.4 requirement exception when enabling native lazy objects.
2025-06-30 23:43:15 +02:00
Grégoire Paris
80053336c9 Merge pull request #12044 from doctrine/3.4.x
Merge branch 3.4.x into 3.5.x
2025-06-30 21:53:04 +02:00
Grégoire Paris
dddcc507ef Merge pull request #12039 from xabbuh/pr-12036
do not register the legacy proxy class name resolver with enabled native lazy ghost
2025-06-30 20:38:34 +02:00
Christian Flothmann
b41d9da88d do not register the legacy proxy class name resolver with enabled native lazy ghost 2025-06-30 19:14:11 +02:00
Benjamin Eberlei
c04bfb78b7 Only throw PHP 8.4 requirement exception when enabling native lazy objects. 2025-06-30 19:01:49 +02:00
Grégoire Paris
8a5dfc86d4 Merge pull request #12037 from stlgaits/mapping-describe-completion
Add console completion for entityName param of orm:mapping:describe c…
2025-06-29 18:26:55 +02:00
Grégoire Paris
79e103c07e Merge pull request #11978 from Ocramius/feature/#11977-batch-handling-of-inserts-with-given-ids
#11977 implemented batching of `INSERT` operations in `UnitOfWork#executeInserts()` so that `EntityPersister#executeInserts()` calls are reduced
2025-06-28 22:19:54 +02:00
stlgaits
5afadf163a Add console completion for entityName param of orm:mapping:describe command 2025-06-28 11:27:52 +02:00
Grégoire Paris
edfaa37228 Merge pull request #12036 from greg0ire/depr-proxy-autoload
Deprecate proxy autoloader and class name resolver
2025-06-28 11:09:37 +02:00
Grégoire Paris
ea056e98ba Deprecate proxy autoloader and class name resolver
These are only needed when not using native lazy objects.
2025-06-27 19:24:23 +02:00
Grégoire Paris
bab5771e98 Merge pull request #12034 from doctrine/3.4.x
Merge 3.4.x up into 3.5.x
2025-06-27 18:32:26 +02:00
Grégoire Paris
ee919d6231 Merge pull request #12030 from greg0ire/test-w-lazy-o
Rework tests and benchmarks to work with lazy objects
2025-06-27 18:13:24 +02:00
Grégoire Paris
04c390693a Merge pull request #12033 from greg0ire/remove-assert
Remove wrong assertion
2025-06-27 15:55:40 +02:00
Grégoire Paris
49293c4d48 Merge pull request #12032 from doctrine/3.4.x-merge-up-into-3.5.x_dG7qI4BR
Merge release 3.4.3 into 3.5.x
2025-06-27 14:44:44 +02:00
Gregoire PARIS
8d9e2e7d4e Remove wrong assertion
When using native lazy objects, it is plain wrong.
2025-06-27 14:42:37 +02:00
Grégoire Paris
ef607f26c2 Merge pull request #12031 from doctrine/stof-patch-1
Clean the handling of proxy initialization in the UnitOfWork
2025-06-27 14:14:15 +02:00
Gregoire PARIS
ed543a205c Rework tests and benchmarks to work with lazy objects
These tests and benchmarks are still relevant with lazy objects.
I am not setting up an extra job to test phpbench without native lazy
objects. Instead, I'm bumping the PHP version to 8.4 so that native lazy
objects are in use.
2025-06-27 14:12:58 +02:00
Christophe Coevoet
de1c28bb16 Clean the handling of proxy initialization in the UnitOfWork
Using the VarExporter Hydrator to assign default values of properties when marking an entity as initialized is needed only when using var-exporter proxies.
For lazy objects, this behavior is already provided by `ReflectionClass::markLazyObjectAsInitialized`
2025-06-27 13:58:03 +02:00
Grégoire Paris
60ff966d54 Merge pull request #12022 from greg0ire/depr-proxy-dir
Provide upgrade path to new ORMSetup::create* signature
2025-06-27 08:12:42 +02:00
Grégoire Paris
33684253c3 Merge pull request #12026 from doctrine/3.4.x-merge-up-into-3.5.x_yt3lc4tn
Merge release 3.4.2 into 3.5.x
2025-06-26 21:07:39 +02:00
Grégoire Paris
b4ca0cd5fb Merge pull request #12024 from greg0ire/3.4.x
Merge 2.20.x up into 3.4.x
2025-06-26 20:51:01 +02:00
Grégoire Paris
a49c1beb93 Merge remote-tracking branch 'origin/2.20.x' into 3.4.x 2025-06-26 20:38:31 +02:00
Grégoire Paris
76852cfef3 Provide upgrade path to new ORMSetup::create* signature
Currently we have ORMSetup::create*Configuration methods with a
$proxyDir argument that is used to configure the proxy directory, but
also as a seed for generating a namespace for cache systems.

Since these methods could be used with named arguments, renaming the
argument is not really an option and we need separate methods.
2025-06-26 00:14:59 +02:00
Grégoire Paris
3bd89caf36 use lowercase for word in upgrade guide 2025-06-25 23:27:18 +02:00
Grégoire Paris
eb2e7d959c Merge pull request #12020 from greg0ire/depr-legacy-proxy
Deprecate more proxies-related methods or calls
2025-06-25 23:17:56 +02:00
Grégoire Paris
a4b20356f4 Merge pull request #11988 from jannes-io/3.4.x
Add index mapping to column
2025-06-25 11:17:22 +02:00
Grégoire Paris
2550b2d1de Deprecate more proxies-related methods or calls 2025-06-25 00:04:27 +02:00
jannes
e94e1ab126 Add index mapping to Column
Adds a new option to Column mapping to add indexes to class fields
directly instead of having to use the Index() class attribute.
This allows users to define indexes in traits
where access to the class isn't available.
Fixes #11982
2025-06-24 19:50:47 +02:00
Grégoire Paris
19e1a64a91 Merge pull request #12014 from greg0ire/3.5.x
Merge 3.4.1 up into 3.5.x
2025-06-21 13:57:03 +02:00
Grégoire Paris
082e776e91 Merge remote-tracking branch 'origin/3.4.x' into 3.5.x 2025-06-21 13:14:14 +02:00
Grégoire Paris
92e2f6db83 Merge pull request #12012 from greg0ire/revert-allfields-dto
Revert "add capability to use allfields sql notation"
2025-06-21 12:44:26 +02:00
Grégoire Paris
aa624f64c1 Remove trailing whitespace 2025-06-21 11:58:51 +02:00
Grégoire Paris
e1675eb371 Revert "add capability to use allfields sql notation"
This reverts commit 12c721f528.

This feature introduces several issues:

- It adds alias.*, which is a first, for instance you cannot do
SELECT u.* FROM User u
- If introduces coupling between property order in mapping fields and
  the result.
2025-06-21 11:58:42 +02:00
Grégoire Paris
cc2b6385a1 Merge pull request #12011 from greg0ire/3.4.x
Merge 2.20.x up into 3.4.x
2025-06-21 11:48:10 +02:00
Grégoire Paris
a64bed9bbb Merge remote-tracking branch 'origin/2.20.x' into 3.4.x 2025-06-21 11:11:52 +02:00
Grégoire Paris
3272e1c0af Merge pull request #12008 from greg0ire/add-test-to-todo-list
Ensure proxies implementations behave the same on entity not found
2025-06-20 00:24:56 +02:00
Grégoire Paris
69da22d517 Ensure proxies implementations behave the same on entity not found
Both implementations are supposed to throw EntityNotFoundException
2025-06-19 10:07:06 +02:00
Grégoire Paris
06109f360f Merge pull request #12002 from greg0ire/relax-type-declarations
Make proxyDir and proxyNs nullable and optional
2025-06-19 08:00:18 +02:00
Grégoire Paris
06a9ef1127 Make proxyDir and proxyNs nullable and optional
When using native lazy objects, it should be possible to omit these
arguments, hence the default value.
Also, when using native lazy objects, one should not have to configure
the corresponding Configuration attributes, which means
EntityManager__construct() should be able to pass null to this class,
hence the nullability.

Fixes #11997
2025-06-18 23:23:30 +02:00
Grégoire Paris
bbde41f712 Merge pull request #12005 from greg0ire/depr-no-lazy-objects
Deprecate not using native lazy objects on PHP 8.4+
2025-06-18 07:24:56 +02:00
Alexander M. Turek
8c0994f35f Detect DBAL's number type (#11781) 2025-06-18 02:43:47 +02:00
Grégoire Paris
3d390bc053 Deprecate not using native lazy objects on PHP 8.4+ 2025-06-18 00:14:15 +02:00
Grégoire Paris
16f1be7f10 Merge pull request #12004 from doctrine/3.4.x
Merge 3.4.x up into 3.5.x
2025-06-18 00:12:23 +02:00
Grégoire Paris
c74df3fab3 Merge pull request #12001 from greg0ire/lazy-objects-by-default
Enable native lazy objects by default
2025-06-17 23:50:46 +02:00
Grégoire Paris
f2c902ee03 Rewrite test with native lazy ghost
I do not think this needs to be tested on all versions of PHP, using
native lazy objects allows us to remove a deprecation.
2025-06-17 23:35:47 +02:00
Grégoire Paris
4e5e3c5e50 Enable native lazy objects by default
This should make the test suite look less like a christmas tree.
2025-06-17 23:09:48 +02:00
Grégoire Paris
da697f218f Merge pull request #12000 from greg0ire/fix-var-name
Use the correct environment variable name for lazy objects and enable them by default
2025-06-17 21:15:38 +02:00
Grégoire Paris
4f47a80deb Use the correct environment variable name for lazy objects
The test suite checks for ENABLE_NATIVE_LAZY_OBJECTS
I have also renamed the matrix variable for the sake of consistency.
2025-06-17 08:35:16 +02:00
Grégoire Paris
1334162a56 Merge pull request #11989 from greg0ire/late-depr
Deprecate methods for configuring no longer configurable features
2025-06-16 08:37:59 +02:00
Grégoire Paris
ab89517093 Merge pull request #11987 from greg0ire/update-branch-metadata
Update branch metadata
2025-06-16 08:37:20 +02:00
Grégoire Paris
48a51d8470 Merge pull request #11992 from eltharin/error_doc_codeblock
repair code block bad showing
2025-06-16 08:36:13 +02:00
eltharin
ab11244f08 repair code block bad showing 2025-06-16 08:03:47 +02:00
Grégoire Paris
68ec3ebaa3 Remove trailing whitespace 2025-06-14 18:14:58 +02:00
Grégoire Paris
4f4ed2f242 Deprecate methods for configuring no longer configurable features
In 3.0.0, it is no longer possible to disable lazy ghost objects, and
likewise, it is no longer possible to disable rejecting id collisions in
the identity map, so let us deprecate the related methods.
I was supposed to do this in 3.1.0.
2025-06-14 18:14:54 +02:00
Grégoire Paris
a1c2be140d Update branch metadata
- 3.5.x has been created
- 3.4.0 has been released
- 3.3.x is no longer maintained
2025-06-14 13:50:55 +02:00
Grégoire Paris
4664373bd0 Merge pull request #11985 from doctrine/3.3.x-merge-up-into-3.4.x_KXrSCX8l
Merge release 3.3.4 into 3.4.x
2025-06-14 13:47:14 +02:00
Grégoire Paris
5ab6b74f14 Merge pull request #11984 from doctrine/2.20.x
Merge 2.20.x up into 3.3.x
2025-06-14 13:32:43 +02:00
Marco Pivetta
79cc70a62f #11977 expanded test coverage to check interleaved assigned-id vs generated-id entities
As noted by @bendavies

Ref: https://github.com/doctrine/orm/pull/11978#discussion_r2141143273
2025-06-11 23:44:24 +02:00
Marco Pivetta
4e6b5a1b0b #11977 provided method documentation / example, as per @greg0ire's feedback
Ref: https://github.com/doctrine/orm/pull/11978#discussion_r2140881217
2025-06-11 22:53:22 +02:00
Marco Pivetta
21b144fff9 #11977 removed unused type-hint, which can be completely inferred by the parameters 2025-06-11 22:50:15 +02:00
Marco Pivetta
658940de38 #11977 only perform batching if/when the AssignedGenerator is in use
The `SequenceGenerator` is potentially used for PostgreSQL table auto-generated fields, but
the `SequenceGenerator` is not a **POST**-insert generator.

Because the `SequenceGenerator` is used in the middle of `INSERT` operations performed
by persisters, we cannot rely on it in batching operations: disabling it, so we get a green
test suite on PostgreSQL.

This change makes `GH10531Test` pass on PostgreSQL: see #10531
2025-06-11 18:26:20 +02:00
Marco Pivetta
ad487370f5 #11977 hardened InsertBatchTest to check entity types of sequential batches 2025-06-11 18:16:45 +02:00
Marco Pivetta
259f83b549 #11977 added test coverage verifying that persisters are being used to batch INSERTs 2025-06-11 17:36:24 +02:00
Marco Pivetta
4a24860dcf #11977 isolated INSERT batch generation to own @internal performance-sensitive class 2025-06-11 17:18:23 +02:00
Marco Pivetta
116cdf8661 #11977 implemented simplistic (and ugly) batch handing of INSERT operations in UnitOfWork#executeInserts()
This logic also brings a minor benefit in reducing the number of times `ListenersInvoker#getSubscribedSystems`
is queried.

TODOs:

* [ ] integration test this - it is expected to reduce the number of `EntityPersister#executeInserts()` calls
* [ ] refactor this by creating a new `@internal` class for the batch, and perhaps batch via a generator
* [ ] reduce amount of repeated `getClassMetadata()` calls
* [ ] reduce overall size of `UnitOfWork` code, instead of increasing it
2025-06-11 15:43:04 +02:00
Grégoire Paris
97b29bb063 Merge pull request #11973 from eltharin/add_constructor
Add constructor argument
2025-06-07 09:41:24 +02:00
eltharin
b7fff508a4 add argument in constructor 2025-06-06 18:39:24 +02:00
Grégoire Paris
c6fa14ed52 Merge pull request #11971 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2025-06-06 13:05:27 +02:00
Grégoire Paris
05c8c5f114 Merge pull request #11969 from greg0ire/3.3.x
Merge 2.20.x up into 3.3.x
2025-06-06 12:29:34 +02:00
Gregoire PARIS
1dbdb0e895 Merge remote-tracking branch 'origin/2.20.x' into 3.3.x 2025-06-06 12:08:24 +02:00
Grégoire Paris
0a43e4af8f Merge pull request #11946 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2025-05-25 18:35:30 +02:00
Grégoire Paris
7111cc09f3 Merge pull request #11945 from greg0ire/3.3.x
Merge 2.20.x up into 3.3.x
2025-05-25 18:12:06 +02:00
Grégoire Paris
777504b9c4 Merge remote-tracking branch 'origin/2.20.x' into 3.3.x 2025-05-24 19:19:52 +02:00
Dimitri Dovgan
9d9985076a Add missing closing bracket (#11937)
Corrected a malformed attribute in the documentation.
2025-05-18 12:08:50 +02:00
Olivier Massot
35d301b052 Association Mappings: replace assertions by explicit exceptions (#11896) 2025-05-16 08:37:08 +02:00
Grégoire Paris
083b241c81 Merge pull request #11846 from eltharin/all_fields
add capability to use allfields sql notation
2025-05-08 10:55:51 +02:00
Grégoire Paris
b9989555fd Merge pull request #11927 from greg0ire/3.4.x
Merge 3.3.x up into 3.4.x
2025-05-02 20:26:12 +02:00
Grégoire Paris
80a79f6d2d Merge remote-tracking branch 'origin/3.3.x' into 3.4.x 2025-05-02 19:48:18 +02:00
Grégoire Paris
1f1891d3e2 Merge pull request #11926 from greg0ire/3.3.x
Merge 2.20.x up into 3.3.x
2025-05-02 19:42:51 +02:00
Grégoire Paris
c9fc4d90e5 Merge remote-tracking branch 'origin/2.20.x' into 3.3.x 2025-05-02 19:17:15 +02:00
Anton
0e3cff0c6a Update composite-primary-keys.rst (#11919)
Fix examples
2025-05-01 23:56:00 +02:00
Grégoire Paris
5c50ed925a Merge pull request #11924 from xabbuh/dbal-6867
prefer primary key constraints over Index::isPrimary()
2025-05-01 13:09:32 +01:00
Christian Flothmann
5a1e560f87 prefer primary key constraints over Index::isPrimary() 2025-05-01 13:46:41 +02:00
Grégoire Paris
78e8887759 Merge pull request #11911 from xabbuh/dbal-6890
disable detecting modified indexes with DBAL 4.3
2025-04-25 11:02:23 +02:00
Grégoire Paris
9a3f5579f1 Merge pull request #11921 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2025-04-24 18:59:58 +02:00
Grégoire Paris
5eb298b99b Merge pull request #11914 from xabbuh/dbal-6886
do not use deprecated index features
2025-04-23 10:54:33 +02:00
Christian Flothmann
5eb0255f47 do not use deprecated index features 2025-04-23 08:01:37 +02:00
Grégoire Paris
28575f58af Merge pull request #11903 from xabbuh/dbal-6867
do not use deprecated primary key constraint features
2025-04-23 07:56:01 +02:00
Christian Flothmann
457d2d2841 do not use deprecated primary key constraint features 2025-04-23 07:07:30 +02:00
eltharin
12c721f528 add capability to use allfields sql notation
in a dto, this PR allow to call u.* to get all fileds fo u entity in one call,
2025-04-22 21:40:54 +02:00
Grégoire Paris
9a9c3e8aba Merge pull request #11847 from eltharin/newentityInDto
add capability to hydrate an entity in a dto
2025-04-22 21:00:16 +02:00
Christian Flothmann
5d01c66c84 disable detecting modified indexes with DBAL 4.3 2025-04-22 12:45:20 +02:00
Yevhen Sidelnyk
a2516b67dc [DOC]: fix setFileExtension() xml mapping documentation (#11905)
* doc: fix setFileExtension() xml mapping documentation

* Update docs/en/reference/xml-mapping.rst

Co-authored-by: Grégoire Paris <postmaster@greg0ire.fr>

---------

Co-authored-by: Grégoire Paris <postmaster@greg0ire.fr>
2025-04-21 22:21:43 +02:00
eltharin
46a020108d add capability to hydrate an entity in a dto
this PR allow to hydrate data in an entity  nested in a dto
2025-04-21 14:29:19 +02:00
Grégoire Paris
3d4e9b3ecf Merge pull request #11912 from xabbuh/dbal-6823
[#6823] pass unquoted identifier folding to AbstractPlatform
2025-04-20 11:09:40 +02:00
Grégoire Paris
d1ee40e7d5 Merge pull request #11908 from xabbuh/dbal-6674
use the platform to quote table names
2025-04-20 11:08:07 +02:00
Christian Flothmann
65d2720764 [#6823] pass unquoted identifier folding to AbstractPlatform 2025-04-17 23:56:20 +02:00
Grégoire Paris
3e18a58de6 Merge pull request #11907 from xabbuh/dbal-6728
do not use deprecated foreign key constraint features
2025-04-17 23:10:47 +02:00
Christian Flothmann
a9f9202c00 do not use deprecated foreign key constraint features 2025-04-17 21:18:35 +02:00
Grégoire Paris
d8cb71fe4a Merge pull request #11906 from xabbuh/dbal-6710
no longer use Table::columnsAreIndexed()
2025-04-17 08:28:28 +02:00
Christian Flothmann
d659591b6c use the platform to quote table names 2025-04-15 12:49:24 +02:00
Christian Flothmann
e2430ac9a7 no longer use Table::columnsAreIndexed() 2025-04-15 12:43:51 +02:00
Grégoire Paris
b286d6cd2c Merge pull request #11902 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2025-04-14 23:38:21 +02:00
Grégoire Paris
0b373f6c27 Merge pull request #11900 from xabbuh/dbal-6886
replace Index::overrules() with custom checks
2025-04-14 23:17:07 +02:00
Benjamin Eberlei
443cf92242 Merge pull request #11852 from beberlei/PropertyHookSupport
Final tests and adjustments to allow mapping properties with hooks.
Property hooks are not supported when using `symfony/var-exporter`.
2025-04-12 11:33:27 +02:00
Christian Flothmann
36b9064dbe replace Index::overrules() with custom checks 2025-04-07 08:53:18 +02:00
Benjamin Eberlei
eb3b984132 Add support for PHP 8.4 Lazy Objects RFC with configuration flag (#11853)
* Introduce PHP 8.4 lazy proxy/ghost API.

* Call setRawValueWithoutLazyInitialization for support with lazy proxy.

* Refactorings

* Revert test change partially and skip with lazy objects.

* Houskeeping: phpcs

* Run with ENABLE_LAZY_PROXY=1 in php 8.4 matrix.

* Fix ci

* Transient properties are not skipping lazy initialization anymore, to expensive and could lead to errors. Adjust lifecycle test that uses transient properittes for assertions.

* Restore behavior preventing property hook use in 8.4 in unsupported coditions

* Add \ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE

Co-authored-by: Nicolas Grekas <nicolas.grekas@gmail.com>

* Rename isNativeLazyObjectsEnabled/enableNativeLazyObjects.

* Housekeeping: phpcs

* Update advanced-configuration docs and make proxy config variables not required anymore with native lazy objects.

* Move code around

* Apply suggestions from code review

Co-authored-by: Grégoire Paris <postmaster@greg0ire.fr>

* Pick suggestions

---------

Co-authored-by: Nicolas Grekas <nicolas.grekas@gmail.com>
Co-authored-by: Grégoire Paris <postmaster@greg0ire.fr>
2025-03-29 23:14:13 +01:00
Grégoire Paris
04395f98f9 Merge pull request #11887 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2025-03-25 16:25:25 +01:00
Grégoire Paris
4baa7bd252 Merge pull request #11882 from xabbuh/dbal-6867
favor Table::addPrimaryKeyConstraint() over Table::setPrimaryKey()
2025-03-25 16:06:32 +01:00
Christian Flothmann
c55f10e501 favor Table::addPrimaryKeyConstraint() over Table::setPrimaryKey() 2025-03-25 12:40:28 +01:00
Grégoire Paris
f3fb79658e Merge pull request #11886 from greg0ire/3.3.x
Merge 2.20.x up into 3.3.x
2025-03-25 08:44:22 +01:00
Grégoire Paris
10a32cb824 Merge remote-tracking branch 'origin/2.20.x' into 3.3.x 2025-03-25 07:56:47 +01:00
Grégoire Paris
0c10010f9f Merge pull request #11884 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2025-03-24 22:34:05 +01:00
Grégoire Paris
d88371331d Merge pull request #11883 from xabbuh/dbal-6864
adapt assertions for new consistent PRIMARY KEY formatting
2025-03-24 22:02:26 +01:00
Christian Flothmann
b260ec8a00 adapt assertions for new consistent PRIMARY KEY formatting 2025-03-24 21:40:11 +01:00
Grégoire Paris
be8da83aca Merge pull request #10624 from simPod/deferrable
feat: allow setting foreign key as deferrable
2025-03-23 10:09:10 +01:00
Grégoire Paris
f5ab687226 Merge pull request #11876 from greg0ire/address-reflfield-depr
Address deprecation of ClassMetadata::$reflFields
2025-03-19 15:53:29 +01:00
Grégoire Paris
742eead849 Merge pull request #11878 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2025-03-18 21:38:05 +01:00
Grégoire Paris
1072ea6db4 Merge pull request #11877 from greg0ire/iso-phpunit-config
Iso phpunit config
2025-03-18 20:41:25 +01:00
Grégoire Paris
baf2c60cc4 Use more similar PHPUnit configurations
The dev configuration and CI configuration should not diverge this much.
I do not think the current situation was intended. A difference that
remains after my changes is the bootstrap file, which in dev seems aimed
at helping contributors setup their environment.
2025-03-18 20:08:09 +01:00
Grégoire Paris
8e620cad40 Do not run CI jobs when changing dev PHPUnit file
This file is never used in the CI.
2025-03-18 20:08:09 +01:00
Grégoire Paris
f98e871913 Address deprecation of ClassMetadata::$reflFields
We should use the newly introduced ClassMetadata::$propertyAccessors instead.
See https://github.com/doctrine/orm/pull/11659
2025-03-18 19:39:48 +01:00
Grégoire Paris
4b0c11978e Merge pull request #11875 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2025-03-18 14:25:17 +01:00
Grégoire Paris
daf0f82884 Merge pull request #11874 from doctrine/2.20.x
Merge 2.20.x up into 3.3.x
2025-03-18 13:52:20 +01:00
Grégoire Paris
0ef5610a6c Merge pull request #11873 from beberlei/GH-11659-FollowUp1
Bugfix: Missed a spot using getUnderlyingReflector
2025-03-16 23:18:10 +01:00
Benjamin Eberlei
e29d0e977d Bugfix: Missed a spot using getUnderlyingReflector 2025-03-15 17:39:14 +01:00
Grégoire Paris
bd0509a064 Merge pull request #11825 from eltharin/bug_arg_order
FIX - nested dto's doesn't have arguments in good order and Dto with only objects bug
2025-03-05 15:38:16 +01:00
Grégoire Paris
d540f73778 Merge pull request #11659 from beberlei/PropertyHooks
Necessary refactorings for Property hooks
2025-02-27 20:04:08 +01:00
Benjamin Eberlei
201d751a26 Allow access to underlying reflector for property accessor. 2025-02-26 00:48:30 +01:00
Benjamin Eberlei
6308b2fd86 Update tests/Tests/ORM/Mapping/PropertyAccessors/ReadOnlyAccessorTest.php
Co-authored-by: Claudio Zizza <859964+SenseException@users.noreply.github.com>
2025-02-26 00:38:41 +01:00
Benjamin Eberlei
8f99e84438 Update src/Mapping/PropertyAccessors/EnumPropertyAccessor.php
Co-authored-by: Claudio Zizza <859964+SenseException@users.noreply.github.com>
2025-02-26 00:34:12 +01:00
Benjamin Eberlei
e36b7755e9 Houskeeping: phpcs 2025-02-23 19:43:26 +01:00
Benjamin Eberlei
7b4d869b31 Merge branch '3.4.x' into PropertyHooks 2025-02-23 19:23:20 +01:00
eltharin
708bd84fe2 fix bugs
nested dto are not in good argument order
dto with only dto does'nt work
2025-02-21 10:35:19 +01:00
Grégoire Paris
8873109b4f Merge pull request #11840 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2025-02-18 23:12:40 +01:00
Grégoire Paris
36bef3f959 Merge pull request #11839 from greg0ire/3.3.x
Merge 2.20.x up into 3.3.x
2025-02-18 22:42:29 +01:00
Grégoire Paris
980ccc58dc Merge remote-tracking branch 'origin/2.20.x' into 3.3.x 2025-02-18 21:40:58 +01:00
Grégoire Paris
62ca4624a9 Merge pull request #11837 from greg0ire/restore-exception
Restore logic exception
2025-02-17 20:39:14 +01:00
Grégoire Paris
1aed318b7b Restore logic exception
This exception was dropped by mistake during a merge-up, and should be
present until Doctrine officially supports property hooks.
2025-02-17 19:17:20 +01:00
Benjamin Eberlei
5077ae41e5 Housekeeping 2025-02-15 23:25:34 +01:00
Benjamin Eberlei
8e1a27b8cc Explain deprecation in UPGRADE.md 2025-02-15 22:32:16 +01:00
Benjamin Eberlei
e7db1b005f Add ReadOnlyAccessorTest 2025-02-15 22:17:29 +01:00
Benjamin Eberlei
72ce662e45 Tests for ObjectCastPropertyAccessor and RawValuePropertyAccessor. 2025-02-15 22:09:36 +01:00
Benjamin Eberlei
673cf0d4d8 Add test for ObjectCastPropertyAccessor. 2025-02-15 21:45:01 +01:00
Benjamin Eberlei
1cae0534a0 Extract PropertyAccessorFactory, tests for enum and typednodefault accessors. 2025-02-15 21:38:09 +01:00
Benjamin Eberlei
6fb3083f63 Merge remote-tracking branch 'beberlei/PropertyHooks' into PropertyHooks 2025-02-15 00:02:45 +01:00
Benjamin Eberlei
68c17ca1bd Merge remote-tracking branch 'origin/3.4.x' into PropertyHooks 2025-02-15 00:01:50 +01:00
Benjamin Eberlei
82cf29407c Update src/Mapping/PropertyAccessors/PropertyAccessor.php
Co-authored-by: Grégoire Paris <postmaster@greg0ire.fr>
2025-02-15 00:01:22 +01:00
Gregor Harlan
f8fdeaf41e UPGRADE.md: fix typo (#11832) 2025-02-12 00:10:14 +01:00
Grégoire Paris
ae74be5e9d Merge pull request #11823 from doctrine/3.3.x-merge-up-into-3.4.x_lzhu6IBq
Merge release 3.3.2 into 3.4.x
2025-02-05 08:08:57 +01:00
Grégoire Paris
c9557c588b Merge remote-tracking branch 'origin/2.20.x' into 3.3.x 2025-02-04 20:43:15 +01:00
Grégoire Paris
4163efd2f2 Merge pull request #11813 from VincentLanglet/queryType
[RFC] Expose QueryBuilder::getType
2025-01-29 11:54:45 +01:00
Vincent Langlet
d7ac6123ad Expose QueryType 2025-01-29 09:27:44 +01:00
Grégoire Paris
aff82af7de Merge pull request #11811 from greg0ire/quoteIdentifier-depr
Address quoteIdentifier() deprecation
2025-01-28 23:17:29 +01:00
Simon Podlipsky
bd260d1be8 feat: allow setting foreign key as deferrable 2025-01-26 13:06:55 +01:00
Grégoire Paris
aa141bf001 Address quoteIdentifier() deprecation
We should be using quoteSingleIdentifier(), assuming we only ever pass
single identifiers here.

See https://github.com/doctrine/dbal/pull/6590
2025-01-26 12:01:14 +01:00
Grégoire Paris
cd1a52c7e4 Merge pull request #11808 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2025-01-25 11:29:59 +01:00
Grégoire Paris
cf39e00553 Merge pull request #11807 from greg0ire/display-deprecations
Display Doctrine deprecations when running PHPUnit
2025-01-25 11:09:40 +01:00
Grégoire Paris
27b47841be Display Doctrine deprecations when running PHPUnit
This will give a signal that there is work to be done without blocking
other contributions by failing the build.
2025-01-25 10:53:36 +01:00
Grégoire Paris
5a599233c9 Merge pull request #11791 from jonnyeom/patch-2
UPGRADE: Document QueryBuilder::setParameters() Type enforcement
2025-01-17 07:55:07 +01:00
Jonny Eom
596da353c2 UPGRADE: Document QueryBuilder::setParameters() Type enforcement 2025-01-16 17:14:20 +01:00
Alexander M. Turek
0d2cb6acd1 Fix CS (#11782) 2025-01-07 09:53:43 +01:00
Alexander M. Turek
327418a4b7 Merge branch '3.3.x' into 3.4.x
* 3.3.x:
  Update working-with-objects.rst (#7553)
  changed confusing negative wording (#11775)
2025-01-06 20:51:29 +01:00
Jamie Purchase
68c87740aa Update working-with-objects.rst (#7553)
Spelling.
2025-01-02 00:25:25 +01:00
Florian Sylvain
55dc02c39f changed confusing negative wording (#11775) 2024-12-31 00:09:28 +01:00
Grégoire Paris
9f2b367081 Merge pull request #11776 from curry684/issue-9558
Respect referencedColumnName defaults in custom naming strategies
2024-12-25 00:20:07 +01:00
Niels Keurentjes
a9873c86bb Take hardcoded reference column name out of JoinColumn attribute
Previously, when using a custom naming strategy, explicitly declaring a JoinColumn required specifying the referencedColumnName always as it would default to id no matter the naming strategy. This PR changes it to be determines correctly.

Ref #9558
2024-12-23 19:44:56 +01:00
Grégoire Paris
8ebd98ee92 Merge pull request #11773 from doctrine/3.3.x-merge-up-into-3.4.x_xx7XyUCl
Merge release 3.3.1 into 3.4.x
2024-12-19 08:27:07 +01:00
Grégoire Paris
b1f8253105 Merge pull request #11772 from doctrine/2.20.x
Merge 2.20.x up into 3.3.x
2024-12-19 08:08:14 +01:00
Claudio Zizza
7b9c0d91f6 Create website schema validation workflow (#11763) 2024-12-12 23:43:08 +01:00
Benjamin Eberlei
5a220078e9 Update PR with PHP Stan by fixing some and baselining other violations. 2024-12-08 21:11:41 +01:00
Grégoire Paris
a15543a2ce Merge pull request #11761 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2024-12-08 13:02:05 +01:00
Benjamin Eberlei
238fb74028 Add RawValuePropertyAccessor to see how it will look in 8.4, pre support for lazy objects. 2024-12-08 13:00:10 +01:00
Benjamin Eberlei
6ff2b130d3 Add comment to PropertyAccessor interface 2024-12-08 13:00:10 +01:00
Benjamin Eberlei
8c9bfca255 Fix wrong type, phpstan failure. 2024-12-08 13:00:10 +01:00
Benjamin Eberlei
c2a2386df9 suppress phpcs that cant be done 2024-12-08 13:00:10 +01:00
Benjamin Eberlei
2f98e11562 Remove last use of reflFields in core. 2024-12-08 13:00:10 +01:00
Benjamin Eberlei
073809cf5c Fixup EnumPropertyAccessor::toEnum 2024-12-08 13:00:10 +01:00
Benjamin Eberlei
e82690d256 More psalm to fix the errors. 2024-12-08 13:00:07 +01:00
Benjamin Eberlei
23c31aec51 Static analysis. 2024-12-08 12:57:19 +01:00
Benjamin Eberlei
622ba2dcc7 Mark all PropertyAccessor classes @internal. 2024-12-08 12:56:39 +01:00
Benjamin Eberlei
0c1cf853fc Address PHPStan issues. 2024-12-08 12:56:38 +01:00
Benjamin Eberlei
79d1f07fa2 Deprecate access to ClassMetadata::$reflFields. 2024-12-08 12:56:38 +01:00
Benjamin Eberlei
eba01f8d0e Style, missing getReflectionProperties()Property() that were renamed. 2024-12-08 12:56:38 +01:00
Benjamin Eberlei
bd292481bd Adjust test. 2024-12-08 12:56:38 +01:00
Benjamin Eberlei
fcc53b260f Use ClassMetadata::$propertyAccessors in all places. 2024-12-08 12:56:34 +01:00
Benjamin Eberlei
7d61a1e73f Fixes in LegacyReflectionFields. 2024-12-08 12:56:08 +01:00
Benjamin Eberlei
b3cffe2d12 Introduce LegacyReflectionFields abstraction, deriving from propertyAccessors at runtime. 2024-12-08 12:56:06 +01:00
Grégoire Paris
46c94e3729 Merge pull request #11760 from greg0ire/fix-merge-up
Run SA checks with PHP 8.4
2024-12-08 12:55:58 +01:00
Benjamin Eberlei
052c7d7698 Add all necessary accessors, adapting doctrine/persistence and ORM internal reflection properties. no tests. 2024-12-08 12:55:14 +01:00
Benjamin Eberlei
c2713adebc property hooks. 2024-12-08 12:55:10 +01:00
Grégoire Paris
4e01567816 Run tests with PHP 8.4
This change was accidentally dropped during a merge up.
2024-12-08 12:47:41 +01:00
Grégoire Paris
51a984be3d Merge pull request #11758 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2024-12-08 12:42:02 +01:00
Grégoire Paris
f7f3104451 Merge pull request #11755 from greg0ire/3.3.x
Merge 2.20.x up into 3.3.x
2024-12-08 12:16:15 +01:00
Grégoire Paris
417444d4b5 Merge remote-tracking branch 'origin/2.20.x' into 3.3.x 2024-12-07 22:31:38 +01:00
Grégoire Paris
360b80afab Merge remote-tracking branch 'origin/2.20.x' into 3.3.x 2024-12-07 16:17:12 +01:00
Grégoire Paris
6007154484 Merge pull request #11746 from greg0ire/3.4.x
Merge 2.21.x up into 3.4.x
2024-12-04 07:52:51 +01:00
Grégoire Paris
22ce0aff37 Merge remote-tracking branch 'origin/2.21.x' into 3.4.x 2024-12-03 23:44:05 +01:00
Grégoire Paris
5d73458f0b Merge pull request #11745 from greg0ire/3.4.x
Merge 3.3.x up into 3.4.x
2024-12-03 23:43:43 +01:00
Grégoire Paris
6c70d11f4e Merge remote-tracking branch 'origin/3.3.x' into 3.4.x 2024-12-03 23:04:46 +01:00
Grégoire Paris
0a635c1ece Merge pull request #11740 from doctrine/2.20.x
Merge 2.20.x up into 3.3.x
2024-11-28 08:53:49 +01:00
Grégoire Paris
69a4199434 Merge pull request #11738 from greg0ire/3.3.x
Merge 2.20.x up into 3.3.x
2024-11-28 07:54:42 +01:00
Grégoire Paris
cbda7e2322 Merge remote-tracking branch 'origin/2.20.x' into 3.3.x 2024-11-27 22:27:07 +01:00
Grégoire Paris
50d7a0f95e Merge pull request #11727 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2024-11-23 22:01:13 +01:00
Grégoire Paris
d7f13a82ef Merge pull request #11726 from greg0ire/use-properties-minor
Use properties over array keys
2024-11-23 21:41:29 +01:00
Grégoire Paris
9e1038075e Merge pull request #11725 from greg0ire/use-properties
Use properties over array keys
2024-11-23 21:28:02 +01:00
Grégoire Paris
dd3604f523 Use properties over array keys
Using array access is deprecated.
2024-11-23 21:06:56 +01:00
Grégoire Paris
65e9f607e5 Use properties over array keys
Using array access is deprecated.
2024-11-23 21:05:10 +01:00
Grégoire Paris
a42134ccee Merge pull request #11724 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2024-11-23 20:43:44 +01:00
Grégoire Paris
71e038c81d Merge pull request #11723 from greg0ire/3.3.x
Merge 2.20.x up into 3.3.x
2024-11-23 19:56:58 +01:00
Grégoire Paris
2ff998da0e Merge remote-tracking branch 'origin/2.20.x' into 3.3.x 2024-11-23 19:31:41 +01:00
Grégoire Paris
5013d5dbef Merge pull request #9760 from beberlei/GH-3519-UniqueDiscriminatorValues
[GH-3519] Deprecate passing the same class with different discriminator values.
2024-11-18 12:18:06 +01:00
Benjamin Eberlei
da51234d5a [GH-3519] Deprecate passing the same class with different discriminator values. 2024-11-14 08:34:48 +01:00
Mohamed Attia
4b03ec7789 Refine Explanations of Doctrine orm Package Structure (#11710)
* Update architecture.rst

* Update architecture.rst
2024-11-12 00:02:38 +01:00
Grégoire Paris
f41dc4a503 Merge pull request #11533 from greg0ire/persistence-4-compat
Implement compatibility with Persistence 4
2024-11-04 12:30:26 +01:00
Grégoire Paris
81c0d599c9 Implement compatibility with Persistence 4 2024-11-04 12:15:30 +01:00
Grégoire Paris
44fa8bbde8 Merge pull request #11344 from d-ph/patch-2
Change the lock mode in the "Aggregate Fields" cookbook (aggregate-fields.rst) article.
2024-10-24 08:55:49 +02:00
Grégoire Paris
05f54860f7 Merge pull request #11549 from doctrine/feature/allow-overriding-cascade
Allow overriding association's cascade
2024-10-22 19:51:34 +02:00
Jan Nedbal
021a9cce3d UPGRADE: mention SqlWalker deprecations in 3.3 (#11693) 2024-10-22 15:54:18 +02:00
Grégoire Paris
0f11a97c8e Merge pull request #11035 from kbond/feat/lazy-first
Make `PersistentCollection::first()` "extra" lazy
2024-10-21 11:28:22 +02:00
Kevin Bond
c9253ef64b feat: make PersistentCollection::first() "extra" lazy 2024-10-20 19:24:21 -04:00
Grégoire Paris
af54a1696c Merge pull request #11692 from greg0ire/inherit-issue-templates
Remove config.yml
2024-10-20 12:16:44 +02:00
Grégoire Paris
4d821cb139 Remove config.yml
It causes the template inheritance to fail.
2024-10-20 12:15:32 +02:00
Grégoire Paris
85fc95060f Merge pull request #11691 from greg0ire/inherit-issue-templates
Inherit issue templates
2024-10-20 12:15:05 +02:00
Grégoire Paris
039b03255a Inherit issue templates 2024-10-20 11:58:56 +02:00
Benjamin Eberlei
e7efdede15 Update README.md 2024-10-18 09:13:20 +02:00
Grégoire Paris
74155c8672 Merge pull request #11688 from doctrine/3.3.x
Merge 3.3.x up into 3.4.x
2024-10-16 23:44:13 +02:00
Grégoire Paris
9c0e62ad44 Merge pull request #11686 from greg0ire/3.3.x
Merge 2.20.x up into 3.3.x
2024-10-16 23:16:09 +02:00
Grégoire Paris
94702d14b9 Merge remote-tracking branch 'origin/2.20.x' into 3.3.x 2024-10-16 23:02:36 +02:00
Grégoire Paris
5aad44cff6 Merge pull request #11685 from greg0ire/fix-merge-up
Remove YAML doc example
2024-10-16 23:00:52 +02:00
Grégoire Paris
0893d8511e Remove YAML doc example
It was wrongly added during a merge up
2024-10-16 22:58:27 +02:00
Alexander M. Turek
fac0899ef7 Tell dependabot to target 2.20.x (#11681) 2024-10-14 09:52:23 +02:00
Alexander M. Turek
d5c400e8d1 Remove annotations example 2024-10-14 09:32:55 +02:00
Alexander M. Turek
6648d68ddf Merge branch '2.20.x' into 3.3.x
* 2.20.x:
  Bump doctrine/.github from 5.1.0 to 5.2.0 (#11680)
  Psalm 5.26.1 (#11677)
  Update README (#11673)
  Fix PHPUnit deprecations
  Bump doctrine/.github from 5.1.0 to 5.2.0 (#11671)
  Experiment with literalinclude
2024-10-14 09:31:18 +02:00
Grégoire Paris
6dae89ce0d Merge pull request #11678 from derrabus/improvement/stale
Close stale pull requests
2024-10-14 08:14:36 +02:00
Alexander M. Turek
efaba02ef5 CI: Close stale pull requests 2024-10-13 21:55:29 +02:00
Alexander M. Turek
e9f3ca2a45 Drop DBAL 2 compat code (#11674) 2024-10-13 20:48:11 +02:00
Grégoire Paris
737aee7d98 Update branch metadata (#11672)
3.3.0 was just released.
2024-10-13 20:47:57 +02:00
Grégoire Paris
69958152e6 Merge pull request #11653 from beberlei/GH-8471-RevertPartialObjects2
[GH-8471] Undeprecate PARTIAL for objects in DQL
2024-10-12 22:07:18 +02:00
Benjamin Eberlei
cf8f5f9f93 Apply suggestions from code review
Co-authored-by: Grégoire Paris <postmaster@greg0ire.fr>
2024-10-12 21:01:04 +02:00
Alexander M. Turek
60c245413d Auto-detect values for EnumType columns (#11666) 2024-10-12 17:35:44 +02:00
Benjamin Eberlei
7c9b74221f fix phpbench tests. 2024-10-12 16:31:02 +02:00
Benjamin Eberlei
c7e5605d11 Fix test 2024-10-12 15:43:46 +02:00
Benjamin Eberlei
c19afa1529 Merge 3.3.x 2024-10-12 15:42:38 +02:00
Benjamin Eberlei
516b593193 Fix phpcs 2024-10-12 15:41:31 +02:00
Benjamin Eberlei
e2b971d7c5 Merge branch '3.3.x' into GH-8471-RevertPartialObjects2 2024-10-12 15:40:18 +02:00
Grégoire Paris
19d9244a88 Merge pull request #11575 from eltharin/named_arguments
Allow named Arguments to be passed to Dto
2024-10-12 12:07:20 +02:00
Grégoire Paris
10a5a3ff73 Merge pull request #11665 from doctrine/3.2.x-merge-up-into-3.3.x_pbOwHc2w
Merge release 3.2.3 into 3.3.x
2024-10-12 11:58:33 +02:00
Benjamin Eberlei
f5fb400d0f Address review comments. 2024-10-12 02:32:15 +02:00
Grégoire Paris
a321331c89 Merge origin/2.20.x into 3.3.x (using imerge) 2024-10-11 22:11:52 +02:00
Grégoire Paris
522863116a Update branch metadata (#11663)
2.20.0 just got released
2024-10-11 20:23:33 +02:00
Benjamin Eberlei
5bfb744967 The MySQL/Maria EnumType added in DBAL 4.2 has a new known option "values". (#11657) 2024-10-11 15:29:19 +02:00
eltharin
c223b8f635 Allow named Arguments to be passed to Dto
Allow to change argument order or use variadic argument in dto constructor using new named keyword
2024-10-10 14:33:16 +02:00
Benjamin Eberlei
da7854f586 Fix imports 2024-10-10 10:41:04 +02:00
Benjamin Eberlei
5f4ecfd1d8 Fix imports 2024-10-10 10:38:33 +02:00
Alexander M. Turek
5f39343bfd Merge branch '2.20.x' into 3.3.x
* 2.20.x:
  Remove vendor prefix of PHPDoc referencing class-string (#11643)
  Deprecate the `\Doctrine\ORM\Query\Parser::setCustomOutputTreeWalker()` method (#11641)
2024-10-09 22:37:30 +02:00
Benjamin Eberlei
7ef1f0a379 Phpcs fixes 2024-10-09 22:14:01 +02:00
Alexander M. Turek
30795559dc Merge branch '2.20.x' into 3.3.x
* 2.20.x:
  Stop recommending vendor-prefixed PHPDoc (#11640)
  Let PHPStan detect deprecated usages (#11639)
  Add upgrade note about property hooks (#11636)
  Prepare PHP 8.4 support: Prevent property hooks from being used (#11628)
  Use E_ALL instead of E_ALL | E_STRICT
  Add CI job for PHP 8.4
  fix generating duplicate method stubs
2024-10-09 21:32:07 +02:00
Benjamin Eberlei
f71725575c Revert undprecate PARTIAL for objects in DQL. 2024-10-09 17:34:59 +02:00
Benjamin Eberlei
4a3c7f05bf Revert "Remove unused exception"
This reverts commit 689da1f251.
2024-10-09 17:13:58 +02:00
Alexander M. Turek
498de4c564 Merge branch '3.2.x' into 3.3.x
* 3.2.x:
  PHPStan 1.12.6 (#11635)
2024-10-09 15:06:48 +02:00
Alexander M. Turek
b44774285b Merge branch '2.19.x' into 3.2.x
* 2.19.x:
  PHPStan 1.12.6 (#11635)
2024-10-09 11:09:19 +02:00
Grégoire Paris
d2978303f0 Merge remote-tracking branch 'origin/3.2.x' into 3.3.x 2024-10-09 10:13:04 +02:00
Grégoire Paris
191a5366b1 Merge pull request #11629 from greg0ire/3.2.x
Merge 2.19.x up into 3.2.x
2024-10-08 17:57:30 +02:00
Grégoire Paris
44dddb2eee Merge remote-tracking branch 'origin/2.19.x' into 3.2.x 2024-10-08 15:37:53 +02:00
Grégoire Paris
434b7cee2a Merge pull request #11619 from eltharin/change_EBNF
add nested new in EBNF documentation
2024-10-04 18:53:50 +02:00
eltharin
7f0a181e39 add nested new in EBNF documentation 2024-10-02 09:48:08 +02:00
Grégoire Paris
93ce84fa6e Merge pull request #11614 from greg0ire/guides-as-dep
Guides as dev dependency
2024-09-29 09:23:14 +02:00
Grégoire Paris
e6961bd968 Install guides-cli as a dev requirement
It is better if contributors can check the docs by themselves.
2024-09-27 19:44:34 +02:00
Grégoire Paris
5724e6279e Merge pull request #11596 from doctrine/3.2.x
Merge 3.2.x up into 3.3.x
2024-09-05 22:03:08 +02:00
Alexander M. Turek
cfc0655a1c Fix compatibility with DBAL 4.2 (#11592) 2024-09-03 18:44:06 +02:00
Vincent Langlet
c6b2d89748 Precise EntityRepository::count (#11579) 2024-08-24 07:29:36 +02:00
Grégoire Paris
e1dc94d1c2 Merge pull request #11583 from doctrine/3.2.x-merge-up-into-3.3.x_lYlOLiIT
Merge release 3.2.2 into 3.3.x
2024-08-23 12:31:30 +02:00
Grégoire Paris
831a1eb7d2 Merge pull request #11581 from greg0ire/3.2.x
Merge 2.19.x up into 3.2.x
2024-08-23 12:03:52 +02:00
Grégoire Paris
3a82b153f3 Merge remote-tracking branch 'origin/2.19.x' into 3.2.x 2024-08-23 09:07:18 +02:00
Grégoire Paris
6f93cebe6e Merge pull request #11576 from eltharin/newnestedDto
Re: Re: Add support for using nested DTOs
2024-08-19 22:52:53 +02:00
eltharin
8c582a49d3 Add support for using nested DTOs
This feature allow use of nested new operators

Co-authored-by: Tomas Norkūnas <norkunas.tom@gmail.com>
Co-authored-by: Sergey Protko <fesors@gmail.com>
Co-authored-by: Łukasz Zakrzewski <contact@lzakrzewski.com>

Update docs/en/reference/dql-doctrine-query-language.rst

Co-authored-by: Claudio Zizza <859964+SenseException@users.noreply.github.com>
2024-08-19 22:36:10 +02:00
Grégoire Paris
5f1fe1587c Merge pull request #11557 from d-ph/feature/make-count-walker-use-count-star-query-sometimes
Make CountWalker use COUNT(*) when $distinct is explicitly set to false (#11552)
2024-08-19 22:31:49 +02:00
Grégoire Paris
205b2f5f20 Merge pull request #11550 from janedbal/patch-1
DQL custom functions: document TypedExpression
2024-08-09 22:50:14 +02:00
Jan Nedbal
3f550c19e3 DQL custom functions: document TypedExpression
Partially related to https://github.com/doctrine/orm/issues/11537

Co-authored-by: Claudio Zizza <859964+SenseException@users.noreply.github.com>
2024-08-06 09:16:45 +02:00
Marc Eichenseher
56cd688c4a Remove unused $pkColumns when gathering columns (#11560) 2024-08-02 01:01:23 +02:00
Grégoire Paris
96546caceb Merge pull request #11365 from beberlei/ReintroducePartialForArrayHydration
Reintroduce PARTIAL, but only for non-object hydration.
2024-07-24 09:28:05 +02:00
d-ph
57247ed6ca Make CountWalker use COUNT(*) when $distinct is explicitly set to false (#11552)
This change makes CountWalker use COUNT(*) instead of
COUNT(tbl.id), when the user declared that their query
does not need to use (SELECT) DISTINCT, which is
commonly the case when there are no JOINs in the query,
or when the JOINs are only *ToOne.

Research showed that COUNT(*) allows databases to use
index(-only) scans more eagerly from any of the
indexed columns, especially when the query is using
a WHERE-condition that filters on an indexed column.
2024-07-22 10:22:51 +01:00
Grégoire Paris
12817076c3 Merge pull request #11528 from norkunas/namedparams
Add `createNamedParameter` to `QueryBuilder`
2024-07-11 23:53:20 +02:00
Maciej Malarz
129553da90 Allow overriding association's cascade 2024-07-11 11:50:04 +02:00
Grégoire Paris
4c2f104d42 Merge pull request #11547 from greg0ire/3.3.x
Merge 2.20.x up into 3.3.x
2024-07-10 09:00:45 +02:00
Grégoire Paris
ef64cf7c33 Merge remote-tracking branch 'origin/2.20.x' into 3.3.x 2024-07-10 08:57:09 +02:00
Tomas
0983d3a4af Add createNamedParameter to QueryBuilder 2024-07-08 06:54:02 +03:00
Xesau
1fe1a6a048 Fix incorrect exception message for ManyToOne attribute in embeddable class (#11536)
When a ManyToOne attribute is encountered on an Embeddable class, the exception message reads "Attribute "Doctrine\ORM\Mapping\OneToMany" on embeddable [class] is not allowed.". This should be "Doctrine\ORM\Mapping\ManyToOne" on embeddable [class] is not allowed.".
2024-07-01 21:57:36 +02:00
Grégoire Paris
efe62e3f0b Merge pull request #11532 from doctrine/3.2.x-merge-up-into-3.3.x_ws8Fgk2X
Merge release 3.2.1 into 3.3.x
2024-06-27 17:57:03 +02:00
Grégoire Paris
722cea6536 Merge pull request #11525 from greg0ire/3.2.x
Merge 2.19.x up into 3.2.x
2024-06-26 23:48:58 +02:00
Grégoire Paris
ce7d93f14d Merge remote-tracking branch 'origin/2.19.x' into 3.2.x 2024-06-26 16:53:24 +02:00
Alexander M. Turek
a139a1b63c Merge branch '3.2.x' into 3.3.x
* 3.2.x:
  Fix deprecated array access usage (#11517)
  Address doctrine/persistence 3.3.3 release
  Add the propoer void return type on the __load method of proxies
  Remove unneeded CS rule
2024-06-21 13:32:17 +02:00
Alexander M. Turek
1153b9468c Fix deprecated array access usage (#11517) 2024-06-21 13:31:45 +02:00
Grégoire Paris
428032ca7c Merge remote-tracking branch 'origin/2.19.x' into HEAD 2024-06-20 22:18:24 +02:00
Grégoire Paris
f666aa641e Merge pull request #11512 from greg0ire/deprecate-db-driver
Deprecate DatabaseDriver
2024-06-20 21:31:58 +02:00
Grégoire Paris
ca3319c2f6 Merge pull request #11511 from doctrine/stof-patch-1
Add the proper void return type on the __load method of proxies
2024-06-20 11:46:52 +02:00
Christophe Coevoet
c06f6b9376 Add the propoer void return type on the __load method of proxies
When using ghost objects, the method was leaking a `static` return type due to the way it was implemented, which is incompatible with the native return type that will be added in doctrine/persistence v4.
2024-06-20 09:08:10 +02:00
Grégoire Paris
ed53defaa1 Deprecate DatabaseDriver
It was used for the reverse engineering feature, which has been removed.
2024-06-19 21:59:29 +02:00
Alexander M. Turek
41cb5fbbbf Merge branch '2.19.x' into 3.2.x
* 2.19.x:
  Fix OneToManyPersister::deleteEntityCollection missing discriminator column/value. (GH-11500)
  Skip joined entity creation for empty relation (#10889)
  ci: maintained and stable mariadb version (11.4 current lts) (#11490)
  fix(docs): use string value in `addAttribute`
  Replace assertion with exception (#11489)
  Use ramsey/composer-install in PHPBench workflow
  update EntityManager#transactional to EntityManager#wrapInTransaction
  Fix cloning entities
  Consider usage of setFetchMode when checking for simultaneous usage of fetch-mode EAGER and WITH condition.
2024-06-19 12:21:35 +02:00
Grégoire Paris
9d4f54b9a4 Update branch metadata (#11474) 2024-05-24 00:25:01 +02:00
Grégoire Paris
37946d3a21 Merge pull request #11472 from nicolas-grekas/no-readonly
Remove readonly modifier from EntityManager
2024-05-23 16:27:52 +02:00
Nicolas Grekas
baf96cdad4 Remove readonly modifier from EntityManager 2024-05-23 14:33:01 +02:00
Alexander M. Turek
ce09c96427 Deprecate the NotSupported exception (#11470) 2024-05-22 21:53:12 +02:00
Alexander M. Turek
ae659fe650 Deprecate SequenceGenerator implementing Serializable (#11468) 2024-05-22 10:48:46 +02:00
Alexander M. Turek
0a177d5074 Merge branch '3.1.x' into 3.2.x
* 3.1.x:
  Psalm 5.24.0 (#11467)
  PHPStan 1.11.1 (#11466)
2024-05-21 14:24:54 +02:00
Alexander M. Turek
dbfe47b07b Merge branch '2.19.x' into 3.1.x
* 2.19.x:
  Psalm 5.24.0 (#11467)
  PHPStan 1.11.1 (#11466)
2024-05-21 14:24:20 +02:00
Alexander M. Turek
22b1f52c1c Merge branch '3.1.x' into 3.2.x
* 3.1.x:
  Fix failed merge (#11464)
  Test with actual lock modes (#11465)
  Backport test for Query::setLockMode() (#11463)
  Fix return type of Query::getLockMode() (#11462)
2024-05-21 14:04:38 +02:00
Alexander M. Turek
a90ee5c495 Merge branch '2.19.x' into 3.1.x
* 2.19.x:
  Test with actual lock modes (#11465)
  Backport test for Query::setLockMode() (#11463)
2024-05-21 12:52:03 +02:00
Alexander M. Turek
11270425e5 Fix failed merge (#11464) 2024-05-21 12:30:56 +02:00
Alexander M. Turek
f1246d57c2 Fix return type of Query::getLockMode() (#11462)
… for DBAL 4
2024-05-21 12:30:01 +02:00
Alexander M. Turek
a14ef7c279 Merge branch '3.1.x' into 3.2.x
* 3.1.x:
  Using an integer as discriminator value with ORM v3
  Using an integer as discriminator value with ORM v3
  Bump ramsey/composer-install from 2 to 3 (#11442)
  Use ramsey/composer-install in PHPBench workflow (#11444)
  Bump doctrine/.github from 3.0.0 to 5.0.1
  Upgrade codecov/codecov-action
  Setup Dependabot
2024-05-21 08:42:44 +02:00
Alexander M. Turek
54c29140fa Merge branch '2.19.x' into 3.1.x
* 2.19.x:
  Bump ramsey/composer-install from 2 to 3 (#11442)
  Bump doctrine/.github from 3.0.0 to 5.0.1
  Upgrade codecov/codecov-action
2024-05-21 08:42:11 +02:00
Grégoire Paris
daa99f197b Merge pull request #11456 from prohalexey/IntegerDescriminatorInInstanceOf
Using an integer as discriminator value with ORM v3
2024-05-17 08:19:34 +02:00
Alexey Prohorov
2b04cc2e3f Using an integer as discriminator value with ORM v3
This fixes a bug that occurred when configuring integers as discriminator values and using DQL instanceOf function in the queries. Doctrine throws a type error whenever the application generates these queries.
2024-05-16 11:53:29 +03:00
Grégoire Paris
3d9af3187f Merge pull request #11425 from prohalexey/FixForIntegerDescriminatorValue
Discriminator value could be an integer
2024-05-15 11:31:09 +02:00
Alexey Prohorov
e83d8a80ba Using an integer as discriminator value with ORM v3
This fixes a bug that occurred when configuring integers as discriminator values. Doctrine throws a type error whenever the application generates queries.
2024-05-15 10:42:04 +03:00
Grégoire Paris
029ca611f0 Use ramsey/composer-install in PHPBench workflow (#11444)
It will handle caching for us.
2024-05-05 23:38:41 +02:00
Grégoire Paris
9e7715f678 Merge pull request #11439 from greg0ire/setup-dependabot
Setup Dependabot
2024-05-05 23:16:51 +02:00
Grégoire Paris
0e26e3ed50 Setup Dependabot
Targeting 2.19.x, since we want the updates to bubble up. Since
Dependabot has had no effect on doctrine/dbal yet, I suppose that means
that "dependabot.yml" must be present on the default branch.
2024-05-05 22:41:40 +02:00
Grégoire Paris
63315c8e4a Merge pull request #11434 from doctrine/3.1.x-merge-up-into-3.2.x_sjLAVzN7
Merge release 3.1.3 into 3.2.x
2024-04-30 09:57:38 +02:00
Grégoire Paris
8ca99fdfdc Merge pull request #11433 from greg0ire/3.1.x
Merge 3.0.x up into 3.1.x
2024-04-30 09:14:13 +02:00
Grégoire Paris
2d8e466636 Merge remote-tracking branch 'origin/2.19.x' into 3.1.x 2024-04-30 09:00:59 +02:00
Alexander M. Turek
97634ae6a1 Merge branch '3.1.x' into 3.2.x
* 3.1.x:
  Revert "Merge pull request #11399 from ThomasLandauer/issue-11377" (#11415)
  Fix BIGINT validation (#11414)
  docs: update PHP version in doc
  Fix fromMappingArray definition
  Fix templated phpdoc return type (#11407)
  [Documentation] Merging "Query Result Formats" with "Hydration Modes"
  SchemaValidator: Changing mapping of BIGINT to string|int
  Fix psalm errors: remove override of template type
  Update dql-doctrine-query-language.rst
  Adding `NonUniqueResultException`
  [Documentation] Query Result Formats
2024-04-15 16:31:08 +02:00
Alexander M. Turek
f79d166a4e Merge branch '2.19.x' into 3.1.x
* 2.19.x:
  Fix BIGINT validation (#11414)
  Fix templated phpdoc return type (#11407)
  [Documentation] Merging "Query Result Formats" with "Hydration Modes"
  Fix psalm errors: remove override of template type
  Update dql-doctrine-query-language.rst
  Adding `NonUniqueResultException`
  [Documentation] Query Result Formats
2024-04-15 16:20:40 +02:00
Alexander M. Turek
9c22814cfa Revert "Merge pull request #11399 from ThomasLandauer/issue-11377" (#11415)
This reverts commit cbb6c897de, reversing
changes made to 9c56071392.
2024-04-15 16:03:33 +02:00
Grégoire Paris
e0e55dc9c5 Merge pull request #11413 from Nayte91/doc/php-version
docs: update PHP version in doc
2024-04-15 14:32:58 +02:00
Nayte
010b1e0886 docs: update PHP version in doc 2024-04-15 09:46:56 +02:00
Grégoire Paris
93eb8a1bcb Merge pull request #11408 from VincentLanglet/fix/fromMappingArray
Fix fromMappingArray definition
2024-04-04 00:20:16 +02:00
Vincent Langlet
1464827220 Fix fromMappingArray definition 2024-04-03 19:54:16 +02:00
Grégoire Paris
cbb6c897de Merge pull request #11399 from ThomasLandauer/issue-11377
SchemaValidator: Changing mapping of BIGINT to string|int
2024-03-28 21:37:07 +01:00
Thomas Landauer
753bc16c0b SchemaValidator: Changing mapping of BIGINT to string|int 2024-03-23 14:49:02 +01:00
Alexander M. Turek
4672d284ff Merge branch '3.1.x' into 3.2.x
* 3.1.x:
  Adjust PHPBench mocks
  Set column length explicitly (#11393)
  Add missing import
  Remove unused variable (#11391)
  Fixed proxy initialization for EnumReflectionProperty
  Remove older versions from the docs (#11383)
  [Documentation] Removing "Doctrine Mapping Types" ... (#11384)
  [GH-11185] Bugfix: do not use collection batch loading for indexBy assocations. (#11380)
  Improve lazy ghost performance by avoiding self-referencing closure. (#11376)
  Remove outdated git metadata files (#11362)
  Switch join columns around, otherwise index doesnt match
  Key on fk
  Fix entities and mapping.
  Minor code style fix in AbstractRemoteControl
  Do not schedule batch loading for target classes with composite identifier.
  Cleanup tests not to use model sets.
  provides a test case for github issue 11154
2024-03-21 14:44:21 +01:00
Alexander M. Turek
9c56071392 Adjust PHPBench mocks 2024-03-21 12:37:52 +01:00
Alexander M. Turek
0a1988b349 Merge branch '2.19.x' into 3.1.x
* 2.19.x:
  Set column length explicitly (#11393)
  Add missing import
  Remove unused variable (#11391)
  [Documentation] Removing "Doctrine Mapping Types" ... (#11384)
  [GH-11185] Bugfix: do not use collection batch loading for indexBy assocations. (#11380)
  Improve lazy ghost performance by avoiding self-referencing closure. (#11376)
2024-03-21 12:05:05 +01:00
Grégoire Paris
4175edf311 Merge pull request #11387 from valkars/enum-reflection
Fixed proxy initialization for EnumReflectionProperty
2024-03-21 10:20:42 +01:00
Valentin Karnauhov
67ac5a82da Fixed proxy initialization for EnumReflectionProperty 2024-03-21 10:54:26 +02:00
Claudio Zizza
e384978e0b Remove older versions from the docs (#11383)
To reduce Algolia operations and indexes older versions get removed
2024-03-20 23:35:25 +01:00
Grégoire Paris
55c4845d57 Merge pull request #11379 from greg0ire/3.1.x
Merge 2.19.x up into 3.1.x
2024-03-18 21:07:12 +01:00
Grégoire Paris
a38f473a92 Merge remote-tracking branch 'origin/2.19.x' into 3.1.x 2024-03-18 20:57:55 +01:00
Grégoire Paris
69f51cc794 Merge pull request #11371 from doctrine/3.1.x
Merge 3.1.x up into 3.2.x
2024-03-17 10:43:23 +01:00
Grégoire Paris
7178b9d6b7 Merge pull request #11370 from greg0ire/forgotten-array-access
Avoid another occurrence of ArrayAccess
2024-03-17 10:42:16 +01:00
Grégoire Paris
8a14eee67a Avoid another occurrence of ArrayAccess 2024-03-17 09:38:54 +01:00
Grégoire Paris
f9331ee2b9 Merge pull request #11369 from doctrine/3.1.x
Merge 3.1.x up into 3.2.x
2024-03-17 09:34:02 +01:00
Grégoire Paris
c5315f86fb Merge pull request #11368 from greg0ire/address-deprecation
Avoid array access
2024-03-17 09:02:38 +01:00
Grégoire Paris
5820bb8f49 Avoid array access
It is deprecated.
2024-03-16 23:37:00 +01:00
Benjamin Eberlei
80278c545e Update docs/en/reference/partial-hydration.rst
Co-authored-by: Grégoire Paris <postmaster@greg0ire.fr>
2024-03-16 23:36:13 +01:00
Grégoire Paris
cb05f1aadf Merge pull request #11357 from DaDeather/11351-add-deprecation-for-obsolete-indexes-and-unique-constraint-properties-of-table-attribute
Deprecate obsolete and unnecessary properties from Table attribute (#11351)
2024-03-16 23:24:55 +01:00
Grégoire Paris
ab616f1a1d Merge pull request #11364 from doctrine/3.1.x
Merge 3.1.x up into 3.2.x
2024-03-16 23:24:34 +01:00
Benjamin Eberlei
90962f060a Use id dynamically in array hydration test. 2024-03-16 22:39:38 +01:00
Benjamin Eberlei
758f0d7605 Remove Query::HINT_FORCE_PARTIAL_LOAD constant, not needed to be reintroduced. 2024-03-16 22:36:21 +01:00
Benjamin Eberlei
eb8510ff5c Add tests for adjusted functionality. 2024-03-16 22:34:54 +01:00
Benjamin Eberlei
d5fdd676f4 Reintroduce PARTIAL, but only for non-object hydration. 2024-03-16 22:20:34 +01:00
Grégoire Paris
b0d07ffaba Merge pull request #11363 from greg0ire/3.1.x
Merge 2.19.x up into 3.1.x
2024-03-16 21:48:21 +01:00
Grégoire Paris
196d3a6996 Merge remote-tracking branch 'origin/2.19.x' into 3.1.x 2024-03-16 21:38:16 +01:00
Ismail Özgün Turan
7d1444e5b6 Deprecate obsolete and unnecessary properties from Table attribute (#11351)
The properties `indexes` and `uniqueConstraints` were used by the
`AnnotationDriver` but were never implemented for the `AttributeDriver`.
Since the `AnnotationDriver` doesn't exist anymore these can become
deprecated and will then be removed afterwards.
2024-03-15 12:23:03 +01:00
Grégoire Paris
25d5936337 Merge pull request #11354 from greg0ire/depr--complete
Deprecate --complete option of orm:schema-tool:update
2024-03-15 07:42:35 +01:00
Grégoire Paris
68f9bf5dfa Deprecate --complete option of orm:schema-tool:update
It achieves nothing anymore.
2024-03-14 13:14:55 +01:00
d-ph
0a49274f9b Update aggregate-fields.rst
Change `PESSIMISTIC_READ` to `PESSIMISTIC_WRITE`. Otherwise, the solution to the race condition at the bottom of the article would allow concurrent reads, which would not solve the presented race condition problem.
2024-03-08 09:36:42 +00:00
Alexander M. Turek
716fc97b70 Merge branch '2.19.x' into 3.1.x
* 2.19.x:
  Prepare releases 2.19 and 3.1 (#11335)
2024-03-03 18:45:20 +01:00
Alexander M. Turek
4617a5e310 Merge branch '2.19.x' into 3.1.x
* 2.19.x:
2024-03-03 18:03:42 +01:00
Alexander M. Turek
e77c5a3a5e Merge branch '3.0.x' into 3.1.x
* 3.0.x:
  Fix annotation
  Bump CI workflows (#11336)
  Fix SchemaTool::getSchemaFromMetadata() uniqueConstraint without a predefined name (#11314)
2024-03-03 18:03:17 +01:00
Alexander M. Turek
c3cc0fdd8c Merge branch '2.18.x' into 3.0.x
* 2.18.x:
  Fix annotation
  Bump CI workflows (#11336)
  Fix SchemaTool::getSchemaFromMetadata() uniqueConstraint without a predefined name (#11314)
2024-03-03 17:13:16 +01:00
Alexander M. Turek
507c73c073 Merge branch '2.19.x' into 3.1.x
* 2.19.x:
  Refator array_map into simple loop for performance. (#11332)
2024-03-03 14:21:12 +01:00
Grégoire Paris
ba0ea8953b Use class from persistence package (#11330)
* Use class from persistence package

It is meant to remove duplication between the ORM and the ODM.

* Update UPGRADE.md

Co-authored-by: Steve Todd <stodd@mashbo.com>

---------

Co-authored-by: Alexander M. Turek <me@derrabus.de>
Co-authored-by: Steve Todd <stodd@mashbo.com>
2024-03-03 13:08:37 +01:00
Alexander M. Turek
53763d432b Merge branch '2.19.x' into 3.1.x
* 2.19.x:
2024-03-01 10:57:47 +01:00
Alexander M. Turek
154920a0b3 Merge branch '3.0.x' into 3.1.x
* 3.0.x:
  Psalm 5.22.2 (#11326)
2024-03-01 10:56:28 +01:00
Alexander M. Turek
b8d0a85017 Merge branch '2.18.x' into 3.0.x
* 2.18.x:
  Psalm 5.22.2 (#11326)
2024-03-01 10:51:50 +01:00
Alexander M. Turek
cb497826be Bump Doctrine Collections to 2.2 (#11325) 2024-03-01 09:27:30 +01:00
Alexander M. Turek
ba0d3842a9 Merge branch '3.0.x' into 3.1.x
* 3.0.x:
  Use enum_exists() for enums
2024-03-01 08:56:20 +01:00
Alexander M. Turek
bf49055a1f Use enum_exists() for enums 2024-03-01 08:56:07 +01:00
Alexander M. Turek
29e1935c65 Merge branch '3.0.x' into 3.1.x
* 3.0.x:
  Remove PHP 7 workarounds (#11324)
2024-03-01 08:51:50 +01:00
Alexander M. Turek
694413a888 Remove PHP 7 workarounds (#11324) 2024-03-01 08:51:21 +01:00
Alexander M. Turek
33e02b2796 Merge branch '2.19.x' into 3.1.x
* 2.19.x:
2024-02-29 17:17:59 +01:00
Alexander M. Turek
26f7588479 Merge branch '3.0.x' into 3.1.x
* 3.0.x:
  PHPStan 1.10.59 (#11320)
  Address deprecations from Collection 2.2 (#11315)
  Fix sql walker phpdoc
2024-02-29 17:17:42 +01:00
Alexander M. Turek
20a6efdff6 Merge branch '2.18.x' into 3.0.x
* 2.18.x:
  PHPStan 1.10.59 (#11320)
2024-02-29 16:52:42 +01:00
Grégoire Paris
95da667862 Merge remote-tracking branch 'origin/2.18.x' into 3.0.x 2024-02-28 22:57:35 +01:00
Grégoire Paris
c02ddd692f Merge pull request #11312 from greg0ire/3.1.x
Merge 3.0.x up into 3.1.x
2024-02-26 20:53:44 +01:00
Grégoire Paris
151a3fba9d Merge remote-tracking branch 'origin/3.0.x' into 3.1.x 2024-02-26 20:39:59 +01:00
Grégoire Paris
b187bc8588 Merge pull request #11308 from greg0ire/throw-instead-of-assert
Throw a full-fledged exception on invalid call
2024-02-26 20:38:49 +01:00
Grégoire Paris
1e056842fe Merge pull request #11310 from greg0ire/3.1.x
Merge 2.19.x up into 3.1.x
2024-02-26 20:38:36 +01:00
Grégoire Paris
ebb0c67ecc Merge remote-tracking branch 'origin/2.19.x' into 3.1.x 2024-02-26 08:48:34 +01:00
Grégoire Paris
3f7a3333ad Throw a full-fledged exception on invalid call
In 2.x, getAssociationMappedByTargetField() used to return null when
called with the owning side of an association.
That was undocumented and wrong because the phpdoc advertises a string
as a return type.

In 6ce0cf4a3d, I wrongly assumed that
nobody would be calling this method with the owning side of an
association.

Let us throw a full fledged exception and advertise the proper way of
avoiding this situation.

Closes #11250
2024-02-25 21:49:03 +01:00
Grégoire Paris
2a8802af12 Merge pull request #11305 from doctrine/typo
Remove extra word
2024-02-25 13:20:55 +01:00
Grégoire Paris
9cc11d2541 Remove extra word 2024-02-25 11:20:44 +01:00
Grégoire Paris
ee5b2ce5b0 Merge pull request #11294 from greg0ire/sa-fqcn
Translate comment into code and annotations
2024-02-25 10:01:27 +01:00
Grégoire Paris
d54c9678d0 Deprecate passing null to ClassMetadata::fullyQualifiedClassName()
It can easily be avoided by the only caller.
2024-02-25 09:31:02 +01:00
Grégoire Paris
859e6af972 Translate comment into code and annotations
The phpdoc comment for the return type of
ClassMetadata::fullyQualifiedClassName() says that the return type will
be null if the input value is null. I have made it more precise by
using "if and only if", made the null check more strict and translated
that into template annotations. Also, since we say we return a
class-string, I've asserted that.
2024-02-24 22:13:13 +01:00
Grégoire Paris
8c3c9f115d Merge pull request #11303 from doctrine/3.0.x
Merge 3.0.x up into 3.1.x
2024-02-24 21:21:41 +01:00
Grégoire Paris
3907872046 Merge pull request #11302 from greg0ire/3.0.x
Merge 2.18.x up into 3.0.x
2024-02-24 21:03:34 +01:00
Grégoire Paris
54cd70002c Merge remote-tracking branch 'origin/2.18.x' into 3.0.x 2024-02-24 20:47:36 +01:00
Alexander M. Turek
2df4d75565 Merge branch '3.0.x' into 3.1.x
* 3.0.x:
  Test different ways of settings query parameters
  Be less restrictive in DiscriminatorColumnMapping phpdoc (#11226)
  Allow (Array)ParameterType in QueryBuilder
2024-02-22 13:26:11 +01:00
Alexander M. Turek
dc21ab63ac Merge branch '2.19.x' into 3.1.x
* 2.19.x:
  Backport QueryParameterTest (#11288)
2024-02-22 13:25:30 +01:00
Alexander M. Turek
2a250b5814 Merge branch '2.18.x' into 3.0.x
* 2.18.x:
  Backport QueryParameterTest (#11288)
2024-02-22 13:23:53 +01:00
Alexander M. Turek
44fa5d340a Merge pull request #11287 from derrabus/bugfix/parameter-types
Allow (Array)ParameterType in QueryBuilder
2024-02-22 09:31:34 +01:00
Alexander M. Turek
708146bbbc Test different ways of settings query parameters 2024-02-22 09:19:39 +01:00
Vincent Langlet
a5bf9bb96a Be less restrictive in DiscriminatorColumnMapping phpdoc (#11226)
* Be less restrictive in params

* Allow null options

* Simplify expression

* Fix ci

* Add support for null
2024-02-22 09:12:39 +01:00
Hanish Singla
3eace16e85 Allow (Array)ParameterType in QueryBuilder 2024-02-22 00:01:05 +01:00
Grégoire Paris
e4c27092cd Merge pull request #11276 from greg0ire/no-cast-filelock
Remove implicit casts in FileLock.php
2024-02-21 22:59:47 +01:00
Grégoire Paris
adadf1fb90 Do not implicitly cast glob's return type
The comment above mentions that on some platforms, it might return
false, and this is why there is a check in the first place. Let us do
exactly what is mentioned in the comment.
2024-02-21 22:36:01 +01:00
Grégoire Paris
380b5b62ef Do not cast file_put_contents's return type
If $lock->value was an empty string, this would fix a bug, but it never
is, it is a uniqid-generated string.
2024-02-21 22:35:38 +01:00
Grégoire Paris
a0e7a59572 Do not implicitly cast getLockTime()'s return type
This fixes a bug for files last modified on 1970-01-01 00:00:00, so… not
worth backporting IMO.
2024-02-21 22:35:38 +01:00
Grégoire Paris
fb6c0c1d8b Do not implicitly cast getLockContent()'s return value
Lock files are supposed to contain uniqid()-generated values, so they
cannot be falsy strings, but if they did, this would fix a bug.
2024-02-21 22:35:36 +01:00
Alexander M. Turek
fcf1116e33 Merge branch '3.0.x' into 3.1.x
* 3.0.x:
  Remove broken assertion from DateAddFunction and DateSubFunction (#11243)
  Remove unused trait
  [Documentation] Adding link to Postgres upgrade article (#11257)
  fix: support array-type arg in QB variadic calls (#11242)
2024-02-21 19:28:15 +01:00
Alexander M. Turek
78dc63df27 Merge branch '2.19.x' into 3.1.x
* 2.19.x:
  Fix Static Analysis folder reference (#11281)
  docs: recommend safer way to disable logging (#11269)
  Remove unused baseline entries
  Treat '0' as a legitimate trim char
  Add type field mapper documentation to the sidebar
  Mark document as orphan
  Use correction sectionauthor syntax
  Make docs valid according to guides 0.3.3 (#11252)
2024-02-21 19:28:06 +01:00
Alexander M. Turek
bc5efd4bfe Merge branch '2.18.x' into 3.0.x
* 2.18.x:
  Fix Static Analysis folder reference (#11281)
  docs: recommend safer way to disable logging (#11269)
  Remove unused baseline entries
  Treat '0' as a legitimate trim char
2024-02-21 18:54:21 +01:00
Ondřej Mirtes
b6b4cbcb93 Remove broken assertion from DateAddFunction and DateSubFunction (#11243)
* Remove wrong asserts in DATE_ADD and DATE_SUB query AST function handlers

* Require DBAL 3.8.2
2024-02-20 20:29:56 +01:00
Grégoire Paris
b1f553eba3 Merge pull request #11272 from greg0ire/sa-attach-entity-listener
Improve static analysis on AttachEntityListenersListener
2024-02-20 08:14:13 +01:00
Grégoire Paris
0c4aac5a35 Merge pull request #11275 from greg0ire/sa-inversed-by
Account for inversedBy being a non-falsy-string or null
2024-02-20 08:13:34 +01:00
Grégoire Paris
e0081b59be Account for inversedBy being a non-falsy-string or null
It is supposed to hold the name of a PHP property, and those cannot be
falsy strings.
2024-02-20 07:54:19 +01:00
Grégoire Paris
4bd574daee Improve static analysis on AttachEntityListenersListener
$listenerCallback is supposed to be a method name, so it is safe to
require it is not a falsy string.
2024-02-19 09:36:41 +01:00
Grégoire Paris
d5ba106803 Merge pull request #11268 from greg0ire/3.0.x
Merge 2.18.x up into 3.0.x
2024-02-17 21:37:33 +01:00
Grégoire Paris
f9a4adc8ab Merge remote-tracking branch 'origin/2.18.x' into 3.0.x 2024-02-17 19:59:26 +01:00
Grégoire Paris
6672aaf165 Merge pull request #11265 from greg0ire/remove-unneeded-verify-depr
Remove unused trait
2024-02-17 14:55:10 +01:00
Grégoire Paris
aa3b331cae Remove unused trait 2024-02-17 11:14:47 +01:00
Thomas Landauer
3918dcfb42 [Documentation] Adding link to Postgres upgrade article (#11257)
* [Documentation] Adding link to Postgres upgrade article

* Update UPGRADE.md

* Update UPGRADE.md
2024-02-15 22:12:57 +01:00
Alexander M. Turek
6290747bf9 Validate more variadic parameters (#11261) 2024-02-14 00:33:12 +01:00
Alexander M. Turek
b6f4220493 Throw if a variadic parameter contains unexpected named arguments (#11260) 2024-02-13 18:28:17 +01:00
Grégoire Paris
bfb033fe3c Merge pull request #11256 from greg0ire/3.0.x
Merge 2.18.x up into 3.0.x
2024-02-13 12:07:29 +01:00
Grégoire Paris
bf86155dc2 Merge remote-tracking branch 'origin/2.18.x' into 3.0.x 2024-02-13 11:29:26 +01:00
Simon Podlipsky
9acc70d5b8 fix: support array-type arg in QB variadic calls (#11242) 2024-02-09 15:23:22 +01:00
Alexander M. Turek
b7860c782b Merge branch '2.19.x' into 3.1.x
* 2.19.x:
  Remove references to deprecated constants from Lexer (#11234)
2024-02-07 15:43:24 +01:00
Alexander M. Turek
9a24ce5fad Merge branch '2.19.x' into 3.1.x
* 2.19.x:
  Add TokenType class (#11228)
2024-02-07 14:21:22 +01:00
Alexander M. Turek
9fcb8f1305 Merge branch '3.0.x' into 3.1.x
* 3.0.x:
  Revert "Merge pull request #11229 from greg0ire/add-columns"
  Add columns for 3.1.x and 4.0x
  Update version ORM from 2 to 3 in docs (#11221)
  Clean up outdated sentence (#11224)
  Update README.md
  Point link to correct upgrade guide (#11220)
  Ignore subclasses without discriminatorValue when generating discriminator column condition SQL (#11200)
  Update branches in README
2024-02-07 13:48:24 +01:00
Alexander M. Turek
5a40b99e11 Merge branch '2.18.x' into 3.0.x
* 2.18.x:
  Point link to correct upgrade guide (#11220)
  Ignore subclasses without discriminatorValue when generating discriminator column condition SQL (#11200)
  Update branches in README
2024-02-07 13:44:56 +01:00
Alexander M. Turek
94144e1227 Revert "Merge pull request #11229 from greg0ire/add-columns"
This reverts commit 599dd58fe1, reversing
changes made to 1854ce2d32.
2024-02-07 09:36:32 +01:00
Grégoire Paris
599dd58fe1 Merge pull request #11229 from greg0ire/add-columns
Add columns for 3.1.x and 4.0x
2024-02-07 07:56:20 +01:00
Grégoire Paris
aff543a4ff Add columns for 3.1.x and 4.0x 2024-02-06 23:12:13 +01:00
Andrey Bolonin
1854ce2d32 Update version ORM from 2 to 3 in docs (#11221) 2024-02-06 07:09:30 +01:00
Benjamin Morel
b00f0c258e Clean up outdated sentence (#11224)
The static create() method is gone in version 3
2024-02-05 22:58:19 +01:00
Grégoire Paris
13a79b068c Merge pull request #11222 from andreybolonin/patch-3
Update README.md
2024-02-05 08:36:56 +01:00
Andrey Bolonin
27c9e9cab3 Update README.md 2024-02-05 09:31:22 +03:00
Alexander M. Turek
1051817d92 Merge branch '3.0.x' into 3.1.x
* 3.0.x:
  Bump dependencies in the "getting started" docs page (#11219)
  DoctrineSetup was renamed to ORMSetup (#11218)
2024-02-04 17:45:24 +01:00
Alexander M. Turek
00ed2ca991 Bump dependencies in the "getting started" docs page (#11219) 2024-02-04 17:40:24 +01:00
Alexander M. Turek
54b7ad2073 DoctrineSetup was renamed to ORMSetup (#11218) 2024-02-04 17:40:04 +01:00
Alexander M. Turek
517d038e5b Merge branch '3.0.x' into 3.1.x
* 3.0.x:
  Switch back to stable dependencies (#11210)
  Update branch metadata
2024-02-04 11:49:25 +01:00
Grégoire Paris
3db79ebbf3 Merge pull request #11214 from greg0ire/followup-array-access
Replace more occurrences of array access
2024-02-04 00:16:01 +01:00
Grégoire Paris
a2faeb9a26 Replace more occurrences of array access
Not sure how I missed those.
2024-02-03 23:56:59 +01:00
Grégoire Paris
3764ebf7a3 Merge pull request #11212 from greg0ire/fix-grammar
Follow up on array access deprecation
2024-02-03 23:50:27 +01:00
Grégoire Paris
a7d5adb3ce Migrate more occurrences of array access 2024-02-03 23:07:27 +01:00
Grégoire Paris
6f507c322a Fix grammar issue in upgrade guide 2024-02-03 23:01:56 +01:00
Grégoire Paris
54013671a7 Merge pull request #11211 from greg0ire/deprecate-array-access
Deprecate array access
2024-02-03 22:50:38 +01:00
Grégoire Paris
f5dea25b6c Deprecate array access
We now have proper value objects with properties for everything we need.
2024-02-03 22:26:56 +01:00
Alexander M. Turek
7527b788de Switch back to stable dependencies (#11210) 2024-02-03 21:24:40 +01:00
Grégoire Paris
e52bc846f0 Merge pull request #11209 from greg0ire/update-branch-metdata
Update branch metadata
2024-02-03 20:00:29 +01:00
Grégoire Paris
f259754b7c Update branch metadata 2024-02-03 19:40:21 +01:00
Alexander M. Turek
3bc2cb6b15 Merge branch '2.19.x' into 3.0.x
* 2.19.x:
  Update branch metadata
2024-02-03 18:45:55 +01:00
Grégoire Paris
5b8b5f28f5 Run Rector on the source code (#11205) 2024-02-03 17:50:09 +01:00
Grégoire Paris
2e155e98a7 Merge pull request #11202 from mpdude/mergeup-2.18.x-3.0.x
Merge 2.18.x up into 3.0.x
2024-02-01 17:18:17 +01:00
Matthias Pigulla
c7a91a459c Fix Psalm complaints after merge-up 2024-02-01 09:50:15 +01:00
Matthias Pigulla
1df03f21e6 Write LimitSubqueryOutputWalkerTest in a way that is portable between DBAL 3 and 4 2024-02-01 09:40:04 +01:00
Matthias Pigulla
09f0966ad6 Fix CS after merge-up 2024-01-31 22:34:35 +01:00
Matthias Pigulla
da6c6f7045 Merge remote-tracking branch 'origin/2.18.x' into 3.0.x
Conflicts:
	phpstan-dbal2.neon
	phpstan-persistence2.neon
	phpstan.neon
	psalm-baseline.xml
	psalm.xml
	src/Persisters/Entity/BasicEntityPersister.php
	src/Query/Exec/MultiTableUpdateExecutor.php
	src/Utility/LockSqlHelper.php
	tests/Tests/ORM/Functional/Locking/LockTest.php
	tests/Tests/ORM/Tools/Pagination/LimitSubqueryOutputWalkerTest.php
2024-01-31 22:28:40 +01:00
Grégoire Paris
fd8d981f30 Merge pull request #11193 from greg0ire/3.0.x
Merge 2.18.x up into 3.0.x
2024-01-28 17:34:45 +01:00
Grégoire Paris
db4d00a58f Merge remote-tracking branch 'origin/2.18.x' into 3.0.x 2024-01-28 16:59:59 +01:00
Grégoire Paris
1a5942a4d9 Merge pull request #11165 from jwage/allow-xml-validation-disable
Allow XML validation to be disabled but keep it enabled by default.
2024-01-26 20:39:27 +01:00
Jonathan H. Wage
282b8fbfe8 Move expectException call before line that triggers exception (best practice) 2024-01-26 10:00:16 -06:00
Jonathan H. Wage
537a27d277 Add test verifying that xml validation disabling/enabling works as expected. 2024-01-26 09:48:08 -06:00
Jonathan H. Wage
cf7757e090 Add back check that was reverted. 2024-01-26 09:33:17 -06:00
Grégoire Paris
69cc78c259 Merge remote-tracking branch 'fork/2.18.x' into 3.0.x 2024-01-18 21:07:35 +01:00
Jonathan H. Wage
2893394673 Allow XML validation to be disabled but keep it enabled by default. 2024-01-17 13:13:39 -06:00
Grégoire Paris
8aa6a5f401 Merge remote-tracking branch 'origin/2.18.x' into 3.0.x 2024-01-02 21:55:11 +01:00
Grégoire Paris
588d29d789 Merge pull request #11140 from greg0ire/psr-4
Flatten directory tree on 3.0
2024-01-02 21:54:38 +01:00
Grégoire Paris
0a3fbac8af Flatten directory tree
It will make fuzzy matchers more efficient, and configuration files more
readable.
2024-01-02 20:28:37 +01:00
Grégoire Paris
1556a1ff7a Merge pull request #11147 from greg0ire/remove-php-version-id
Remove irrelevant PHP version checks
2024-01-02 20:28:24 +01:00
Grégoire Paris
64e4a2129c Remove irrelevant PHP version checks 2024-01-02 09:00:22 +01:00
Grégoire Paris
7361d3e57d Merge remote-tracking branch 'origin/2.18.x' into 3.0.x 2024-01-02 08:57:41 +01:00
Alexander M. Turek
28d03e41f7 Merge branch '2.18.x' into 3.0.x
* 2.18.x:
  Add compatibility with the Symfony 4.4 VarExporter (#10948)
  PHPStan 5.16.0, Symfony 7.0 (#11095)
2023-12-01 21:58:59 +01:00
Markus Staab
f8ced51687 XmlDriver: remove dead code (#11085) 2023-11-25 09:16:23 +01:00
Grégoire Paris
2c06ffa4a7 Merge pull request #11071 from greg0ire/remove-wrong-assertion
Remove wrong assertion
2023-11-20 08:13:06 +01:00
Grégoire Paris
9a281f54de Remove wrong assertion
It is useless in that particular method, and wrong.
2023-11-19 21:29:56 +01:00
Grégoire Paris
b73d44b46b Merge pull request #11066 from doctrine/2.17.x-merge-up-into-3.0.x_45pl9AIy
Merge release 2.17.1 into 3.0.x
2023-11-17 08:19:27 +01:00
Grégoire Paris
b971cbeebb Merge remote-tracking branch 'origin/2.18.x' into 2.17.x-merge-up-into-3.0.x_45pl9AIy 2023-11-17 07:38:22 +01:00
Alexander M. Turek
fcba06f64c Merge release 2.17.0 into 3.0.x (#11062) 2023-11-16 00:11:38 +01:00
Alexander M. Turek
7974a92bf9 Merge remote-tracking branch 'derrabus/3.0.x' into 3.0.x
* derrabus/3.0.x:
  Deprecate annotation classes for named queries
  Fix typos
  Housekeeping: Revert change to AbstractExporter, not needed without subselect fetch.
  Address review comments.
  Explain internals of eager loading in a bit more detail and how its configured.
  1:1 and M:1 associations also use fetch batch size configuration now.
  Add another testcase for DQL based fetch eager of collection.
  last violation hopefully
  Static analysis
  Housekeeping: phpcs
  Directly load many to many collections, batching not supported yet. fix tests.
  Avoid new fetch mode, use this strategy with fetch=EAGER for collections.
  Make sure to many assocatinos are also respecting AbstractQuery::setFetchMode
  Disallow use of fetch=SUBSELECT on to-one associations.
  Go through Persister API instead of indirectly through repository.
  Introduce configuration option for subselect batch size.
  Houskeeping: phpcs
  Disallow WITH keyword on fetch joined associatiosn via subselect.
  [GH-1569] Add new SUBSELECT fetch mode for OneToMany associations.
2023-11-15 23:49:44 +01:00
Alexander M. Turek
124593383b Fix calls to removed lock methods (#11061) 2023-11-15 23:48:59 +01:00
Alexander M. Turek
56df970d8b Merge branch '2.17.x' into 3.0.x
* 2.17.x:
  Deprecate annotation classes for named queries
  Fix typos
  Housekeeping: Revert change to AbstractExporter, not needed without subselect fetch.
  Address review comments.
  Explain internals of eager loading in a bit more detail and how its configured.
  1:1 and M:1 associations also use fetch batch size configuration now.
  Add another testcase for DQL based fetch eager of collection.
  last violation hopefully
  Static analysis
  Housekeeping: phpcs
  Directly load many to many collections, batching not supported yet. fix tests.
  Avoid new fetch mode, use this strategy with fetch=EAGER for collections.
  Make sure to many assocatinos are also respecting AbstractQuery::setFetchMode
  Disallow use of fetch=SUBSELECT on to-one associations.
  Go through Persister API instead of indirectly through repository.
  Introduce configuration option for subselect batch size.
  Houskeeping: phpcs
  Disallow WITH keyword on fetch joined associatiosn via subselect.
  [GH-1569] Add new SUBSELECT fetch mode for OneToMany associations.
2023-11-15 21:37:34 +01:00
Grégoire Paris
21466a0524 Merge pull request #10986 from greg0ire/drop-support-for-unserializing-old-format
Drop support for unserializing old serialization formats
2023-11-14 08:15:19 +01:00
Grégoire Paris
010cd948c9 Drop support for unserializing old serialization formats 2023-11-11 18:44:26 +01:00
Grégoire Paris
30626ac6bb Merge remote-tracking branch 'origin/2.17.x' into 3.0.x 2023-11-08 09:30:31 +01:00
Grégoire Paris
1f62233bf6 Merge pull request #11045 from greg0ire/dynamic-recommendation
Dynamically resolve AUTO to SEQUENCE or IDENTITY
2023-11-08 08:27:04 +01:00
Grégoire Paris
ffbe56779d Remove unneeded test
There no longer is such a thing as recommended strategies.
2023-11-07 21:10:01 +01:00
Grégoire Paris
bdc039fe31 Dynamically resolve AUTO to SEQUENCE or IDENTITY
With DBAL 3.x, IDENTITY results in SERIAL.
With DBAL 4.x, it results in the standard GENERATED BY DEFAULT AS IDENTITY.
2023-11-07 20:59:44 +01:00
Grégoire Paris
73288bc472 Merge pull request #11013 from greg0ire/native-type-decl
Enforce native type declarations
2023-10-22 23:19:37 +02:00
Grégoire Paris
8ab0af3d30 Enforce native type declarations
I tried to avoid changes in tests, so as to not unnecessarily widen the
gap between 2.x and 3.x.
2023-10-22 15:45:24 +02:00
Grégoire Paris
82f4a177b2 Use native type hint for ProxyFactory::getProxy
This requires heavily adapting tests, because the proxy instance must:
- be an instance of InternalProxy (easy)
- be a valid entity (hard, especially for PHPUnit)
2023-10-22 15:45:24 +02:00
Grégoire Paris
1fef3196d9 Merge remote-tracking branch 'origin/2.17.x' into 3.0.x 2023-10-21 20:06:57 +02:00
Alexander M. Turek
ad519a5c6f Prepare CI for stable DBAL 4 (#11011) 2023-10-16 08:41:34 +02:00
Grégoire Paris
4444065531 Remove dependency on doctrine/common (#10998)
We were only relying on it for functionality related to proxies, which
is very little code.
2023-10-15 21:30:26 +02:00
Grégoire Paris
e280b2df26 Use native return type declarations in Debug class (#11012) 2023-10-15 13:56:52 +02:00
Grégoire Paris
3c34265666 Merge pull request #11010 from greg0ire/3.0.x
Merge 2.17.x up into 3.0.x
2023-10-14 23:26:51 +02:00
Grégoire Paris
8693fa790c Merge remote-tracking branch 'origin/2.17.x' into 3.0.x 2023-10-14 23:12:19 +02:00
Alexander M. Turek
e997c6688c Remove schema visitors (#11001) 2023-10-12 20:23:35 +02:00
Grégoire Paris
03148b1300 Merge pull request #10964 from soltmar/2.16.x-update-order-of-mapping-attributes
Updated order of mapping attribute parameters
2023-10-11 23:04:43 +02:00
Mariusz Soltys
f47d68c826 Merge branch '3.0.x' into 2.16.x-update-order-of-mapping-attributes 2023-10-11 15:05:50 +01:00
Alexander M. Turek
06eb00d687 Fix array parameters with DBAL 4 (#10995) 2023-10-11 15:27:18 +02:00
Benjamin Eberlei
7827453b94 UPGRADE.md is missing two latest merges. 2023-10-11 13:48:34 +02:00
Benjamin Eberlei
6f3140a09e Merge pull request #10994 from beberlei/3.0.x-g
Merge up 2.17.x to 3.0.x
2023-10-11 13:40:02 +02:00
Benjamin Eberlei
2d31d71961 Adapt tests, upgrade cs and fix static coding violations and baseline 2023-10-11 13:38:10 +02:00
Benjamin Eberlei
2db1f76dee Rework AUTO keyword deafults to be IDENTITY always, except Oracle SEQUENCE. 2023-10-11 12:00:40 +02:00
Benjamin Eberlei
6e61571edc Housekeeping: phpcs 2023-10-11 11:09:21 +02:00
Benjamin Eberlei
22e7c02cf7 Throw exceptions for cases where attributes are illegal on Embeddables. (#10992)
* Throw exceptions for cases where attributes are illegal on Embeddables.

* Embedded is allowed on Embeddable, update SchemaValidator.
2023-10-11 11:05:24 +02:00
Grégoire Paris
4a5f48f7ff Merge remote-tracking branch 'origin/2.17.x' into 3.0.x 2023-10-11 11:00:55 +02:00
Grégoire Paris
5534db1810 Merge commit '07b091750' into 3.0.x 2023-10-11 10:55:09 +02:00
Grégoire Paris
18897fa7d5 Merge pull request #10985 from greg0ire/remove-partial-from-dql 2023-10-11 10:49:29 +02:00
Grégoire Paris
689da1f251 Remove unused exception 2023-10-11 10:31:35 +02:00
Grégoire Paris
5c250063b8 Remove EntityManager::getPartialReference() 2023-10-11 10:31:35 +02:00
Grégoire Paris
99fe3b5c5b Remove partial syntax in DQL
It is no longer possible to use the "PARTIAL" keyword in a DQL query, or
to artificially build an AST with a partial object expression. It is
still possible to use the result set mapping API to build partial
objects.
2023-10-11 10:24:02 +02:00
Alexander M. Turek
af5c250cc8 Merge branch '2.17.x' into 3.0.x
* 2.17.x:
  Allow creating mocks of the Query class (#10990)
  Add missing "deprecated" annotation on the annotation driver
  Deprecate EntityManager*::getPartialReference()
2023-10-11 09:59:27 +02:00
Grégoire Paris
1fe0910d6b Merge pull request #10332 from greg0ire/drop-lexer-2 2023-10-10 16:25:37 +02:00
Alexander M. Turek
2cf0c59f7a Allow VarExporter 7 (#10984) 2023-10-10 12:42:04 +02:00
Mariusz Soltys
7e51a09347 Updated order of mapping attribute parameters 2023-10-10 11:15:33 +01:00
Alexander M. Turek
906e91cbb4 Merge branch '2.17.x' into 3.0.x
* 2.17.x:
  Don't assert that BIGINTs are stored as strings (#10980)
2023-10-10 11:36:17 +02:00
Alexander M. Turek
2aaec3a79a Merge branch '2.17.x' into 3.0.x
* 2.17.x:
  document Paginator::HINT_ENABLE_DISTINCT
  allow to disable "DISTINCT" added to the sql query by the limit subquery walker
  Test against php 8.3 (#10963)
  update checkout version to version 4
2023-10-09 17:51:53 +02:00
Grégoire Paris
4799c418c9 Merge pull request #10975 from greg0ire/void-execute-insert 2023-10-09 16:40:07 +02:00
Grégoire Paris
a1d7de6b66 Merge remote-tracking branch 'origin/2.17.x' into 3.0.x 2023-10-09 16:35:27 +02:00
Grégoire Paris
83d46d7cf9 Change EntityPersister return type
Calling UnitOfWork::assignPostInsertId() is now the way to go.
2023-10-09 16:13:29 +02:00
Grégoire Paris
f3b6c4b356 Use lazy ghosts unconditionally (#10969)
* Use lazy ghosts unconditionally

* Stop extending proxy factory from doctrine/common

Extending it no longer serves any purpose.

* Transform annotation into actual method
2023-10-08 23:18:35 +02:00
Grégoire Paris
343afda275 Merge pull request #10971 from greg0ire/restore-prefer-lowest
Restore job with --prefer-lowest
2023-10-08 18:43:53 +02:00
Grégoire Paris
27009986d7 Restore job with --prefer-lowest
It is useful to catch misconfigured dependency constraints. It was
removed in 413c33274d.
This implies configuring mocks so as to support psr/cache 1
psr/cache 1 does not use native return types, and phpdoc is not enough
to obtain a mock that has typed methods.
2023-10-08 13:08:16 +02:00
Grégoire Paris
e71868fe8b Merge pull request #10968 from greg0ire/reject-id-collisions-unconditionally
Reject ID collisions in identity map unconditionally
2023-10-07 21:39:56 +02:00
Grégoire Paris
795e7735d8 Reject ID collisions in identity map unconditionally 2023-10-07 20:54:04 +02:00
Grégoire Paris
46ef989f38 Update reference 2023-10-06 23:55:34 +02:00
Grégoire Paris
8a4d35d5e7 Merge origin/2.17.x into 3.0.x (using imerge) 2023-10-06 23:50:53 +02:00
Grégoire Paris
faec95fed2 Merge pull request #10909 from greg0ire/imerge/continue-merge-up
Continue merge up
2023-10-06 21:06:54 +02:00
Grégoire Paris
c69044bc9b Implement InternalProxy as well 2023-10-03 12:22:17 +02:00
Grégoire Paris
9a1085d72f Merge pull request #10954 from dannyvankooten/3.0.x 2023-09-28 11:54:33 +02:00
Danny van Kooten
501226b90b remove reference to removed yaml configuration option 2023-09-28 11:02:28 +02:00
Grégoire Paris
2c39b3f118 Remove base test case class (#10910)
We are using PHPUnit 10, so none of the polyfills in that class are
needed now.
2023-08-15 15:44:34 +02:00
Grégoire Paris
436f0467ec imerge 'continue-merge-up': manual merge 1-1 2023-08-15 11:42:53 +02:00
Alexander M. Turek
394f6fe1b4 Merge pull request #10888 from greg0ire/partial-merge-up
Partial merge up of 2.17.x into 3.0.x
2023-08-08 16:38:30 +02:00
Grégoire Paris
7d9a2c0a71 Merge commit 'e78163981292075c5cc987c1b50ec7a4fad0e20e' into 3.0.x 2023-08-08 14:00:33 +02:00
Grégoire Paris
2dc19e6919 Remove outdated comment (#10853)
Since support for persistence 2 has been dropped, this method may no
longer acces an aliased class name.
Besides, providing an FQCN with a leading backslash should work since
removing it is the first thing that happens inside
AbstractClassMetadataFactory::getMetadataFor().
2023-07-25 00:31:57 +02:00
Alexander M. Turek
b68cab1b3d Declare compatibility with DBAL 4 (#10843) 2023-07-17 00:30:09 +02:00
Grégoire Paris
476b68cd1f Merge pull request #10805 from greg0ire/valid-phpunit-xml
Validate phpunit.xml against PHPUnit 10 schema
2023-06-27 23:52:14 +02:00
Grégoire Paris
3ffd3f6509 Validate phpunit.xml against PHPUnit 10 schema
The previous syntax was a PHPUnit 9 syntax.
2023-06-27 23:13:06 +02:00
Matthias Pigulla
1733bf8678 Remove remaining references to the merge() operation (#10793)
`EntityManager::merge()` has been deprecated in #8461 and removed in #9488.

This PR removes a few remaining references and artefacts that - to my understanding - refer to it.
2023-06-27 10:27:39 +02:00
Grégoire Paris
84a87a6ac8 Merge remote-tracking branch 'origin/2.16.x' into 3.0.x 2023-06-24 11:15:42 +02:00
Grégoire Paris
6fa95b93df Merge pull request #10778 from greg0ire/lifecycle-embedded-class 2023-06-22 10:04:53 +02:00
Grégoire Paris
2004761475 Merge pull request #10777 from greg0ire/cleanup-bc-layers
Turn deprecation into an exception
2023-06-21 16:23:06 +02:00
Grégoire Paris
3ad9c43a96 Merge pull request #10782 from andersonamuller/patch-2 2023-06-19 13:25:19 +02:00
Anderson Müller
1bd3066b9f Remove missed note about deprecated drivers 2023-06-19 11:21:17 +02:00
Grégoire Paris
663763ab1a Disallow lifecycle callbacks on embedded classes 2023-06-17 16:18:57 +02:00
Grégoire Paris
2a8f22c521 Turn deprecation into an exception 2023-06-17 15:43:12 +02:00
Grégoire Paris
efd429dd24 Merge pull request #10769 from greg0ire/cleanup-bc-layers
Remove Notify change tracking policy
2023-06-10 22:59:33 +02:00
Grégoire Paris
716139c168 Remove Notify change tracking policy 2023-06-07 21:16:17 +02:00
Grégoire Paris
492635a8e8 Merge pull request #10768 from greg0ire/cleanup-bc-layers
Enable XML validation unconditionally
2023-06-07 08:19:49 +02:00
Grégoire Paris
0dad2daf2c Enable XML validation unconditionally
Note that this makes ext-dom a hard requirement when using the XML
driver.
2023-06-06 23:29:56 +02:00
Grégoire Paris
e0b72408a1 Merge pull request #10764 from greg0ire/cleanup-bc-layers 2023-06-06 11:42:14 +02:00
Grégoire Paris
575d0c03ee Reject non instances of ORM\ClassMetadata 2023-06-06 08:49:30 +02:00
Grégoire Paris
a2a4f73b30 Enforce reporting fields where declared 2023-06-06 08:49:30 +02:00
Grégoire Paris
f1d6ba8919 Narrow types 2023-06-06 00:05:05 +02:00
Grégoire Paris
0872d1429d Add missing upgrade notes 2023-06-05 23:43:25 +02:00
Grégoire Paris
96f5f84e8b Merge pull request #10741 from greg0ire/cleanup-bc-layers
Cleanup bc layers
2023-06-05 23:26:28 +02:00
Grégoire Paris
0945f60484 Remove backward-compatibility layer
Note that we also remove UpdateCommandTest::testItPrintsTheSql() because
it relied on not passing --complete to work.
2023-06-05 23:08:31 +02:00
Grégoire Paris
f38922944e Remove unneeded DeprecatedProperty rule
That property has been removed from 3.0.x
2023-06-05 23:08:31 +02:00
Grégoire Paris
63e9ad9e9a Remove unneeded ignore rule
The linked issue has been addressed, this rules should have been removed
during a merge up, as it is no longer present on 2.x
2023-06-05 23:08:31 +02:00
Grégoire Paris
46ff264502 Merge remote-tracking branch 'origin/2.16.x' into 3.0.x 2023-06-05 09:36:36 +02:00
Grégoire Paris
8b1ce48e79 Merge pull request #10730 from greg0ire/join-column-mapping
Migrate to the object API of Join{Column,Table}Mapping
2023-05-31 00:28:12 +02:00
Grégoire Paris
07674b1887 Migrate to the object API of Join{Column,Table}Mapping 2023-05-30 08:52:02 +02:00
Grégoire Paris
ec43884612 Merge pull request #10729 from greg0ire/mandatory-table-name
Make the join table name and join column name mandatory
2023-05-30 08:43:21 +02:00
Grégoire Paris
ee62934911 Make the join column name mandatory 2023-05-28 23:28:15 +02:00
Grégoire Paris
8a6dbb4ae2 Make the join table name mandatory
It does not seem to ever be empty
2023-05-26 18:17:25 +02:00
Grégoire Paris
2a8a886bbe Merge pull request #10728 from greg0ire/declare-options
Declare options property
2023-05-25 23:55:06 +02:00
Grégoire Paris
2b03858717 Declare options property
This must have been lost when merging up d7d6b9d2c7
2023-05-25 17:27:17 +02:00
Grégoire Paris
497faffe0b Merge pull request #10723 from greg0ire/association-mapping-object-api 2023-05-25 10:30:19 +02:00
Grégoire Paris
8a762f04f1 Manually fix remaining issues 2023-05-23 13:34:39 +02:00
Grégoire Paris
bbc56aaec6 Ignore issue about collections 2023-05-23 13:34:39 +02:00
Grégoire Paris
647712649b Add assertions 2023-05-23 13:34:39 +02:00
Grégoire Paris
61f2c4d53b Allow ClassMetadata::FETCH_EXTRA_LAZY as a value for
ClassMetadata->$fetch
2023-05-23 13:34:39 +02:00
Grégoire Paris
ca8ee91467 Leverage ClassMetadataFactory::getOwningSide() 2023-05-23 13:34:38 +02:00
Grégoire Paris
2987e9956f Add assertion 2023-05-23 13:34:38 +02:00
Grégoire Paris
917e0cff39 Move assertion 2023-05-23 13:34:38 +02:00
Grégoire Paris
6ce0cf4a3d Add assertions based on joinColumns access 2023-05-23 13:34:37 +02:00
Grégoire Paris
d4915a8b3d Ignore unfixable error 2023-05-23 13:34:37 +02:00
Grégoire Paris
749947efe7 Clarify things for SA 2023-05-23 13:34:37 +02:00
Grégoire Paris
535d869835 Ignore issue due to Psalm bug 2023-05-23 13:34:37 +02:00
Grégoire Paris
ea23628010 Rectorify 2023-05-23 13:34:37 +02:00
Grégoire Paris
10fa1e07b2 Merge remote-tracking branch 'origin/2.16.x' into 3.0.x 2023-05-16 17:42:44 +02:00
Grégoire Paris
c32efc2588 Merge pull request #10699 from greg0ire/narrow-down-param-type-qs
Narrow down parameter types for quote strategies
2023-05-16 08:20:47 +02:00
Grégoire Paris
6032a2ccf7 Use OneToManyPersister::getMapping() more
Not sure how I forgot these.
2023-05-15 09:27:07 +02:00
Grégoire Paris
1f9d1bf4cb Narrow down parameter type declarations for quote strategies 2023-05-15 09:10:11 +02:00
Grégoire Paris
dff40cf351 Narrow down templated method return type
Maybe we do not know enough about the parameter to determine the type of
the returned relationship, but we can at least narrow it down to 3
possibilites.
2023-05-15 08:57:23 +02:00
Grégoire Paris
a55c72b47d Merge pull request #10701 from greg0ire/convenience
Introduce convenience methods to narrow types
2023-05-15 08:19:05 +02:00
Grégoire Paris
f03db50be1 Merge pull request #10697 from greg0ire/narrow-down-assoc-mapping-type
Narrow down ClassMetadata::associationMappings type
2023-05-14 23:28:38 +02:00
Grégoire Paris
2a77776c91 Merge pull request #10700 from greg0ire/wrong-phpdoc-getdefiningclass
fix wrong phpdoc
2023-05-14 23:22:59 +02:00
Grégoire Paris
c51c84fc47 Introduce convenience methods to narrow types
These methods assert the type of the mapping provided by the collection
according to the name of the class they are in: the one to many
persister only ever deals with one to many associations, and the many to
many persister only ever deals with many to many associations.
2023-05-13 11:33:08 +02:00
Grégoire Paris
00beecce74 fix wrong phpdoc
The keys in the join columns array have no meaning, and are just
sequential integers.
2023-05-13 11:24:01 +02:00
Grégoire Paris
9f60fdc288 Merge pull request #10698 from greg0ire/move-join-column-fieldnames-down
Move joinColumnFieldNames down the class hierarchy
2023-05-12 23:22:40 +02:00
Grégoire Paris
3b88e4844a Move joinColumnFieldNames down the class hierarchy
It has only meaning for ToOneOwningSideMapping
2023-05-12 21:17:20 +02:00
Grégoire Paris
63561fc382 Narrow down ClassMetadata::associationMappings type 2023-05-12 08:24:07 +02:00
Grégoire Paris
caa8041963 Merge pull request #10696 from greg0ire/templating-getowningside
Add templating for getOwningSide
2023-05-12 07:48:56 +02:00
Grégoire Paris
1c8b5181b5 Add templating for getOwningSide
It allows to remove many assertions.
2023-05-11 22:08:05 +02:00
Grégoire Paris
e5eaf9b855 Merge pull request #10688 from greg0ire/cmf-getowningassoc
Introduce method to get to the owning side
2023-05-09 07:42:22 +02:00
Grégoire Paris
380f8a42f3 Introduce method to get to the owning side
Throughout the codebase, there is this pattern where we ensure we have
the owning side of an association.
It involves accessing it from the associationMappings array. In the end,
static analysis cannot know that the association is indeed owning.
By introducing this convenience method, we make this clear, and also
delegate the complexity to the class metadata factory.
2023-05-08 17:33:15 +02:00
Grégoire Paris
05b5a64cb9 Make indexBy/orderBy easier to understand for SA (#10687)
Interfaces cannot have properties, and we do not have a concept of
sealed classes available to us without installing third party packages.
Interfaces can have methods however, which allows us to simplify calling
code.
I've been avoiding introducing getters for mapping properties because I
do not know what the performance implications are, but here, I think it
is sensible to make an exception, given the benefits.
2023-05-08 15:24:10 +02:00
Grégoire Paris
05678dcd97 Merge pull request #10681 from greg0ire/rework-class-hierarchy
Rework association mapping hierarchy
2023-05-07 23:49:32 +02:00
Grégoire Paris
a9c80c2293 Merge pull request #10682 from greg0ire/remove-unneeded-fields
Make sure unneeded fields are not present
2023-05-07 23:48:41 +02:00
Grégoire Paris
e18b80c1bf Rework association mapping hierarchy
- Each type is now either final, abstract or an interface.
- The mappedBy attribute is no longer nullable and moved down the
  hierarchy.
- The inversedBy attribute is still nullable and also moved down the
  hierarchy.
- Code common to ManyToOneAssociationMapping and
  OneToOneOwningSideMapping is de-duplicated and moved up the hierarchy
- Code inside ToManyInverseSideMapping and ToManyOwningSideMapping comes
  from a trait to avoid duplication.
2023-05-07 21:04:02 +02:00
Grégoire Paris
3ddb2a845c Make sure unneeded fields are not present
Instead of ensuring every mapping array has a mappedBy and an inversedBy
field, let us do the opposite, and remove them when they are null.
Likewise if there is a joinColumns field, it is useless if null or
empty.
2023-05-05 21:02:25 +02:00
Grégoire Paris
9baf213673 Merge pull request #10680 from greg0ire/3.0.x
Merge 2.16.x up into 3.0.x
2023-05-05 18:46:19 +02:00
Grégoire Paris
f874bc85f1 Merge remote-tracking branch 'origin/2.16.x' into 3.0.x 2023-05-05 09:32:05 +02:00
Grégoire Paris
d075f5d5f8 Merge pull request #10667 from greg0ire/throw-on-invalid-oto
Throw on invalid one to one
2023-05-03 23:25:34 +02:00
Grégoire Paris
fac8d84fdb Throw on invalid one to one
One to one relationships are not allowed to define a join column. That
should be done on the owning side of the relationship.
2023-05-03 21:28:25 +02:00
Grégoire Paris
09680b18ee Merge pull request #10646 from greg0ire/migrate-basic-entity-persister
Migrate basic entity persister to the object API of association mapping
2023-05-02 22:47:52 +02:00
Grégoire Paris
caf8d876da Merge remote-tracking branch 'origin/2.15.x' into 3.0.x 2023-04-26 21:43:19 +02:00
Grégoire Paris
629c600b10 Merge origin/2.15.x into 3.0.x (using imerge) 2023-04-25 22:28:05 +02:00
Grégoire Paris
7f46fad0f0 Merge pull request #10650 from greg0ire/better-comments
Improve named constructors' phpdoc
2023-04-24 23:36:22 +02:00
Grégoire Paris
559e1d139a Improve named constructors' phpdoc
They were inconsistently documented.
2023-04-24 09:08:37 +02:00
Grégoire Paris
bd9cd989a0 Merge pull request #10649 from greg0ire/wrong-field
Use valid relationships
2023-04-23 22:13:53 +02:00
Grégoire Paris
f7e49a53be Use valid relationships
During a recent refactoring, I had to pick a relationship type for this
piece of code, and I chose wrong, because a many-to-one cannot have a
mappedBy field.
2023-04-23 10:34:12 +02:00
Grégoire Paris
ade5559ed5 Migrate basic entity persister to the object API of association mapping 2023-04-21 22:33:44 +02:00
Grégoire Paris
c019f8649b Merge pull request #10641 from greg0ire/move-to-1-properties-down
Move $(sourceToTarget|targetToSource)KeyColumns down
2023-04-20 23:20:46 +02:00
Grégoire Paris
68571184ca Become strict about notices and warnings
Since PHPUnit 10, it is possible to display details when notices and
warnings happen, and to fail the test suite on notice.
failOnWarning is older than that.
2023-04-20 22:41:57 +02:00
Grégoire Paris
f171d49dc0 Move $(sourceToTarget|targetToSource)KeyColumns down
These properties can be made non nullable if we move them down to the 2
owning side classes that actually use them.
2023-04-20 09:11:47 +02:00
Grégoire Paris
ae88844353 Merge pull request #10638 from greg0ire/migrate-m2m
Migrate ManyToManyPersister to the object API of association mappings
2023-04-19 23:34:03 +02:00
Grégoire Paris
8d1d32ce81 Migrate ManyToManyPersister to the object API of association mappings 2023-04-18 21:22:22 +02:00
Grégoire Paris
01aa9a5870 Add nice assertion for PHPStan 2023-04-18 21:15:39 +02:00
Grégoire Paris
bf7ffa94cf Merge pull request #10637 from greg0ire/move-properties-down 2023-04-18 15:01:40 +02:00
Grégoire Paris
672ff01f44 Move properties down
These properties only make sense for the owning side of a many-to-many
relationship.
Moving them down allows us simplify the serialization code, because the
case when these properties are empty no longer happen.
2023-04-17 22:52:04 +02:00
Grégoire Paris
fd64e137c8 Merge pull request #10636 from greg0ire/join-table-columns-down
Move joinTableColumns down
2023-04-17 22:22:50 +02:00
Grégoire Paris
49cc83d273 Move joinTableColumns down
This field only makes sense for the owning side of many-to-many
mappings. Moving it down allows us to make it non-nullable.
2023-04-17 21:45:20 +02:00
Grégoire Paris
ada109bc90 Merge pull request #10633 from greg0ire/inspect-owning-side
Check only owning relationships
2023-04-15 14:58:21 +02:00
Grégoire Paris
303baeea33 Merge pull request #10635 from greg0ire/convenience-methods
Introduce and leverage more convenience methods
2023-04-15 14:58:02 +02:00
Grégoire Paris
eeae5734a5 Merge pull request #10634 from greg0ire/wrong-comparison
Remove wrong comparison
2023-04-15 14:53:45 +02:00
Grégoire Paris
b6860328c0 Introduce and leverage more convenience methods 2023-04-15 14:49:32 +02:00
Grégoire Paris
3e04516740 Remove wrong comparison
This is a remnant of when this was done with the type and the &
operator.
2023-04-15 13:07:26 +02:00
Grégoire Paris
ec9e79a35b Check only owning relationships
The inverse side does not have access to join columns / join tables.
2023-04-15 11:48:34 +02:00
Alexander M. Turek
2d3e89e2cb Remove obsolete RequiresPhp attributes (#10631) 2023-04-14 23:05:11 +02:00
Grégoire Paris
727a9914f2 Merge pull request #10628 from greg0ire/discriminator-mapping-object-api
Migrate to DiscriminatorColumnMapping's object API
2023-04-14 22:55:47 +02:00
Grégoire Paris
5aebfefc45 Merge pull request #10629 from greg0ire/embedded-class-mapping-object-api
Migrate to embedded class mapping object API
2023-04-14 22:54:36 +02:00
Grégoire Paris
118eb87032 Migrate to embedded class mapping object API 2023-04-14 15:42:00 +02:00
Grégoire Paris
7df7503af6 Migrate to DiscriminatorColumnMapping's object API
Its array access implementation should stay for external consumers, but
should be deprecated as of Doctrine 3.1.0
2023-04-14 14:27:50 +02:00
Grégoire Paris
c49bba7a5e Merge pull request #10617 from greg0ire/field-mapping-object-api
Use Rector to migrate to the object API of FieldMapping
2023-04-14 07:40:39 +02:00
Grégoire Paris
2acb298e74 Use Rector to migrate to the object API of FieldMapping
This makes the array access implementation of FieldMapping useful only
to consumers, it is no longer useful internally, and should be
deprecated as of Doctrine 3.1.0
2023-04-13 19:39:51 +02:00
Grégoire Paris
eaac5cd3dc Merge pull request #10613 from greg0ire/association-mapping
Extract AssociationMapping in its own DTO
2023-04-13 19:32:13 +02:00
Grégoire Paris
14d615201e Extract AssociationMapping in its own DTO 2023-04-07 08:39:19 +02:00
Grégoire Paris
545070f879 Merge pull request #10612 from doctrine/embedded-class-mapping-dto 2023-04-03 10:06:40 +02:00
Grégoire Paris
9d3ae4a55a Extract embedded class mapping into its own DTO 2023-04-03 09:33:28 +02:00
Grégoire Paris
c213974234 Use the correct argument order for PHPUnit's assertions 2023-04-03 08:58:03 +02:00
Grégoire Paris
e22592f06b Extract discriminator column mapping into its own DTO (#10609) 2023-04-02 14:19:03 +02:00
Grégoire Paris
e4a7403ead Merge pull request #10607 from greg0ire/field-mapping-dto
Field mapping DTO
2023-03-31 23:34:30 +02:00
Grégoire Paris
175cdefd67 Extract FieldMapping in its own DTO
In the past, it has been decided to use arrays for this out of
legitimate performance concerns. But PHP has evolved, and now, it is
more performant and memory efficient to use objects.
2023-03-31 21:53:00 +02:00
Grégoire Paris
e8376b3995 Create array access implementation
We are going to have many DTOs, all of which will need an array access
implementation as a backward compatibility layer.
2023-03-31 09:10:38 +02:00
Grégoire Paris
b87f86e6f0 Merge remote-tracking branch 'origin/2.15.x' into 3.0.x 2023-03-30 21:03:14 +02:00
Grégoire Paris
df7a5bc712 Merge pull request #7199 from greg0ire/inherit_base_mapping_exception
Inherit from homonym exception in parent package
2023-03-25 12:46:36 +01:00
Grégoire Paris
fc314a2abf Merge pull request #10596 from doctrine/remove-comment
Remove contradictory comment of ORMException
2023-03-24 23:41:35 +01:00
Claudio Zizza
ebfab93d15 Remove contradictory comment
ORMException is an interface in 3.0 already
2023-03-24 23:22:36 +01:00
Grégoire Paris
13d8695780 Merge remote-tracking branch 'origin/2.15.x' into 3.0.x 2023-03-23 16:08:09 +01:00
Grégoire Paris
cc72796fff Inherit from homonym exception in parent package
This means that a class implementing a doctrine/persistence interface or
extending a class from that package can throw a specialized exception
that will still be caught by code in the parent package.
2023-03-22 20:02:40 +01:00
Grégoire Paris
35a29731bb Merge remote-tracking branch 'origin/2.15.x' into 3.0.x 2023-03-07 14:00:29 +01:00
Alexander M. Turek
7568328a6d Forbid PHPUnit annotations (#10567) 2023-03-06 12:02:16 +01:00
Christopher Hertel
b904f44c6c Convert PHPUnit annotations to attributes (#10559) 2023-03-06 11:14:22 +01:00
Alexander M. Turek
46ab755728 Merge 2.15.x into 3.0.x (#10565) 2023-03-06 09:31:33 +01:00
Alexander M. Turek
476ffd5cd8 Merge branch '2.15.x' into 3.0.x
* 2.15.x:
  Skip test instead of commenting it out (#10560)
  Add missing return statements to Command:configure methods
  Fix a Markdown/RST formatting glitch
  Add mapping configurations for classes that were used in tests as entities, but never declared
  Allow to-many associations on mapped superclasses w/ ResolveTargetEntityListener
2023-03-05 23:02:45 +01:00
Alexander M. Turek
59fb8ca571 Remove Doctrine\ORM\Proxy\Proxy interface (#10551) 2023-03-05 12:43:47 +01:00
Alexander M. Turek
c44e19a5e7 PHPUnit 10 (#10492) 2023-03-05 12:43:00 +01:00
Alexander M. Turek
b69e8e0267 Add more native types to entity manager (#10556) 2023-03-02 15:19:42 +01:00
Alexander M. Turek
4444a29c14 Merge branch '2.15.x' into 3.0.x
* 2.15.x:
  Ignore the cache dir of PHPUnit 10 (#10546)
  Make data providers static (#10545)
  Make data providers static (#10544)
  Bump dev tools (#10541)
  Mark SqlWalker methods as not deprecated (#10540)
  docs: consistency order for docblock in association mapping (#10534)
  Correct use of PHP attribute
  fix typo in faq.rst (#10526)
  fix: use executeStatement in SchemaTool (#10516)
  Write a test in a more specific way
  Put up a warning sign that mapping may not be inherited from transient classes (#10392)
  Avoid unnecessary information in query hints to improve query cache hit ratio
2023-02-28 17:09:23 +01:00
Alexander M. Turek
9c2c1178e2 Stabilize DBAL version constraint (#10542) 2023-02-28 08:29:02 +01:00
Grégoire Paris
f98b33f764 Merge remote-tracking branch 'origin/2.15.x' into 3.0.x 2023-02-14 00:11:12 +01:00
Grégoire Paris
759ae5678f Merge pull request #10520 from mpdude/10470-as-exception
Turn deprecation from #10470 into an exception in 3.0.x
2023-02-13 23:08:48 +01:00
Matthias Pigulla
6b61e52baa Turn deprecation from #10470 into an exception in 3.0.x 2023-02-13 20:50:42 +00:00
Grégoire Paris
21c3f4d826 Merge pull request #10517 from greg0ire/3.0.x
Merge 2.15.x up into 3.0.x
2023-02-12 22:13:24 +01:00
Grégoire Paris
7a7464e6d3 Merge remote-tracking branch 'origin/2.15.x' into 3.0.x 2023-02-12 18:33:13 +01:00
Grégoire Paris
0f77181a2c Merge remote-tracking branch 'origin/2.15.x' into 3.0.x 2023-02-09 00:07:14 +01:00
Grégoire Paris
f86fa175df Merge pull request #10509 from greg0ire/php8-migration
Migrate the rest of the source code to PHP 8 syntax
2023-02-08 20:44:15 +01:00
Grégoire Paris
f5e7ddb21c Migrate the rest of the source code to PHP 8 syntax 2023-02-08 20:35:53 +01:00
Matthias Pigulla
7e2eb61deb Make missing inheritance declarations a failure (#10463)
This follows up on #10431: This kind of misconfiguration triggered a deprecation warning since 2.15.x. Now let's make it an exception.
2023-02-08 08:56:21 +01:00
Grégoire Paris
dfcb20ea1e Merge pull request #10506 from doctrine/php8-migration
Migrate Parser to PHP 8
2023-02-08 00:01:25 +01:00
Grégoire Paris
ce03a61b7a Migrate Parser to PHP 8 2023-02-07 23:35:57 +01:00
Grégoire Paris
0f25ae4b83 Merge pull request #10503 from greg0ire/php8-migration
Migrate ClassMetadata to PHP 8 syntax
2023-02-07 08:13:46 +01:00
Grégoire Paris
4fe224a320 Migrate ClassMetadata to PHP 8 syntax 2023-02-06 23:54:52 +01:00
Grégoire Paris
703648580a Merge pull request #10500 from greg0ire/no-underscore-protected
Stop relying on underscores to indicate property visibility
2023-02-06 23:43:15 +01:00
Grégoire Paris
09caeb2753 Stop relying on underscores to indicate property visibility
It conflicts with our coding standard.
2023-02-06 23:27:21 +01:00
Grégoire Paris
7f9827df4f Merge pull request #10497 from greg0ire/php8-migration
Migrate more classes to PHP 8 syntax
2023-02-06 23:26:22 +01:00
Grégoire Paris
941292fe85 Migrate more classes to PHP 8 syntax 2023-02-06 23:06:21 +01:00
Grégoire Paris
de8b444938 Merge pull request #10496 from greg0ire/php8-migration
Migrate database driver to PHP 8 syntax
2023-02-05 09:05:45 +01:00
Grégoire Paris
e8c1e6c1d3 Migrate database driver to PHP 8 syntax 2023-02-04 23:25:16 +01:00
Grégoire Paris
4ad077b3d7 Merge remote-tracking branch 'origin/2.15.x' into 3.0.x 2023-02-04 21:33:12 +01:00
Grégoire Paris
9415275195 Merge pull request #10479 from greg0ire/php8-migration 2023-01-30 11:31:01 +01:00
Grégoire Paris
5c34678580 Migrate exec namespace to PHP 8 syntax 2023-01-29 16:44:55 +01:00
Alexander M. Turek
642a20bcff Merge branch '2.15.x' into 3.0.x
* 2.15.x:
  Psalm 5.6.0, PHPStan 1.9.14 (#10468)
  Fix some tests that were missed in #10431 (#10464)
  Remove commented-out code sections (#10465)
2023-01-27 09:41:48 +01:00
Alexander M. Turek
4d8cf2698e Merge branch '2.15.x' into 3.0.x
* 2.15.x:
  Deprecate undeclared entity inheritance (#10431)
  Psalm 5.5.0 (#10445)
2023-01-26 08:49:28 +01:00
Grégoire Paris
5233a139bb Merge 01028cf3b into 3.0.x (using imerge) 2023-01-25 12:05:43 +01:00
Grégoire Paris
fbcf91d074 Merge pull request #10448 from greg0ire/php8-migration
Migrate ParserResult to PHP 8 syntax
2023-01-24 08:58:28 +01:00
Grégoire Paris
3d1f172788 Migrate ParserResult to PHP 8 syntax 2023-01-23 22:21:39 +01:00
Grégoire Paris
6ea4411789 Merge pull request #10440 from greg0ire/php8-migration
Migrate entity manager to PHP 8 syntax
2023-01-22 23:47:38 +01:00
Grégoire Paris
4357161c3d Migrate entity manager to PHP 8 syntax 2023-01-22 15:37:38 +01:00
Grégoire Paris
3b5bd316e6 Merge pull request #10427 from greg0ire/3.0.x
Merge 2.15.x up into 3.0.x
2023-01-18 23:29:04 +01:00
Grégoire Paris
2d92c09101 Merge remote-tracking branch 'origin/2.15.x' into 3.0.x 2023-01-18 23:26:21 +01:00
Grégoire Paris
4c1e520bd3 Migrate remaining exceptions to PHP 8 syntax (#10402) 2023-01-18 17:11:42 +01:00
Matthias Pigulla
7a08253f18 Remove "table per class" inheritance that was never actually implemented (#10414) 2023-01-18 16:13:26 +01:00
Grégoire Paris
e6382d393e Merge remote-tracking branch 'origin/2.15.x' into 3.0.x 2023-01-17 23:17:32 +01:00
Grégoire Paris
3cd65b12a8 Merge pull request #10401 from greg0ire/3.0.x
Merge 2.15.x up into 3.0.x
2023-01-14 11:34:19 +01:00
Grégoire Paris
d4c53a8885 Merge remote-tracking branch 'origin/2.15.x' into 3.0.x 2023-01-14 11:14:06 +01:00
Grégoire Paris
c8b0931f9c Merge pull request #10379 from greg0ire/remove-cmi
Remove ClassMetadataInfo
2023-01-13 23:18:24 +01:00
Grégoire Paris
c226b951b3 Merge pull request #10378 from greg0ire/php8-migration
Migrate classes with the fewest changes
2023-01-11 09:33:24 +01:00
Grégoire Paris
91b662edb6 Merge pull request #10380 from greg0ire/php8-migration-exceptions
Migrate exceptions to PHP 8 syntax
2023-01-10 11:04:17 +01:00
Grégoire Paris
c313440962 Migrate exceptions to PHP 8 syntax
Co-authored-by: Alexander M. Turek <me@derrabus.de>
Co-authored-by: Claudio Zizza <859964+SenseException@users.noreply.github.com>
2023-01-10 07:58:40 +01:00
Grégoire Paris
a86d5a799d Migrate classes with the fewest changes 2023-01-09 09:10:17 +01:00
Alexander M. Turek
9b1f397ab2 Merge branch '2.15.x' into 3.0.x
* 2.15.x:
  Use more precise types for class strings (#10381)
  PHPStan 1.9.8, Psalm 5.4.0 (#10382)
  fix typo for missing a comma (#10377)
  Docs: Removing `type: 'integer'` from mappings (#10368)
  Docs: Moving *attributes* mapping to first position (#10364)
  Docs: Deleting duplicate mapping example (#10363)
2023-01-09 11:47:02 +07:00
Grégoire Paris
d83b1e338c Remove ClassMetadataInfo 2023-01-07 18:38:46 +01:00
Grégoire Paris
07937b5b9a Merge pull request #10374 from greg0ire/php8-migration
Migrate classes with the fewest changes to PHP 8
2023-01-07 10:59:50 +01:00
Grégoire Paris
a3db423eab Migrate classes with the fewest changes to PHP 8 2023-01-06 23:32:22 +01:00
Grégoire Paris
2b2f4e8acc Merge pull request #10375 from greg0ire/remove-deprecated-methods
Remove deprecated methods and classes
2023-01-06 23:31:24 +01:00
Grégoire Paris
84e78b8200 Remove deprecated methods and classes
This is a follow-up for https://github.com/doctrine/orm/pull/9876
2023-01-04 21:28:14 +01:00
Grégoire Paris
601948baaa Merge pull request #10373 from greg0ire/3.0.x
Merge 2.15.x up into 3.0.x
2023-01-04 20:50:17 +01:00
Grégoire Paris
19168ca8d6 Merge remote-tracking branch 'origin/2.15.x' into 3.0.x 2023-01-04 20:08:12 +01:00
Grégoire Paris
5e828e20cf Merge remote-tracking branch 'origin/2.15.x' into 3.0.x 2023-01-04 18:00:24 +01:00
Grégoire Paris
3a10714d6f Merge pull request #10367 from greg0ire/php8-migration
Migrate files with the least changes to PHP 8
2023-01-03 23:54:44 +01:00
Grégoire Paris
7e379f6872 Migrate files with the least changes to PHP 8
These are the lowest hanging fruits I could find after running Rector: I
looked for files with a diff of 2 lines.
I did not include some changes that I find controversial, such as
marking some constants as final when we should maybe consider making
classes themselves final.
2023-01-03 23:20:25 +01:00
Alexander M. Turek
8b1c353650 Merge branch '2.15.x' into 3.0.x
* 2.15.x:
  PHPStan 1.9.5 (#10359)
  Drop doctrine/lexer 1
2023-01-02 23:22:27 +01:00
Grégoire Paris
75bff1d983 Drop doctrine/lexer 2
This allows us to have a totally typed lexer
2023-01-02 22:37:41 +01:00
Alexander M. Turek
8b35dae5a9 Merge branch '2.15.x' into 3.0.x
* 2.15.x:
  Shorter deprecation message (#10357)
  Add Fully-Qualified class name in UnrecognizedField exception to ease debugging (#10342)
  Include parameter types in hydration cache key generation (#10355)
  Allow doctrine/instantiator 2 (#10351)
2022-12-31 17:56:01 +01:00
Alexander M. Turek
9062af45ca Fix build for DBAL 4 (#10354) 2022-12-31 16:18:08 +01:00
Alexander M. Turek
57f256912a Leverage new ArrayParameterType constants (#10352) 2022-12-30 19:53:30 +01:00
Alexander M. Turek
b31afda33b Modernize QueryExpressionVisitor (#10346) 2022-12-29 15:11:29 +01:00
Alexander M. Turek
ccb9ef7246 Merge pull request #10347 from derrabus/improvement/allow-lexer-3
Allow Lexer 3
2022-12-29 15:10:14 +01:00
Grégoire Paris
bdb3fc72da Allow Lexer 3
Co-authored-by: Alexander M. Turek <me@derrabus.de>
2022-12-29 12:58:35 +01:00
Alexander M. Turek
8aa05b89a0 Merge branch '2.15.x' into 3.0.x
* 2.15.x:
  Support of NOT expression from doctrine/collections ^2.1 (#10234)
  Fix Psalm errors with Collection 2.1.2 (#10343)
  Added warning about query cache in relation to parameters (#10276)
2022-12-29 00:48:06 +01:00
Grégoire Paris
d8a2e329b6 Merge remote-tracking branch 'origin/2.15.x' into 3.0.x 2022-12-20 23:36:39 +01:00
michnovka
ad58c6a6e2 Cleanup code from PR10313 from 2.14.x (#10326) 2022-12-20 07:32:34 +01:00
Alexander M. Turek
8f360f08c5 Migrate Doctrine\ORM\Internal\CommitOrder to PHP 8.1 (#10323) 2022-12-20 07:28:33 +01:00
Grégoire Paris
2e2bca8cf8 Merge pull request #10324 from doctrine/2.14.x-merge-up-into-3.0.x_YfifaF7w
Merge release 2.14.0 into 3.0.x
2022-12-19 23:57:12 +01:00
Grégoire Paris
32eae38f07 Merge remote-tracking branch 'origin/2.14.x' into 2.14.x-merge-up-into-3.0.x_YfifaF7w 2022-12-19 23:32:57 +01:00
Alexander M. Turek
3a2bfce92c Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Drop forceful loading of annotations (#10321)
  Document stdClass structures used by CommitOrderCalculator (#10315)
  Psalm 5.3.0 (#10317)
  PHPStan 1.9.4 (#10318)
  add apcu enabled check if apcu extension loaded (#10310) (#10311)
  Add TypedFieldMapper for automatic mapping of typed PHP fields to DBAL types (#10313)
2022-12-19 22:41:51 +01:00
Grégoire Paris
57e18d0b1b Merge pull request #10309 from greg0ire/drop-lexer-1
Drop doctrine/lexer 1
2022-12-15 11:54:03 +01:00
michnovka
b3f9acd1bf Clean-up code after PR10288 merge (#10305) 2022-12-15 11:50:18 +01:00
Grégoire Paris
cdc7feccc8 Drop doctrine/lexer 1
This allows us to introduce the TokenType enum that represents the type
of DQL tokens.
2022-12-14 22:15:20 +01:00
Grégoire Paris
275fe31c04 Merge pull request #10308 from greg0ire/3.0.x
Merge 2.14.x up into 3.0.x
2022-12-14 21:38:25 +01:00
Grégoire Paris
8e9ea9e9e0 Merge remote-tracking branch 'origin/2.14.x' into 3.0.x 2022-12-14 20:52:37 +01:00
Alexander M. Turek
92a8453b92 Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Add assertions about non nullability
  Add support for enum discriminator columns
2022-12-14 09:29:24 +01:00
Alexander M. Turek
7fd49b7547 Remove $entityAnnotationClasses and getReader() (#10303) 2022-12-13 23:28:07 +01:00
Alexander M. Turek
8212ba8803 Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Bump coding standard to v11 (#10295)
  PHPStan 1.9.3 (#10298)
  Rename AbstractCommandTest (#10294)
2022-12-13 19:38:01 +01:00
Alexander M. Turek
2bfcb6e5ab Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Fix changeset computation for enum arrays (#10277)
  Psalm 5.2.0 (#10291)
  Run tools on PHP 8.2 (#10287)
2022-12-12 14:15:47 +01:00
Alexander M. Turek
9d8cadf1fc Remove setAccessible() calls (#10286) 2022-12-10 23:18:23 +01:00
Alexander M. Turek
a17809c3b9 Modernize Closure::fromCallable() calls (#10285) 2022-12-10 23:18:10 +01:00
Alexander M. Turek
9dbe3d003a Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Control proxy implementation via env (#10282)
  Fix association mapping with enum fields
  Correct spelling errors
2022-12-10 21:55:54 +01:00
Alexander M. Turek
38c476f704 Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Leverage LazyGhostTrait when possible
  Fix deprecation message (#10270)
2022-12-10 15:27:43 +01:00
Alexander M. Turek
90efde936a Remove InExpression (#10272) 2022-12-06 21:46:53 +01:00
Alexander M. Turek
caaf1509bf Drop support for Symfony 4 (#10259) 2022-12-06 21:46:30 +01:00
Grégoire Paris
9e578a4f0d Migrate AST namespace to PHP 8 syntax (#10219)
* Migrate AST namespace to PHP 8 syntax

* Use typed properties when type is non-object

We know the phpdoc types in that namespace are pretty messed up, but it
should be safe to assume that's only the case when the type is an object
type.
2022-12-05 22:38:16 +01:00
Alexander M. Turek
f1c180ba50 Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Add $not constructor parameter to AST classes (#10267)
2022-12-05 12:26:48 +01:00
Grégoire Paris
8c732120bc Use intersection types (#10255)
We could not do that before, because it would make Psalm crash.
2022-12-04 22:28:19 +01:00
Grégoire Paris
6cf69ec6d1 Merge pull request #10266 from greg0ire/3.0.x
Merge 2.14.x into 3.0.x
2022-12-04 09:34:22 +01:00
Grégoire Paris
67f876372c Merge remote-tracking branch 'origin/2.14.x' into 3.0.x 2022-12-04 00:17:19 +01:00
Alexander M. Turek
f4d658ab7e Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Bump Psalm to 5.0.0 and fix errors for Symfony 6.2 (#10261)
  Make use statements redundant
  Leverage Lexer's Token type (follow up)
2022-11-30 22:10:44 +01:00
Grégoire Paris
7433c3ad47 Merge pull request #10227 from greg0ire/php8-migration-expr
Migrate Expr and Lexer to PHP 8 syntax
2022-11-28 08:03:39 +01:00
Grégoire Paris
4d73e3ce78 Migrate Expr and Lexer to PHP 8 syntax 2022-11-27 22:14:04 +01:00
Grégoire Paris
5afa36097a Merge pull request #10254 from greg0ire/3.0.x
Merge 2.14.x up into 3.0.x
2022-11-26 15:01:01 +01:00
Grégoire Paris
afe010ed0f Merge remote-tracking branch 'origin/2.14.x' into 3.0.x 2022-11-26 14:52:30 +01:00
Grégoire Paris
02f3a93b71 Merge pull request #10243 from greg0ire/php8-migration-persisters
Migrate persisters to PHP 8 syntax
2022-11-22 21:47:05 +01:00
Grégoire Paris
e9f3a43f37 Migrate persisters to PHP 8 syntax 2022-11-21 23:49:34 +01:00
Alexander M. Turek
8c7386fea0 Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Remove fragile assertions (#10239)
  update help for RunDqlCommand (#10233)
  Make the code easier to statically analyse
  Widen parameter type
  Document property as non-nullable
2022-11-20 21:09:46 +01:00
Grégoire Paris
d6b9da008b Merge remote-tracking branch 'origin/2.14.x' into 3.0.x 2022-11-11 16:34:25 +01:00
Alexander M. Turek
436142a1d8 Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Add a constructor to CacheKey (#10212)
  Psalm 4.30.0, PHPStan 1.9.2 (#10213)
  Allow "Expr\Func" as condition in join (#10202)
  refactor: use list type in SchemaTool (#10199)
2022-11-11 11:00:23 +01:00
Grégoire Paris
a8445c9661 Migrate function nodes to PHP 8 syntax (#10214) 2022-11-11 10:49:48 +01:00
Grégoire Paris
bfb9e16fcf Merge pull request #10210 from greg0ire/php8-migration
Migrate Cache namespace to php 8
2022-11-09 00:05:11 +01:00
Grégoire Paris
3d729a768f Stop modifying readonly properties 2022-11-08 23:58:15 +01:00
Grégoire Paris
2f1ed28f09 Migrate cache namespace to php 8 2022-11-08 23:58:15 +01:00
Grégoire Paris
ee1b78441c Purge annotations from /lib (#10203)
* Remove file used by annotation registry

* Remove meta-annotations

They should have been removed when the annotation driver was removed.

* Remove unneeded coding standard rule exclusion

* Remove annotation documentation of indexBy
2022-11-07 12:00:28 +01:00
Grégoire Paris
2cbd674141 Merge remote-tracking branch 'origin/2.14.x' into 3.0.x 2022-11-06 23:02:35 +01:00
michnovka
3182cceda4 EntityManager#refresh lockMode on 3.0.x (#10196) 2022-11-02 16:50:55 +01:00
Alexander M. Turek
71bcd64fb5 Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Remove Doctrine\Persistence\ObjectManager::refresh from Psalm baseline
  Add lockMode to EntityManager#refresh() (#10040)
2022-11-02 00:49:02 +01:00
Alexander M. Turek
c2fa7282ca Merge pull request #10192 from derrabus/remove/annotation
Remove the Annotation interface
2022-10-31 10:24:41 +01:00
Alexander M. Turek
373fd32b0e Remove the Annotation interface 2022-10-31 09:50:08 +01:00
Alexander M. Turek
3865835070 Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Deprecate the Annotation interface (#10178)
  Bump CI to PHP 8.2 and latest database versions (#10180)
  Remove reference to deprecated DriverChain from docs (#10179)
2022-10-31 09:26:10 +01:00
Grégoire Paris
4be38e2dda Remove last remnants of the YAML driver (#10185) 2022-10-26 23:50:26 +02:00
Alexander M. Turek
ba286de3cb Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  PHPStan 1.8.11 (#10182)
  Add isMemberOf and isInstanceOf to Expr helper list (#10104)
  Migrate more references to annotations (#10176)
  Fix grammer in working-with-objects (#10120)
  Automap events in AttachEntityListenersListener (#10122)
  Adapt use statements to the code (#10174)
2022-10-26 12:00:57 +02:00
Alexander M. Turek
31db15f501 Remove DriverChain (#10175) 2022-10-26 10:15:47 +02:00
Grégoire Paris
1f15e3b198 Purge annotations from the codebase and docs (#10177) 2022-10-26 09:37:39 +02:00
Grégoire Paris
189883e267 Merge pull request #10113 from greg0ire/migrate-to-attributes
Migrate to attributes
2022-10-26 07:30:01 +02:00
Alexander M. Turek
ae6524bb2f Bump DBAL to 3.5 and remove BC hacks (#10173) 2022-10-25 23:51:42 +02:00
Grégoire Paris
ef4543df33 Just a little cs fix, no big deal. 2022-10-25 23:32:47 +02:00
Grégoire Paris
d46f67bf95 Add missing ManyToOne attribute
The tests does not behave as expected without it.
2022-10-25 23:32:47 +02:00
Grégoire Paris
bbdbfb807c Run Rector
I used the following config:

<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;
use Rector\Doctrine\Set\DoctrineSetList;

return function (RectorConfig $rectorConfig): void {
    $rectorConfig->paths([
        __DIR__ . '/tests',
    ]);
    $rectorConfig->sets([
        DoctrineSetList::ANNOTATIONS_TO_ATTRIBUTES,
    ]);
};
2022-10-25 23:32:47 +02:00
Grégoire Paris
29aee06e76 Remove annotations that duplicate attributes 2022-10-25 23:32:47 +02:00
Grégoire Paris
f8587c4ed7 Remove annotation driver 2022-10-25 23:32:47 +02:00
Grégoire Paris
9c7f575569 Switch to attribute driver 2022-10-25 23:12:12 +02:00
Alexander M. Turek
adceff29f1 Remove EntityManager::create() (#10172) 2022-10-25 16:59:19 +02:00
Alexander M. Turek
59b7fa2ebc Fix build 2022-10-25 00:22:28 +02:00
Alexander M. Turek
94e3772221 Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Deprecate EntityManager::create() (#9961)
  Address deprecation of SchemaDiff::toSaveSql()
  Address deprecation of SchemaDiff::toSql()
  Use error style for notifications
  Fix calls to AbstractSchemaManager::createSchema() (#10165)
  Fix build with DBAL 3.5 (#10163)
  Adjust comments (#10160)
  Deprecate methods related to the annotation driver
  Use correct link
  Deprecate annotations
  Remove trailing whitespace
  Migrate more documentation towards attributes
  Remove wrong sentence
  Do not export phpstan stuff (#10154)
2022-10-24 23:16:35 +02:00
Alexander M. Turek
8efcaf97eb Add native types to annotation classes (#10151) 2022-10-18 09:39:12 +02:00
Alexander M. Turek
eda69c23bd Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Modernize documentation code
  Add CI jobs for SQLite3 driver (#10141)
  Fix type doc blocks in annotation classes (#10145)
  Fix FieldMapping for generated key (#10144)
  Stop triggering static analysis workflows on tests
2022-10-17 23:29:39 +02:00
Alexander M. Turek
8c00c88818 Merge 2.14.x into 3.0.x (#10140) 2022-10-17 10:26:54 +02:00
Alexander M. Turek
99e07eb11c Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Allow doctrine/event-manager 2 (#10123)
  Psalm 4.29 (#10128)
  Address deprecation of Table::changeColumn() (#10121)
  Make code blocks consistent (#10103)
  Fix change set computation with enums (#10074)
  PHPStan 1.8.8, Psalm 4.28.0 (#10115)
  fix deprecated trigger help comment
2022-10-13 18:01:09 +02:00
Grégoire Paris
5367ce843e Merge pull request #10084 from greg0ire/drop-collections-1 2022-10-10 14:16:46 +02:00
Grégoire Paris
55d58ddb60 Merge pull request #10117 from doctrine/2.14.x
Merge 2.14.x up into 3.0.x
2022-10-10 09:00:45 +02:00
Grégoire Paris
dc2bd9e412 Migrate collections to PHP 8 syntax 2022-10-09 23:29:08 +02:00
Grégoire Paris
7c17bba801 Remove SQL resultset mapping (#10114) 2022-10-09 22:24:18 +02:00
Grégoire Paris
0c6d3ec6e0 Merge remote-tracking branch 'origin/2.14.x' into 3.0.x 2022-10-07 21:40:29 +02:00
Grégoire Paris
813e807ea6 Merge pull request #10112 from greg0ire/dont-instantiate-interface
Do not instantiate interface
2022-10-07 21:38:59 +02:00
Grégoire Paris
cfefa1e9b7 Do not instantiate interface
In DBAL 4.0, Doctrine\DBAL\Exception becomes an interface.
2022-10-07 21:28:57 +02:00
Grégoire Paris
426ab21b69 Merge pull request #10102 from greg0ire/address-dbal-changes 2022-10-06 10:24:21 +02:00
Grégoire Paris
f310e1f5ba Address method rename
See https://github.com/doctrine/dbal/pull/5724
2022-10-06 08:57:32 +02:00
Grégoire Paris
41fd9816e8 Merge remote-tracking branch 'origin/2.14.x' into 3.0.x 2022-10-04 23:38:17 +02:00
Grégoire Paris
5abe6a5875 Merge pull request #10083 from greg0ire/3.0.x
Merge 2.14.x up into 3.0.x
2022-09-30 23:07:19 +02:00
Grégoire Paris
e308b0aee1 Merge remote-tracking branch 'origin/2.14.x' into 3.0.x 2022-09-30 20:02:02 +02:00
Grégoire Paris
38b1fee344 Merge pull request #10048 from greg0ire/php8-migration
Migrate QueryBuilder / ClassMetadataInfo
2022-09-27 23:45:04 +02:00
Grégoire Paris
75a7cc983c Migrate ClassMetadataInfo to PHP 8.1 2022-09-27 08:45:54 +02:00
Grégoire Paris
d62359a009 Migrate QueryBuilder to PHP 8.1 2022-09-22 17:50:12 +02:00
Grégoire Paris
745250942f Merge remote-tracking branch 'origin/2.14.x' into 3.0.x 2022-09-22 16:26:14 +02:00
Alexander M. Turek
f32ae29385 Add types to PersisterHelper (#10053) 2022-09-22 15:34:46 +02:00
Alexander M. Turek
ffd47ce2dd Add types to mapping builders (#10052) 2022-09-22 11:24:05 +02:00
Alexander M. Turek
a3ec3f368f Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  PHPStan 1.8.5, Psalm 4.27.0 (#10033)
  Fix EnumType not being hydrated with HYDRATE_ARRAY (#9995)
  "Strange" return lines in documentation of inheritance-mapping.rst (#10027)
  More strange break lines in inheritance-mapping.rst (#10028)
  Add phpdoc for discriminatorColumn
2022-09-22 08:52:01 +02:00
Grégoire Paris
57054caca5 Merge pull request #10050 from greg0ire/fix-dbal-build
Fix dbal 4 build
2022-09-22 00:09:16 +02:00
Grégoire Paris
965de8b742 Address AbstractSchemaManager::createSchema() removal 2022-09-21 23:54:39 +02:00
Grégoire Paris
1479848714 Specify precision for decimal columns
doctrine/dbal 4 no longer provides a default value for that column
option.
2022-09-21 23:30:11 +02:00
Alexander M. Turek
5fe78f7892 Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Bump Ubuntu version and shared workflows (#10020)
  Make paginator covariant (#10002)
  Fail gracefully if EM could not be constructed in tests (#10008)
2022-08-31 00:01:28 +02:00
Grégoire Paris
cdd79bc764 Merge commit '8dfe8b878' into 3.0.x 2022-08-29 23:18:19 +02:00
Grégoire Paris
52b96538b7 Merge pull request #10011 from greg0ire/cs10-on-3.0
Upgrade to doctrine/coding-standard 10.0 on 3.0.x
2022-08-29 23:16:43 +02:00
Grégoire Paris
4aa3c630df Address DBAL deprecations
- listTableDetails() has been deprecated in favor of introspectTable().
- createSchema() has been deprecated in favor of introspectSchema().
2022-08-29 23:03:28 +02:00
Grégoire Paris
883c8c443f Update baseline 2022-08-29 22:29:28 +02:00
Grégoire Paris
1d3c6d6eb8 Adjust CPP migration 2022-08-29 22:29:28 +02:00
Grégoire Paris
4dcaa2c23b Improve PHPDoc for WhereClause::$conditionalExpression 2022-08-29 22:29:28 +02:00
Grégoire Paris
21e142b9a5 Revert changes that cause test failures 2022-08-29 22:29:28 +02:00
Grégoire Paris
3cd2562626 Upgrade to doctrine/coding-standard 10.0 2022-08-29 22:29:28 +02:00
Alexander M. Turek
28b5dfdb84 Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Bump coding standard to 9.0.2
  Fix tests for doctrine/common 3.4
  Fix static analysis errors for Collections 1.7
  Fix type in docs (#9994)
  Improve orphan removal documentation - recommend using cascade=persist  (#9848)
2022-08-26 13:12:51 +02:00
Alexander M. Turek
41bca04103 Add types to EntityListenerResolver (#9976) 2022-08-08 22:02:40 +02:00
Alexander M. Turek
7abeb9bf00 Merge branch '2.14.x' into 3.0.x
* 2.14.x:
  Backport type fixes for EntityListenerResolver (#9977)
  Undeprecate LifecycleEventArgs (#9980)
  Update documentation to not use deprecated method (#9979)
2022-08-08 21:41:43 +02:00
Alexander M. Turek
7c4442561f Add types to Node::dispatch() (#9978) 2022-08-08 21:30:51 +02:00
Alexander M. Turek
7e45006300 Update Psalm config (#9974) 2022-08-07 22:35:19 +02:00
Alexander M. Turek
c39cbf15be Add types to ProxyFactory (#9962) 2022-08-07 21:37:36 +02:00
Alexander M. Turek
9e304fbe69 Merge 2.14.x into 3.0.x (#9973) 2022-08-07 20:13:52 +02:00
Alexander M. Turek
f9257cdf78 Flag QueryType as internal (#9963) 2022-08-07 19:22:03 +02:00
Alexander M. Turek
0e074e407a Stabilize the DBAL dependency (#9968) 2022-08-07 18:42:52 +02:00
Alexander M. Turek
71cba3d1fe Merge branch '2.13.x' into 3.0.x
* 2.13.x:
  Address DBAL 3.4 deprecations (#9969)
  Improve phpdoc for ClassMetadataInfo (#9965)
  Fix build (#9964)
  fix: class normalisation test (#9966)
  Support native enum hydration when using `NEW` operator (#9936)
2022-08-07 18:22:43 +02:00
Alexander M. Turek
23f5c016cf Resolve QueryBuilder deprecations (#9953) 2022-08-04 22:51:21 +02:00
Alexander M. Turek
1a82e4a294 Drop unmaintained Symfony versions (#9957) 2022-08-04 08:29:29 +02:00
Alexander M. Turek
a0be22b65f Use intersection types in tests (#9959) 2022-08-04 08:28:50 +02:00
Alexander M. Turek
6e5626bbff Flag properties as readonly if possible (#9956) 2022-08-04 08:27:02 +02:00
Alexander M. Turek
6e6b81dcdf Remove obsolete PHP version checks (#9954) 2022-08-04 00:12:00 +02:00
Alexander M. Turek
3c19eb6de2 Require PHP 8.1 (#9925) 2022-08-03 23:01:41 +02:00
Alexander M. Turek
309e48ad54 Merge branch '2.13.x' into 3.0.x
* 2.13.x:
  Deprecate QueryBuilder APIs exposing its internal state (#9945)
  Update branch info in README and .doctrine-project.json (#9943)
  Psalm 4.25.0, PHPStan 1.8.2 (#9941)
  Stop passing event manager to constructor (#9938)
  Use a more precise phpdoc for ClassMetadataInfo::versionField than mixed (#9937)
  Make EntityManager `@final` and its constructor public
2022-08-03 22:48:03 +02:00
Alexander M. Turek
ef82567730 Fix DBAL 4 compatibility (#9950) 2022-08-03 17:05:42 +02:00
Grégoire Paris
61cc67e4b7 Merge pull request #9940 from greg0ire/php8-migration
Migrate UnitOfWork to PHP 8
2022-07-28 18:40:56 +02:00
Grégoire Paris
0c2d1df424 Migrate Configuration class to PHP 8 again 2022-07-28 17:06:29 +02:00
Grégoire Paris
35afdb1c84 Migrate UnitOfWork to PHP 8 2022-07-28 16:16:49 +02:00
Alexander M. Turek
a3a8caae51 Split TreeWalker and SqlWalker (#9551) 2022-07-25 22:27:45 +02:00
Alexander M. Turek
5830736537 Merge branch '2.13.x' into 3.0.x
* 2.13.x:
  Add helper function TreeWalkerAdapter::getMetadataForDqlAlias() (#9932)
  Simplify LanguageRecognitionTest (#9930)
  test/added test for foreign keys with custom id object types
  Widen types for DiscriminatorMap (#9922)
  schema tool: remove useless text from --dump-sql output
  Update IdentifierFlattener.php
  Update IdentifierFlattener.php
2022-07-25 20:59:42 +02:00
Alexander M. Turek
0bfdbe1e2c Add native types to QuoteStrategy classes (#9923) 2022-07-21 10:16:31 +02:00
Alexander M. Turek
d41c4c6cc6 Adjust casing of SQLitePlatform for DBAL 4 (#9924) 2022-07-20 22:14:27 +00:00
Grégoire Paris
2550417804 Merge pull request #9900 from greg0ire/php8-migration
Migrate part of the tools namespace to PHP8 syntax
2022-07-19 20:17:46 +02:00
Grégoire Paris
c44db2cc35 Fulfill ReturnTypeWillChange prophecy 2022-07-19 08:45:48 +02:00
Grégoire Paris
660cb3b6ac Migrate part of the tools namespace to PHP 8 syntax 2022-07-19 08:43:30 +02:00
Grégoire Paris
ad12df8fcc Remove unused exception 2022-07-19 08:43:30 +02:00
Grégoire Paris
b7ff742f84 Throw on error
That way we have some level of error handling, and don't muddy the
return type.
2022-07-19 08:43:29 +02:00
Grégoire Paris
220bfa1da5 Merge pull request #9911 from craigfrancis/3.0.x
Show Expr::countDistinct() and Expr::concat() use variable-length argument lists
2022-07-18 23:36:00 +02:00
Grégoire Paris
80188edbdd Merge remote-tracking branch 'origin/2.13.x' into 3.0.x 2022-07-18 23:06:06 +02:00
Craig Francis
0f98b3d9f2 Update Expr::countDistinct() and Expr::concat() to variable-length argument lists 2022-07-18 21:05:20 +01:00
Grégoire Paris
0b9fb97557 Merge pull request #9851 from greg0ire/php8-migration
Migrate more code to PHP8
2022-07-14 19:49:14 +02:00
Grégoire Paris
214a912b37 Migrate more code to PHP8 2022-07-14 19:26:22 +02:00
Grégoire Paris
990a1fe952 Merge pull request #9885 from greg0ire/fix-build 2022-07-13 12:10:19 +02:00
Grégoire Paris
1ac9d52332 Ignore errors caused by nullable assets filter 2022-07-12 20:24:19 +02:00
Grégoire Paris
1fa1e7072b Address removal/deprecation of ArrayType/ObjectType 2022-07-12 20:24:19 +02:00
Grégoire Paris
68dc5fe901 Rely on platform options
Custom schema options have been removed in doctrine/dbal 4
2022-07-12 20:24:19 +02:00
Grégoire Paris
db9c43feea Merge remote-tracking branch 'origin/2.13.x' into fix-build 2022-07-12 20:24:16 +02:00
Alexander M. Turek
9e0c7de24e Merge branch '2.13.x' into 3.0.x
* 2.13.x:
  Psalm 4.24.0, PHPStan 1.7.15 (#9865)
  PHP CodeSniffer 3.7.1, PHPStan 1.7.14 (#9858)
2022-06-28 15:42:44 +02:00
Alexander M. Turek
07fa660a47 Fix broken mocks due to removal of Driver::getSchemaManager() (#9869) 2022-06-28 15:30:59 +02:00
Grégoire Paris
734a1c63a2 Merge pull request #9852 from MarcBrillault/internal-php8
Migrate Internal namespace to PHP8
2022-06-18 21:40:27 +02:00
Marc Brillault
e22f02f198 Migrate Internal namespace to PHP8 2022-06-17 19:20:57 +02:00
Alexander M. Turek
318e6ec067 Merge branch '2.13.x' into 3.0.x
* 2.13.x:
  Deprecate omitting the alias in QueryBuilder (#9765)
  Run tests on PHP 8.2 (#9840)
  PHPStan 1.7.13 (#9844)
  Flip conditional extension of legacy AnnotationDriver class (#9843)
  PHP CodeSniffer 3.7 (#9842)
  Make Reflection available to ConvertMappingCommand (#9619)
  Add missing property declaration
  Use proper API for introspection of tables
2022-06-17 10:42:13 +02:00
Grégoire Paris
af1303ec96 Merge pull request #9835 from greg0ire/php8-configuration
Migrate Configuration to PHP 8 syntax
2022-06-15 07:33:19 +02:00
Grégoire Paris
5ecf9e9202 update psalm baseline 2022-06-14 15:03:06 +02:00
Grégoire Paris
d52f9ee87e Migrate Configuration to PHP 8 syntax 2022-06-14 15:01:25 +02:00
Grégoire Paris
78c9490212 Merge pull request #9838 from greg0ire/remove-identity-columns-emulation
Stop allowing identity columns emulation
2022-06-11 18:10:45 +02:00
Grégoire Paris
2d230ce033 Stop allowing identity columns emulation
That feature has been deprecated.
2022-06-10 21:14:10 +02:00
Grégoire Paris
894dc4fc8f Merge pull request #9836 from greg0ire/3.0.x
Merge 2.13.x up into 3.0.x
2022-06-10 21:00:51 +02:00
Grégoire Paris
ec6ada4935 Merge remote-tracking branch 'origin/2.13.x' into 3.0.x 2022-06-10 20:14:33 +02:00
Grégoire Paris
646cbf6d30 Merge pull request #9828 from MarcBrillault/schema-validator-php8
migrate Tools/Schema* to php8.0
2022-06-10 09:12:06 +02:00
Grégoire Paris
47d9d46304 Merge pull request #9834 from doctrine/2.13.x
Merge 2.13.x up into 3.0.x
2022-06-10 00:01:53 +02:00
Grégoire Paris
2f16062f78 Merge pull request #9832 from greg0ire/enable-test-dbal-4
Run test with DBAL 4
2022-06-09 21:32:32 +02:00
Marc Brillault
e22bfec6b6 migrate Tools/Schema* to php8.0
refs #9772
2022-06-09 21:19:18 +02:00
Grégoire Paris
bf24177bfd Run test with DBAL 4 2022-06-09 21:16:36 +02:00
Grégoire Paris
62eb3bd96c Merge pull request #9829 from MarcBrillault/fix-build
Address removals of doctrine-dbal
2022-06-09 21:12:23 +02:00
Grégoire Paris
e1ebd77811 Run test only with DBAL 3
With DBAL 4, there is no longer a filtering of assets.
2022-06-09 19:40:41 +02:00
Grégoire Paris
69253bc083 Use a better check for the DBAL version
It seems AbstractPlatform::getGuidExpression() cannot do the trick, as
it is missing from both branches.
2022-06-09 19:40:41 +02:00
Grégoire Paris
36b35f99a4 Run foreign key tests on all platforms
SQLite now supports foreign keys.
2022-06-09 17:14:36 +02:00
Marc Brillault
a91d208d10 Address removals of doctrine-dbal
- Doctrine\DBAL\Schema\Visitor\RemoveNamespacedAssets
- Doctrine\DBAL\Schema\Schema::visit
- Doctrine\DBAL\Tools\Console\Command\ReservedWordsCommand
2022-06-09 17:14:14 +02:00
Grégoire Paris
89dd9dd9ed Merge pull request #9815 from greg0ire/fix-deprecation-fk
Address deprecation of supportsForeignKeyConstraints()
2022-06-03 21:43:15 +02:00
Grégoire Paris
068da9d89f Address deprecation of supportsForeignKeyConstraints()
All platforms are supposed to support foreign key constraints now.
2022-06-03 21:24:19 +02:00
Grégoire Paris
53661fefc9 Merge pull request #9776 from greg0ire/native-types-abstract-query
Migrate to PHP 8: AbstractQuery and child classes
2022-06-03 20:53:45 +02:00
Grégoire Paris
d462ed3b4d Update baseline 2022-06-03 20:51:21 +02:00
Grégoire Paris
4a02a79abb Remove unneeded checks
Both array and ArrayCollection are countable.
2022-06-03 20:51:15 +02:00
Grégoire Paris
2ee4482d00 Remove deprecation when wrong fetch mode is used 2022-06-03 20:51:10 +02:00
Grégoire Paris
9f4339e7dc Run rector 2022-06-03 20:06:39 +02:00
Alexander M. Turek
7e20e97ee0 Remove MockBuilderCompatibilityTools (#9814) 2022-06-03 19:57:49 +02:00
Grégoire Paris
86d23f42db Add native types to AbstractQuery 2022-06-03 19:57:23 +02:00
Alexander M. Turek
b8299feae0 Merge branch '2.13.x' into 3.0.x
* 2.13.x:
  PHPStan 1.7.9 (#9812)
  Remove empty test file (#9805)
  Remove calls to deprecated MockBuilder::setMethods() (#9808)
  Deprecate passing null to Query::setFirstResult()
  Rename Abstract*Test to *TestCase (#9806)
  Add primary key on temp table (#9770)
  Fix wrong types (#9802)
  Widen return type
  Update baseline
  Fix
  Add type for AssociationMapping
2022-06-03 13:36:16 +02:00
Grégoire Paris
ec03eb3451 Merge pull request #9800 from greg0ire/rector-tests
Migrate tests to PHP8 syntax
2022-06-02 08:36:34 +02:00
Grégoire Paris
4117209b69 Revert to normal properties
The order is not the same as in the constructor, and that seems to
matter.
2022-06-02 07:24:48 +02:00
Grégoire Paris
a870290575 Add test to exclude rule 2022-06-02 07:24:48 +02:00
Grégoire Paris
e7a466b708 fix cs 2022-06-02 07:24:48 +02:00
Grégoire Paris
66ae30085b Adjust expectations 2022-06-01 22:51:13 +02:00
Grégoire Paris
c49636c923 Revert to untyped property
This causes "Cannot assign string to property
Doctrine\Tests\Models\Cache\ComplexAction::$action2 of type
Doctrine\Tests\Models\Cache\Action" for some reason.
2022-06-01 22:51:13 +02:00
Grégoire Paris
2f6303faef Revert to untyped property
This causes the following error for some reason:
Typed property Doctrine\Tests\ORM\Functional\TrainOrder::$train must not
be accessed before initialization
2022-06-01 22:51:13 +02:00
Grégoire Paris
8d4c3d3a34 Fix wrong types 2022-06-01 22:51:13 +02:00
Grégoire Paris
d212e52a20 Migrate tests to PHP 8 2022-06-01 22:51:11 +02:00
Grégoire Paris
301892bcff Merge remote-tracking branch 'origin/2.13.x' into 3.0.x 2022-06-01 22:44:52 +02:00
Alexander M. Turek
62892dc4e4 Made setters parameters mandatory (#9798) 2022-05-31 07:58:35 +02:00
Alexander M. Turek
f08aa92da0 Merge branch '2.13.x' into 3.0.x
* 2.13.x:
  Add missing import (#9796)
  Deprecate calling setters without arguments (#9791)
  Move duplicate fixture into dedicated file (#9789)
  MockTreeWalker should be an SqlWalker (#9790)
2022-05-31 00:43:58 +02:00
Vincent Langlet
e5fe46a051 Precise phpdoc of getRootEntities (#9778)
* Precise phpdoc of getRootEntities

* Restrict from param

* Prefer phpdoc
2022-05-30 20:43:24 +02:00
Alexander M. Turek
0c8808a57a Merge branch '2.13.x' into 3.0.x
* 2.13.x:
  Make phpdoc more precise
  Deprecate setting fetch mode to random integers
  Prepare split of output walkers and tree walkers (#9786)
  PHPStan 1.7.0 (#9785)
  Deprecate passing null to Query::setDQL()
  Kill call_user_func(_array) (#9780)
  Fix wrong types for AbstractQuery and child classes (#9774)
  Document callable as possible
  Remove override phpdoc tag
  Add use statement (#9769)
2022-05-24 21:16:11 +02:00
Grégoire Paris
9384ca8e20 Merge pull request #9755 from greg0ire/mandatory-class-name-arg
Require new argument to joinColumnName()
2022-05-20 22:00:16 +02:00
Grégoire Paris
5e536ed412 Require new argument to joinColumnName() 2022-05-20 21:53:02 +02:00
Grégoire Paris
bb1fdcfa77 Merge pull request #9767 from greg0ire/3.0.x
Merge 2.13.x up into 3.0.x
2022-05-18 21:05:11 +02:00
Grégoire Paris
b91825bc73 Remove static PHP driver
It is deprecated in favor of its parent class.
2022-05-18 20:58:46 +02:00
Grégoire Paris
e879ce0b12 Merge remote-tracking branch 'origin/2.13.x' into 3.0.x 2022-05-18 08:02:06 +02:00
Grégoire Paris
c8735de2c1 Merge pull request #9758 from greg0ire/native-types-ns 2022-05-17 11:47:06 +02:00
Grégoire Paris
98cf5836fd Use native type declarations for naming strategies 2022-05-17 09:16:50 +02:00
Grégoire Paris
72810e9c05 Use createSchemaForModels()
This allows to get rid of tearDown(), which contained a special handling
that is no longer necessary since we switched away from explicitely
managed sequences, and caused the test suite to fail.
2022-05-16 22:38:59 +02:00
Grégoire Paris
3404ac174e Merge remote-tracking branch 'origin/2.13.x' into 3.0.x 2022-05-16 22:02:37 +02:00
Grégoire Paris
60f59b29ed Merge pull request #9757 from greg0ire/3.0.x
3.0.x
2022-05-12 09:24:53 +02:00
Grégoire Paris
0f7ae0a660 Merge remote-tracking branch 'origin/2.13.x' into 3.0.x 2022-05-12 09:06:58 +02:00
Alexander M. Turek
d294e1d453 Add native types to reflection property classes (#9631) 2022-05-11 20:34:49 +02:00
Grégoire Paris
1c97f970eb Merge pull request #9741 from greg0ire/number-aware-only
Make UnderscoreNamingStrategy number-aware only
2022-05-11 20:33:36 +02:00
Grégoire Paris
8117f42634 Make UnderscoreNamingStrategy number-aware only 2022-05-11 20:12:16 +02:00
Alexander M. Turek
e83404e57d Update Psalm baseline 2022-05-11 12:31:17 +02:00
Alexander M. Turek
499409dbc1 Merge branch '2.13.x' into 3.0.x
* 2.13.x:
  Update Psalm baseline (#9751)
  Omit version number in README (#9749)
2022-05-11 12:30:18 +02:00
Grégoire Paris
3da3becc24 Merge pull request #9750 from doctrine/2.13.x 2022-05-10 11:52:23 +02:00
Sergei Morozov
a711fad058 Merge pull request #9742 from morozov/dbal-4@dev-static-analysis
Run static analysis with DBAL 4@dev
2022-05-08 12:49:49 -07:00
Sergei Morozov
2e856599b3 Run static analysis with DBAL 4@dev 2022-05-08 12:23:35 -07:00
Sergei Morozov
0119d8cbbc Accommodate API changes in the Column class
See https://github.com/doctrine/dbal/pull/3511
2022-05-08 11:54:22 -07:00
Sergei Morozov
d8159b8be2 Suppress known issues related to sequence-based identity generation
See https://github.com/doctrine/orm/issues/8850
2022-05-08 11:50:55 -07:00
Sergei Morozov
10442a7b4e Assert that date interval expressions are numeric strings
See https://github.com/doctrine/dbal/pull/3498
2022-05-08 11:50:55 -07:00
Sergei Morozov
413e2a79fb Separate PHPStan configuration for DBAL 4
See https://github.com/doctrine/dbal/pull/3480
2022-05-08 11:50:24 -07:00
Grégoire Paris
cfb0f7ffa7 Merge pull request #9738 from greg0ire/uuid-traces
Address some deprecations
2022-05-08 11:11:31 +02:00
Sergei Morozov
7e9ef10f67 Merge pull request #9740 from morozov/dbal-4@dev-pgsql
Build with DBAL 4@dev on PostgreSQL
2022-05-07 13:54:52 -07:00
Sergei Morozov
38f3d71a2f Merge pull request #9735 from morozov/dbal-4@dev-mysql
Build with DBAL 4@dev on MySQL and MariaDB
2022-05-07 13:54:37 -07:00
Sergei Morozov
9eba533f7c Build with DBAL 4@dev on PostgreSQL 2022-05-07 12:47:26 -07:00
Sergei Morozov
9acdac02cf Account for DBAL 4 no longer reordering table columns
See https://github.com/doctrine/dbal/pull/4777
2022-05-07 12:45:15 -07:00
Sergei Morozov
dfb7c1cc38 Build with DBAL 4@dev on MySQL and MariaDB 2022-05-07 08:11:56 -07:00
Sergei Morozov
702b491981 Account for DBAL 4 no longer reordering table columns
See https://github.com/doctrine/dbal/pull/4777
2022-05-07 08:11:56 -07:00
Sergei Morozov
44207c1628 Cast port in PHPUnit configuration to int
See https://github.com/doctrine/dbal/pull/2854
2022-05-07 08:11:01 -07:00
Sergei Morozov
85cfd10cae Merge branch '2.13.x' into 3.0.x 2022-05-07 07:59:50 -07:00
Grégoire Paris
6ead3a5cbb Make targetEntity mandatory 2022-05-07 15:47:05 +02:00
Grégoire Paris
e1586ea6cb Remove deprecated class 2022-05-07 15:45:56 +02:00
Grégoire Paris
72d88a2d69 Address deprecations 2022-05-07 15:41:11 +02:00
Grégoire Paris
3f5a1054a8 Remove remnants of UuidGeneratorStrategy 2022-05-07 15:38:41 +02:00
Sergei Morozov
134f12f419 Merge pull request #9734 from morozov/dbal-4.0.x-dev
Build with DBAL 4@dev on SQLite
2022-05-06 06:51:16 -07:00
Sergei Morozov
f3113f1a2f Build with DBAL 4@dev on SQLite 2022-05-06 06:36:23 -07:00
Alexander M. Turek
5d860bfc9b Merge pull request #9727 from morozov/dbal-4.0.x-dev
Run builds with DBAL 4.0.x-dev
2022-05-06 08:25:43 +02:00
Sergei Morozov
aa8c2937d7 Catch exception from Connection::commit() 2022-05-05 22:14:02 -07:00
Sergei Morozov
38e954248c Improve mocks 2022-05-05 22:14:02 -07:00
Sergei Morozov
6c64f7db34 Quote only strings
See https://github.com/doctrine/dbal/pull/3488
2022-05-05 22:14:01 -07:00
Sergei Morozov
d4a9015c2b Look up only string parameter types
See https://github.com/doctrine/dbal/pull/3569
2022-05-05 22:14:01 -07:00
Sergei Morozov
0c745d9021 Pass column name as part of the definition
See https://github.com/doctrine/dbal/pull/3583
2022-05-05 22:14:00 -07:00
Sergei Morozov
6ef4b5f396 Merge branch '2.13.x' into 3.0.x 2022-05-05 15:54:14 -07:00
Alexander M. Turek
ee83302751 Merge branch '2.13.x' into 3.0.x
* 2.13.x:
  Allow doctrine/deprecations 1.0 (#9723)
  Allow setting column options like `charset` and `collation` everywhere (#9655)
  Fix psalm annotation
2022-05-05 18:09:05 +02:00
Sergei Morozov
7e83c9231d Merge pull request #9728 from morozov/phpunit-mysql-table-options
Test MySQL DDL using explicit table options
2022-05-04 12:23:54 -07:00
Sergei Morozov
f5e922ed92 Test MySQL DDL using explicit table options 2022-05-04 09:23:13 -07:00
Sergei Morozov
3c41e421de Remove ConnectionMock (#9724)
* Remove ConnectionMock::getExecuteStatements()

* Remove ConnectionMock::quote()

* Remove ConnectionMock
2022-05-02 21:30:40 +00:00
Grégoire Paris
4c2950a9da Remove last references to ClassMetadataInfo (#9713)
* Remove disconnected class metadata factory

It is unused apart from a tests where it is easily replaced.

* Remove ClassMetadataInfo

It has been deprecated for a long, long time.
2022-05-02 19:55:42 +02:00
Sergei Morozov
b8d3929dce Remove DriverResultMock (#9722) 2022-05-02 18:31:33 +02:00
Sergei Morozov
a8b4f05418 Remove ConnectionMock::delete() (#9717) 2022-05-02 17:14:18 +02:00
Sergei Morozov
f671fa8477 Remove DatabasePlatformMock (#9716) 2022-05-02 16:56:16 +02:00
Alexander M. Turek
53e8674899 Merge branch '2.13.x' into 3.0.x
* 2.13.x:
  Psalm 4.23, PHPStan 1.6.3 (#9718)
2022-05-02 11:18:49 +02:00
Sergei Morozov
11049b441e Remove some mock classes (#9715) 2022-05-01 21:28:30 +00:00
Sergei Morozov
6fe69f16e2 Remove non-API DriverConnectionMock methods (#9709) 2022-05-01 22:37:32 +02:00
Grégoire Paris
8353e981be Merge remote-tracking branch 'origin/2.13.x' into 3.0.x 2022-05-01 22:24:36 +02:00
Sergei Morozov
ae76d91437 Merge branch '2.13.x' into 3.0.x 2022-05-01 12:27:51 -07:00
Sergei Morozov
04830b787c Merge pull request #9705 from morozov/remove-require-conversion
Remove support for Type::canRequireSQLConversion()
2022-05-01 11:42:42 -07:00
Sergei Morozov
fa844b1274 Remove support for Type::canRequireSQLConversion() 2022-04-30 12:07:31 -07:00
Grégoire Paris
3043dcc823 Merge remote-tracking branch 'origin/2.13.x' into 3.0.x 2022-04-29 08:57:20 +02:00
Grégoire Paris
7f2dd9bea1 Remove invalid mapping
The named queries feature has been removed in 3.0
2022-04-27 11:47:51 +02:00
Alexander M. Turek
01edf115db Merge branch '2.13.x' into 3.0.x
* 2.13.x:
  PHPStan 1.6.1 (#9688)
  Drop SymfonyStyle[listing] for sqls (#9679)
  Remove dynamic property declarations (#9683)
  PHPStan 1.6.0 (#9682)
  Validate XML mapping against XSD file
  Document ORM drivers only really load ORM metadata
  Fix HydrationException::invalidDiscriminatorValue parameter type (#9676)
  Fix type on ClassMetadata discriminatorMap (#9675)
2022-04-27 10:30:29 +02:00
Alexander M. Turek
aebd3f30cb Remove the doctrine binary (#9662) 2022-04-22 22:46:50 +02:00
Alexander M. Turek
801a7504a6 Merge branch '2.13.x' into 3.0.x
* 2.13.x:
  Conditionally extend the old AnnotationDriver class (#9671)
2022-04-22 20:12:06 +02:00
Alexander M. Turek
a5ad24c0fd Drop support for persistence 2 (#9665)
* Drop support for persistence 2

* Switch to the common static analysis job
2022-04-22 20:09:39 +02:00
Alexander M. Turek
682b4e39fb Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Deprecate the doctrine binary (#9661)
  ScalarColumnHydrator: prevent early-bail on falsy values (#9663)
  Fix enum hydration when fetching partial results (#9657)
2022-04-19 21:34:02 +02:00
Alexander M. Turek
046683ab60 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Indicate support for doctrine/persistence 3 (#9656)
  Fix tests for enum ID hydration (#9658)
  Revert "Use charset/collation from column or table default when creating relations (#9636)"
  Fix test file/class names (#9649)
2022-04-15 13:22:31 +02:00
Alexander M. Turek
29a3495c8b Remove console helper (#9640) 2022-04-11 12:43:41 +02:00
Alexander M. Turek
b2ca75e074 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Leverage generic persistence event classes (#9633)
  Fix static analysis for Persistence 2.5 (#9648)
  Improve exception message (#9646)
  Deprecate console helper (#9641)
  Use charset/collation from column or table default when creating relations (#9636)
  Support Enum IDs and search by Enum fields (#9629)
  Fix composer install in contributing readme
2022-04-11 12:07:29 +02:00
Grégoire Paris
16748bdee9 Merge pull request #7196 from greg0ire/document_exception_split_bc_breaks
Document exception-splitting-related BC-breaks
2022-04-10 12:12:29 +02:00
Grégoire Paris
7ef5f7004d Document exception-splitting-related BC-breaks
Closes #7194
2022-04-09 11:10:59 +02:00
Alexander M. Turek
b7ff9db6e7 Remove deprecated handling of custom ObjectRepository implementations (#9634) 2022-04-08 01:25:27 +02:00
Alexander M. Turek
953c63392c Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Deprecate custom ObjectRepository implementations (#9533)
  Fix types on walkLiteral() and walkLikeExpression() (#9566)
2022-04-06 13:59:44 +02:00
Alexander M. Turek
476a6ba935 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Add support for array of enums (#9497)
  explicitly use the non-deprecated ORMException
2022-04-05 13:05:28 +02:00
Alexander M. Turek
6e65db5d2d Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Fix types on ResultSetMapping (#9621)
2022-04-04 22:14:14 +02:00
Alexander M. Turek
30591eaf56 Add native types to ResultSetMapping (#9620) 2022-04-04 17:36:54 +02:00
Alexander M. Turek
435587c260 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Support enums as default values (#9616)
  Skip tests requiring ObjectManagerAware (#9612)
  Remove "Description of" PHPDoc (#9611)
2022-03-31 00:19:16 +02:00
Alexander M. Turek
6a15af599c Remove support for ObjectManagerAware (#9614) 2022-03-28 21:07:55 +02:00
Alexander M. Turek
6ba0455129 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Update psalm.xml
  PHPStan 1.5.0 (#9607)
  Remove Sphinx config
  Indicate what feature is deprecated
  Implement int-mask-of where appropriate
  Use correct syntax for external links
  Update XmlExporter.php - Type problem in php8.x (#9589)
  Ignore deprecation from Persistence
  Stands with Ukraine (#9567)
  Use internal links when self-referencing
  Link to docs for the stable version
2022-03-28 10:51:09 +02:00
Grégoire Paris
793a3e3b75 Merge pull request #9597 from greg0ire/drop-ns-aliases
Remove support for entity namespace aliases
2022-03-20 19:15:30 +01:00
Grégoire Paris
a02dad303c Remove support for entity namespace aliases 2022-03-20 15:38:36 +01:00
Grégoire Paris
fc7e1c4e39 Merge remote-tracking branch 'origin/2.12.x' into 3.0.x 2022-03-20 14:38:53 +01:00
Grégoire Paris
032dd3289a Merge remote-tracking branch 'origin/2.12.x' into 3.0.x 2022-03-20 12:37:58 +01:00
Grégoire Paris
ab991de8a2 Merge remote-tracking branch 'origin/2.12.x' into 3.0.x 2022-03-19 13:47:54 +01:00
Alexander M. Turek
f14f5dc72c Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Leverage MemcachedAdapter::isSupported() (#9578)
  Baseline Psalm errors caused by DBAL 3.3.3 (#9577)
  Make sure MemcachedAdapter is supported before tring to use it (#9574)
  Fixing `:doc:` link (#9569)
  Adding PHP attributes (#9555)
  Remove reference to removed class
2022-03-11 00:06:20 +01:00
Alexander M. Turek
35615ef60e Merge pull request #9559 from doctrine/2.12.x 2022-03-03 20:30:55 +01:00
Alexander M. Turek
7f51f6d6ad Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Leverage Lexer's Token type
2022-03-01 00:12:27 +01:00
Alexander M. Turek
9ddd82bc3c Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Update baselines for Lexer 1.2.3 (#9546)
2022-02-28 14:13:43 +01:00
Alexander M. Turek
4292d8e0e6 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Document QueryComponent array shape (#9527)
  Improve templating
  Un-deprecate the current proxy mechanism (#9532)
  Remove unused methods
  Fix bug-#9536
2022-02-25 15:05:03 +01:00
Alexander M. Turek
5ebe984194 Add native types to SQLFilter (#9524) 2022-02-24 11:15:21 +01:00
Grégoire Paris
1712e3cbd0 Merge remote-tracking branch 'origin/2.12.x' into 3.0.x 2022-02-22 18:14:53 +01:00
Alexander M. Turek
87b894ea22 Leverage the Stringable interface (#9535) 2022-02-22 00:47:51 +01:00
Alexander M. Turek
597460d5ea Add native types to caches (#9508) 2022-02-22 00:47:00 +01:00
Alexander M. Turek
d739e44ee6 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Make creating test models more straightforward
  Trigger the desired code path
  Fix syntax typo in attributes reference (#9513)
  Constructor-Argument "options" has the same type as the associated property. (#9501)
2022-02-20 12:23:23 +01:00
Alexander M. Turek
6b33fa6ddd Add native types to EntityRepository (#9515) 2022-02-17 23:38:31 +01:00
Alexander M. Turek
3a9cc3d258 Remove TreeWalkerChainIterator (#9520) 2022-02-16 09:19:54 +01:00
Alexander M. Turek
dd4a38ce9f Merge 2.12.x into 3.0.x (#9518) 2022-02-15 23:11:54 +01:00
Alexander M. Turek
4158915af3 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Fix types on caches (#9507)
  Fix AbstractQuery::setParameter phpdoc (#9504)
  Added "false" value to $columnPrefix type declaration. (#9493)
2022-02-14 09:48:56 +01:00
Alexander M. Turek
954439af64 Remove quoting methods from ClassMetadata (#9500) 2022-02-11 21:09:32 +01:00
Alexander M. Turek
a74807aa86 Add native types to persisters (#9469) 2022-02-11 02:13:58 +01:00
Alexander M. Turek
0d4281ddfa Add native types to QueryBuilder (#9490) 2022-02-10 23:34:28 +01:00
Alexander M. Turek
32214ddaa6 Remove various deprecated methods and properties (#9498) 2022-02-10 09:33:11 +01:00
Alexander M. Turek
3a43f924c6 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Fix types on QueryBuilder (#9492)
  Fix types on EntityRepository (#9474)
  Avoid calling merge() (#9489)
  PHPStan 1.4.6, Psalm 4.20.0 (#9491)
  Fix `#[DiscriminatorMap]` params (#9487)
  Run tests with stricter error handling (#9482)
2022-02-09 01:05:25 +01:00
Alexander M. Turek
d13d0f5848 Remove ability to merge detached entities (#9488) 2022-02-09 00:43:44 +01:00
Alexander M. Turek
fd83543026 Remove ability to flush the EM partially (#9485) 2022-02-07 22:29:51 +01:00
Alexander M. Turek
607911ff27 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Modernize strpos() calls (#9480)
  Fix types on persisters (#9466)
  Rename DoctrineSetup to ORMSetup (#9481)
  Remove useless catches
2022-02-07 09:41:12 +01:00
Alexander M. Turek
e6f07fa0b1 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Deprecate methods removed in 3.0 (#9475)
  Skip tests related to PersistentObject if that class is missing (#9472)
  Run Postgres 14 and MariaDB 10.6 in CI (#9470)
2022-02-05 23:00:32 +01:00
Alexander M. Turek
1c67f4274b Remove ability to clear the UoW partially (#9471) 2022-02-05 18:00:37 +01:00
Alexander M. Turek
5efdff2a4f Remove PHP 7 code (#9462) 2022-02-02 22:53:48 +01:00
Alexander M. Turek
b15b95ee8f Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Check requirements for metadata drivers (#9459)
  PDO is not a required extension (#9457)
  Check requirements for metadata drivers (#9452)
  Remove trailing underscore (#9446)
2022-02-01 22:15:51 +01:00
Alexander M. Turek
b0a351f55a Remove support for Doctrine Cache (#9456) 2022-02-01 13:47:39 +01:00
Alexander M. Turek
1ea83e5774 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Support enums in findBy() calls (#9453)
  Streamline cache creation in tests (#9451)
2022-01-31 23:13:42 +01:00
Alexander M. Turek
4244dfe0a2 Add more native types to entity manager implementations (#9450) 2022-01-31 22:42:21 +01:00
Alexander M. Turek
e7e9db8cee Remove deprecated Setup class (#9447) 2022-01-31 09:11:39 +01:00
Alexander M. Turek
6b53ac6790 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Document the new DoctrineSetup class (#9448)
2022-01-31 09:09:23 +01:00
Alexander M. Turek
9872d1c997 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Introduce DoctrineSetup as a replacement for Setup (#9443)
  Introduce __unserialize behaviour in docs (#9390)
  Adapt test logic to PHP and SQLite II (#9442)
  Use the identify generator strategy
  Added php 8.1 to CI
  Psalm 4.19.0, PHPStan 1.4.3 (#9438)
  Ignore PHPUnit result cache everywhere (#9425)
2022-01-31 00:02:14 +01:00
Ahmadou Waly NDIAYE
31b7d78516 Removing the deprecated Named (Native) Queries in Metadata/EntityRepository (#9428)
This feature has been deprecated.
2022-01-30 15:57:12 +01:00
Alexander M. Turek
36dcf15ebc Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Introduce assertQueryCount (#9423)
2022-01-24 11:44:27 +01:00
Alexander M. Turek
56021c1af9 Remove DBAL 2 compatible SQL logging (#9422) 2022-01-24 08:09:53 +01:00
Alexander M. Turek
1d8dd53995 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Add support for PHP 8.1 enums in embedded classes (#9419)
  Switch tests to the middleware logging system (#9418)
  Added class-string typehint on $targetEntity (#9415)
  Allow DiscriminatorColumn with length=0 (#9410)
  Move UnderscoreNamingStrategyTest to correct namespace (#9414)
2022-01-24 00:13:13 +01:00
Alexander M. Turek
7375c8a058 Remove old cache accessors and mutators from query classes (#9392) 2022-01-23 21:29:47 +01:00
Alexander M. Turek
f61d5c24ac Remove check for getSQLResultCasing() (#9413) 2022-01-20 16:46:37 +01:00
Alexander M. Turek
7c17c11a04 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Fix types on CacheLogger implementations (#9401)
  Rework some tests that use hardcoded DBAL mocks (#9404)
2022-01-20 15:32:29 +01:00
Alexander M. Turek
d4f5db4b8a Add native types to CacheLogger implementations (#9400) 2022-01-20 10:27:21 +01:00
Alexander M. Turek
be4f88c811 Add native types to EntityHydrator (#9396) 2022-01-19 23:41:57 +01:00
Alexander M. Turek
6f150a343b Remove MultiGetRegion and add native types to Region implementations (#9403) 2022-01-19 23:41:26 +01:00
Sergei Morozov
30ea3a26d0 Merge pull request #9402 from morozov/dbal-4.0.x-types
Make test types compatible with Doctrine DBAL 4.0.x-dev
2022-01-18 15:53:20 -08:00
Sergei Morozov
cb3f554e38 Make test types compatible with Doctrine DBAL 4.0.x-dev 2022-01-18 15:33:48 -08:00
Alexander M. Turek
3999837279 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Deprecate MultiGetRegion (#9397)
  Fix type on loadCacheEntry (#9398)
  Update baselines for DBAL 3.3 (#9393)
  Accessing private properties and methods from the same class is forbidden (#9311)
  Expose enumType to DBAL to make native DB Enum possible (#9382)
2022-01-18 23:38:49 +01:00
Alexander M. Turek
9d3ad08a82 Stabilize DBAL dependency (#9395) 2022-01-18 10:39:40 +01:00
Alexander M. Turek
a21843f974 Remove AbstractIdGenerator::generate() (#9367)
… and add native types to ID generators
2022-01-17 23:19:58 +01:00
Alexander M. Turek
fd2bab9b11 Merge branch '2.12.x' into 3.0.x
* 2.12.x:
  Allow using Enum from different namespace than Entity (#9384)
  Corrected ORM version and added missing dependency (#9386)
  PHPStan 1.4.0 (#9385)
  [GH-9380] Bugfix: Delegate ReflectionEnumProperty::getAttributes(). (#9381)
  Support enum cases as parameters (#9373)
  Add detach as of list cascade-all operations (#9357)
2022-01-17 11:58:21 +01:00
Alexander M. Turek
7d8134ca36 Merge release 2.11.0 into 3.0.x (#9369) 2022-01-12 14:38:36 +01:00
Alexander M. Turek
fc287b2943 Merge branch '3.0.x' into 2.11.x-merge-up-into-3.0.x_gaayDumb 2022-01-12 14:31:05 +01:00
Alexander M. Turek
4b1a419883 Remove Configuration::ensureProductionSettings() (#9358) 2022-01-12 14:29:07 +01:00
Alexander M. Turek
002587824e Merge branch '2.11.x' into 3.0.x
* 2.11.x:
  Use EntityManagerInterface in type declarations (#9325)
  Add errors caused by the lexer update to the baselines (#9360)
  Generated/Virtual Columns: Insertable / Updateable (#9118)
  Remove the composer/package-versions-deprecated package
  Relax assertion to include null as possible outcome (#9355)
2022-01-12 11:10:49 +01:00
Alexander M. Turek
96241294bb Add native types to AbstractHydrator and child classes (#9353) 2022-01-12 10:57:33 +01:00
Alexander M. Turek
9f85e2769c Add native types to command classes (#9359) 2022-01-11 08:53:17 +01:00
Alexander M. Turek
cf62f931d9 Merge branch '2.11.x' into 3.0.x
* 2.11.x:
  Leverage generic ObjectManagerDecorator (#9312)
  Fix WhereInWalker description to better describe the behaviour of this class (#9268)
  Regenerate Psalm baseline
  Update Psalm baseline for Persistence 2.3 (#9349)
  Support readonly properties for read operations (#9316)
2022-01-10 00:02:21 +01:00
Alexander M. Turek
1af202bf10 Remove support for Doctrine Cache in second level cache (#9348) 2022-01-09 18:25:51 +01:00
Alexander M. Turek
98331a662f Merge branch '2.11.x' into 3.0.x
* 2.11.x:
  PHPStan 1.3.3, Psalm 4.18.1
  Remove Psalm job for analyzing DBAL 2
  Use the readonly annotation (#9340)
  Add support for custom types with requireSQLConversion and ResultSetMappingBuilder::generateSelectClause()
  PSR-6 second level cache
  Fix type errors in AbstractQuery and QueryBuilder (#9275)
  Mark columnName as always set
  Add support for PHP 8.1 enums.
  Remove ignore rules for issues fixed upstream (#9336)
  [GH-9277] deprecate php driver (#9309)
2022-01-09 17:30:10 +01:00
Benjamin Eberlei
2dce2d0d63 [GH-9277] remove deprecated PHPDriver (#9308)
* Remove deprecated PHPDriver mapping driver, use StaticPHPDriver instead.

* Update docs

* Housekeeping

* Update UPGRADE.md
2022-01-06 10:24:05 +01:00
Alexander M. Turek
80bca72915 Merge branch '2.11.x' into 3.0.x
* 2.11.x:
  Added runtime deprecation to `UnitOfWork::commit()` and `clear()` (#9327)
  Document return type of getEntityState() (#9328)
  Fix broken type declaration (#9330)
  Enable some previously disabled PHPCS rules (#9324)
2022-01-05 10:06:28 +01:00
Alexander M. Turek
2a0c73d0e5 Add types to UnitOfWork (#9329) 2022-01-05 07:57:09 +01:00
Alexander M. Turek
ea97ea4c47 Add types to entity manager (#9292) 2022-01-05 00:29:22 +01:00
Alexander M. Turek
081f3e43c0 Enable PHPCS rules for PHP 8.0 (#9293) 2022-01-02 21:29:38 +01:00
Alexander M. Turek
9b3d89db04 Merge branch '2.11.x' into 3.0.x
* 2.11.x:
  Run static analysis with language level PHP 8.1 (#9314)
  Document LockMode enums (#9319)
  Document PHPUnit mocks with intersection types (#9318)
  Run PHP CodeSniffer on PHP 8.1 (#9317)
  Psalm 4.17.0 (#9315)
  Run static analysis on PHP 8.1 (#9310)
2022-01-02 20:18:23 +01:00
Alexander M. Turek
f151daa2f9 Replace mocks with middlewares. (#9291) 2022-01-02 13:04:19 +01:00
Alexander M. Turek
4b062a4010 Merge branch '2.11.x' into 3.0.x
* 2.11.x:
  Bump PHPStan & Psalm (#9303)
  Removing list "Lifecycle Events" (#9243)
  Drop unneeded backslashes
  Fix Hidden fields triggering error when using getSingleScalarResult() (#8340)
  Findby joined lookup (#8285)
2021-12-31 03:09:21 +01:00
Alexander M. Turek
d7817793c3 Merge branch '2.11.x' into 3.0.x
* 2.11.x:
  Fix type errors in AnnotationDriver (#9274)
2021-12-30 01:06:24 +01:00
Alexander M. Turek
3f2cc10bfe Merge branch '2.11.x' into 3.0.x
* 2.11.x:
  Leverage get_debug_type() (#9297)
  Fix return type (#9295)
  Synchronize Psalm baseline (#9296)
  Fix union type on QueryExpressionVisitorTest::testWalkComparison() (#9294)
  Allow arithmetic expressions within IN operator (#9242)
  Bump reusable workflows
2021-12-28 10:29:29 +01:00
Alexander M. Turek
9c07649287 Drop support for PHP 7.4 (#9290) 2021-12-27 19:57:51 +01:00
Alexander M. Turek
47f931c8b2 Merge branch '2.11.x' into 3.0.x
* 2.11.x:
  Enable UnusedUse sniff again (#9267)
  Whitelist composer plugins used by this repository (#9286)
  Fix XML export for `change-tracking-policy` (#9285)
  Allow symfony/cache 6 (#9283)
  Put actual value instead of index inside $originalEntityData. (#9244)
  Fix return types of cache interfaces (#9271)
  Better explain limitations of DQL "DELETE" (#9281)
  Fix docblocks on nullable EM properties (#9273)
  Docs: use canonical order for phpdoc tags, add missed semicolon (#9190)
  Make PrimaryReadReplicaConnection enforcement explicit (#9239)
  Regenerate Psalm baseline (#9272)
  Improve compatibility with Doctrine DBAL 4 (#9266)
  [docs] Fix wording for attributes=>parameters. (#9265)
  Support for nesting attributes with PHP 8.1 (#9241)
  Revert "Fix SchemaValidator with abstract child class in discriminator map (#9096)" (#9262)
  Docs: consistency for FQCN, spacing, etc (#9232)
2021-12-26 01:31:31 +01:00
Alexander M. Turek
61e2caf818 Remove EntityManager::transactional() (#9278) 2021-12-25 23:06:29 +01:00
Sergei Morozov
ad97969e93 Remove the orm:ensure-production-settings console command (#9263) 2021-12-18 11:17:37 +01:00
Sergei Morozov
25ca8dc835 Merge pull request #9259 from morozov/dbal-3.2-deprecations
Do not use AbstractPlatform::canEmulateSchemas()
2021-12-17 07:41:24 -08:00
Sergei Morozov
a41c6d32c3 Do not use AbstractPlatform::canEmulateSchemas() 2021-12-16 22:21:38 -08:00
Alexander M. Turek
f2e34bd172 Remove DBAL 2 compat code 2021-12-16 23:35:09 +01:00
Alexander M. Turek
5bbd1d20cf Merge branch '2.11.x' into 3.0.x
* 2.11.x:
  Address more DBAL 3.2 deprecations (#9256)
2021-12-16 23:28:03 +01:00
Alexander M. Turek
ff44938f9f Remove Setup::registerAutoloadDirectory() (#9251) 2021-12-14 10:06:46 +01:00
Alexander M. Turek
414aae50c2 Merge branch '2.11.x' into 3.0.x
* 2.11.x:
  Deprecate Setup::registerAutoloadDirectory() (#9249)
  PHPCS 3.6.2, Psalm 4.15.0 (#9247)
  Add SchemaIgnoreClasses property for #8195. (#9202)
  Remove fallbacks for old doctrine/annotations version (#9235)
  Update docs/en/reference/events.rst
  Added psalm param to abstract addFilterConstraint (#9229)
  Merge pull request #9210 from alexander-schranz/patch-2
  Fix typo assumptio--> assumption
  Update events.rst
  Completing links to `EventArgs` classes in overview table
  Using `const` for `type`
  [Documentation] Events Overview Table: Adding "Passed Argument" column
2021-12-14 00:12:10 +01:00
Alexander M. Turek
36160a81fb Remove YAML metadata mapping (#9237) 2021-12-13 19:43:11 +01:00
Alexander M. Turek
36a4f662b2 Remove code generators (#9226) 2021-12-11 13:31:40 +01:00
Alexander M. Turek
3d406e5213 Remove the Version class (#9227) 2021-12-06 13:27:13 +01:00
Alexander M. Turek
61237d4c08 Merge 2.11.x into 3.0.x (#9220) 2021-12-03 18:59:43 +01:00
Alexander M. Turek
341c6b2929 Merge branch '2.11.x' into 3.0.x
* 2.11.x:
  Add missing deprecations for YAML metadata mapping (#9206)
  Drop support for DBAL 3.1
  Psalm 4.13.1, PHPStan 1.2.0 (#9204)
  Add a psalm type for field mapping
  Use `equal to` instead of `equal of` in `assertSqlGeneration()` (#9195)
  Adding Attributes code block (#9161)
2021-11-29 17:28:44 +01:00
Grégoire Paris
4f7a2dfb50 Merge pull request #9197 from greg0ire/3.0.x
Merge 2.11.x into 3.0.x
2021-11-20 15:56:19 +01:00
Grégoire Paris
0542c12aae Merge remote-tracking branch 'origin/2.11.x' into 3.0.x 2021-11-20 15:46:04 +01:00
Mariusz Soltys
203cd6ecf2 Changed EntityRepository count method $criteria parameter to optional (#9104)
Currently to get count of all items there is need to provide empty array
to count() method as $criteria parameter is required.  I believe there
shouldn't be a need to provide it if I want to count all Entities
without any criteria.
2021-10-11 17:42:13 +02:00
Alexander M. Turek
2adc193421 Bump required PHP version to 7.4 (#9094) 2021-10-05 20:14:12 +02:00
Alexander M. Turek
fe2ebeef25 Merge 2.11.x into 3.0.x (#9093)
Merge 2.11.x into 3.0.x
2021-10-05 15:18:53 +02:00
Grégoire Paris
e9cd90f52e Refactor ORMException into an interface (#9085) 2021-10-05 15:15:40 +02:00
Grégoire Paris
d973fa129b Merge pull request #9076 from derrabus/remove/hydrate-row 2021-10-04 12:13:52 +02:00
Alexander M. Turek
4fa65f3853 Remove AbstractHydrator::hydrateRow() 2021-10-04 10:42:14 +02:00
Alexander M. Turek
f478fee5fb Merge 2.11.x into 3.0.x 2021-10-04 10:38:52 +02:00
Alexander M. Turek
4b4022358a Merge branch '2.11.x' into 3.0.x
* 2.11.x:
  Deprecate AbstractHydrator::hydrateRow() (#9072)
  Reflect latest minor release in metadata
  Revert "Pin laminas/automatic-releases to 1.11.1"
  Revert "Try using docker image directly"
  Revert "Explicitly disallow workflows for tags"
  Revert "Use org admin token"

Signed-off-by: Alexander M. Turek <me@derrabus.de>
2021-10-03 23:59:03 +02:00
Alexander M. Turek
413c33274d Remove support for DBAL 2 (#9069) 2021-10-03 23:32:44 +02:00
Alexander M. Turek
e13714e400 Remote Query::iterate() (#9070) 2021-10-03 22:59:44 +02:00
Grégoire Paris
bcd6ac885d Merge pull request #9066 from doctrine/2.10.x-merge-up-into-3.0.x_6159cb4217e697.30353290
Merge release 2.10.0 into 3.0.x
2021-10-03 17:51:19 +02:00
Grégoire Paris
512dfd6aaf Merge remote-tracking branch 'origin/2.10.x' into 3.0.x 2021-10-03 17:40:24 +02:00
Alexander M. Turek
d95f304073 Remove TABLE and UUID strategies (#9045) 2021-10-02 18:00:45 +02:00
Kévin Dunglas
18c153ef8a Merge branch '2.10.x' into 3.0.x 2021-09-30 08:37:31 +02:00
Alexander M. Turek
bb60e06b88 Merge pull request #9044 from doctrine/2.10.x
Merge 2.10.x into 3.0.x
2021-09-29 22:45:16 +02:00
Alexander M. Turek
0ae2a2ded8 Merge pull request #9005 from doctrine/2.10.x
Merge 2.10.x into 3.0.x
2021-09-12 01:51:58 +02:00
Grégoire Paris
811f1b19bd Merge pull request #8967 from doctrine/2.10.x
Merge 2.10.x into 3.0.x
2021-08-31 23:08:51 +02:00
Grégoire Paris
a0b739c259 Merge pull request #8912 from greg0ire/3.0.x
Merge 2.10.x into 3.0.x
2021-08-11 22:45:58 +02:00
Grégoire Paris
cbda203f23 Merge remote-tracking branch 'origin/2.10.x' into 3.0.x 2021-08-11 22:31:29 +02:00
Grégoire Paris
d7a5eab7d5 Merge pull request #8877 from greg0ire/3.0.x 2021-08-03 13:06:16 +02:00
Grégoire Paris
e51f0cec94 Merge remote-tracking branch 'origin/2.10.x' into 3.0.x 2021-08-03 12:42:16 +02:00
Grégoire Paris
c6f8dc2482 Change ->assert* to self::assert* 2021-08-03 12:41:53 +02:00
Grégoire Paris
e3387386e0 Merge pull request #8876 from doctrine/2.10.x
Merge 2.10.x up into 3.0.x
2021-08-03 07:46:06 +02:00
Grégoire Paris
520bfa5c42 Merge pull request #8319 from simPod/fix-args
Fix variadic args in Expr
2021-07-23 23:45:34 +02:00
Simon Podlipsky
77c73e8801 Fix variadic args in Expr 2021-07-23 10:34:34 +02:00
Grégoire Paris
0a46111bb2 Merge pull request #8849 from doctrine/2.10.x
Merge 2.10.x into 3.0.x
2021-07-18 12:47:34 +02:00
Grégoire Paris
551018136b Merge pull request #8826 from greg0ire/3.0.x 2021-07-08 12:15:53 +02:00
Grégoire Paris
48be0c1bd0 Merge remote-tracking branch 'origin/2.10.x' into 3.0.x 2021-07-06 08:31:57 +02:00
Grégoire Paris
1c983629b5 Merge pull request #8706 from greg0ire/3.0.x
Merge 2.9.x into 3.0.x
2021-05-21 09:27:38 +02:00
Grégoire Paris
65160f626d Merge remote-tracking branch 'origin/2.9.x' into 3.0.x 2021-05-21 09:17:53 +02:00
Grégoire Paris
1445a655fe Merge pull request #8654 from smilesrg/remove_entitymanager_copy
Removed EntityManagerInteface::copy()
2021-04-24 17:05:26 +02:00
Serhii Smirnov
cf8adfe5d3 Updated UPGRADE.md 2021-04-24 15:05:25 +03:00
Grégoire Paris
cf624ebb7b Merge pull request #8656 from doctrine/2.9.x
Manually merge 2.9.x into 3.0.x
2021-04-24 09:59:46 +02:00
Serhii Smirnov
c9a81e5241 #8462: Removed EntityManagerInterface::copy() 2021-04-23 19:31:40 +03:00
Grégoire Paris
d7e47f413f Merge pull request #8585 from doctrine/2.9.x
Merge 2.9.x into 3.0.x
2021-04-02 09:24:27 +02:00
Grégoire Paris
28b62cfb71 Merge pull request #8560 from doctrine/2.9.x
Merge 2.9.x up into 3.0.x
2021-03-25 23:48:51 +01:00
1670 changed files with 35723 additions and 78909 deletions

View File

@@ -12,124 +12,103 @@
"upcoming": true
},
{
"name": "3.2",
"branchName": "3.2.x",
"slug": "3.2",
"name": "3.6",
"branchName": "3.6.x",
"slug": "3.6",
"upcoming": true
},
{
"name": "3.1",
"branchName": "3.1.x",
"slug": "3.1",
"name": "3.5",
"branchName": "3.5.x",
"slug": "3.5",
"current": true
},
{
"name": "3.4",
"slug": "3.4",
"maintained": false
},
{
"name": "3.3",
"slug": "3.3",
"maintained": false
},
{
"name": "3.2",
"slug": "3.2",
"maintained": false
},
{
"name": "3.1",
"slug": "3.1",
"maintained": false
},
{
"name": "3.0",
"branchName": "3.0.x",
"slug": "3.0",
"maintained": false
},
{
"name": "2.21",
"branchName": "2.21.x",
"slug": "2.21",
"upcoming": true
},
{
"name": "2.20",
"branchName": "2.20.x",
"slug": "2.20",
"upcoming": true
},
{
"name": "2.19",
"branchName": "2.19.x",
"slug": "2.19",
"maintained": true
},
{
"name": "2.19",
"slug": "2.19",
"maintained": false
},
{
"name": "2.18",
"branchName": "2.18.x",
"slug": "2.18",
"maintained": false
},
{
"name": "2.17",
"branchName": "2.17.x",
"slug": "2.17",
"maintained": false
},
{
"name": "2.16",
"branchName": "2.16.x",
"slug": "2.16",
"maintained": false
},
{
"name": "2.15",
"branchName": "2.15.x",
"slug": "2.15",
"maintained": false
},
{
"name": "2.14",
"branchName": "2.14.x",
"slug": "2.14",
"maintained": false
},
{
"name": "2.13",
"branchName": "2.13.x",
"slug": "2.13",
"maintained": false
},
{
"name": "2.12",
"branchName": "2.12.x",
"slug": "2.12",
"maintained": false
},
{
"name": "2.11",
"branchName": "2.11.x",
"slug": "2.11",
"maintained": false
},
{
"name": "2.10",
"branchName": "2.10.x",
"slug": "2.10",
"maintained": false
},
{
"name": "2.9",
"branchName": "2.9.x",
"slug": "2.9",
"maintained": false
},
{
"name": "2.8",
"branchName": "2.8.x",
"slug": "2.8",
"maintained": false
},
{
"name": "2.7",
"branchName": "2.7",
"slug": "2.7",
"maintained": false
},
{
"name": "2.6",
"branchName": "2.6",
"slug": "2.6",
"maintained": false
},
{
"name": "2.5",
"branchName": "2.5",
"slug": "2.5",
"maintained": false
},
{
"name": "2.4",
"branchName": "2.4",
"slug": "2.4",
"maintained": false
}
]
}

View File

@@ -1,37 +0,0 @@
---
name: 💥 BC Break
about: Have you encountered an issue during upgrade? 💣
---
<!--
Before reporting a BC break, please consult the upgrading document to make sure it's not an expected change: https://github.com/doctrine/orm/blob/2.9.x/UPGRADE.md
-->
### BC Break Report
<!-- Fill in the relevant information below to help triage your issue. -->
| Q | A
|------------ | ------
| BC Break | yes
| Version | x.y.z
#### Summary
<!-- Provide a summary describing the problem you are experiencing. -->
#### Previous behavior
<!-- What was the previous (working) behavior? -->
#### Current behavior
<!-- What is the current (broken) behavior? -->
#### How to reproduce
<!--
Provide steps to reproduce the BC break.
If possible, also add a code snippet with relevant configuration, entity mappings, DQL etc.
Adding a failing Unit or Functional Test would help us a lot - you can submit it in a Pull Request separately, referencing this bug report.
-->

View File

@@ -1,34 +0,0 @@
---
name: 🐞 Bug Report
about: Something is broken? 🔨
---
### Bug Report
<!-- Fill in the relevant information below to help triage your issue. -->
| Q | A
|------------ | ------
| BC Break | yes/no
| Version | x.y.z
#### Summary
<!-- Provide a summary describing the problem you are experiencing. -->
#### Current behavior
<!-- What is the current (buggy) behavior? -->
#### How to reproduce
<!--
Provide steps to reproduce the bug.
If possible, also add a code snippet with relevant configuration, entity mappings, DQL etc.
Adding a failing Unit or Functional Test would help us a lot - you can submit one in a Pull Request separately, referencing this bug report.
-->
#### Expected behavior
<!-- What was the expected (correct) behavior? -->

View File

@@ -1,18 +0,0 @@
---
name: 🎉 Feature Request
about: You have a neat idea that should be implemented? 🎩
---
### Feature Request
<!-- Fill in the relevant information below to help triage your issue. -->
| Q | A
|------------ | ------
| New Feature | yes
| RFC | yes/no
| BC Break | yes/no
#### Summary
<!-- Provide a summary of the feature you would like to see implemented. -->

View File

@@ -1,6 +0,0 @@
---
name: ❓ Support Question
about: Have a problem that you can't figure out? 🤔
---
Please use https://github.com/doctrine/orm/discussions instead.

9
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,9 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
labels:
- "CI"
target-branch: "2.20.x"

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

@@ -9,7 +9,6 @@ on:
- ci/**
- composer.*
- src/**
- phpunit.xml.dist
- tests/**
push:
branches:
@@ -19,7 +18,6 @@ on:
- ci/**
- composer.*
- src/**
- phpunit.xml.dist
- tests/**
env:
@@ -33,10 +31,6 @@ jobs:
strategy:
matrix:
php-version:
- "7.2"
- "7.3"
- "7.4"
- "8.0"
- "8.1"
- "8.2"
- "8.3"
@@ -44,24 +38,33 @@ jobs:
- "8.5"
dbal-version:
- "default"
- "3.7"
extension:
- "sqlite3"
- "pdo_sqlite"
proxy:
- "common"
deps:
- "highest"
native_lazy:
- "0"
include:
- php-version: "8.0"
dbal-version: "2.13"
extension: "pdo_sqlite"
- php-version: "8.2"
dbal-version: "3@dev"
dbal-version: "4@dev"
extension: "pdo_sqlite"
native_lazy: "0"
- php-version: "8.2"
dbal-version: "default"
dbal-version: "4@dev"
extension: "sqlite3"
native_lazy: "0"
- php-version: "8.1"
dbal-version: "default"
proxy: "lazy-ghost"
deps: "lowest"
extension: "pdo_sqlite"
native_lazy: "0"
- php-version: "8.4"
dbal-version: "default"
deps: "highest"
extension: "pdo_sqlite"
native_lazy: "1"
steps:
- name: "Checkout"
@@ -85,26 +88,77 @@ jobs:
uses: "ramsey/composer-install@v3"
with:
composer-options: "--ignore-platform-req=php+"
dependency-versions: "${{ matrix.deps }}"
- name: "Run PHPUnit"
run: "vendor/bin/phpunit -c ci/github/phpunit/${{ matrix.extension }}.xml --coverage-clover=coverage-no-cache.xml"
env:
ENABLE_SECOND_LEVEL_CACHE: 0
ORM_PROXY_IMPLEMENTATION: "${{ matrix.proxy }}"
ENABLE_NATIVE_LAZY_OBJECTS: ${{ matrix.native_lazy }}
- name: "Run PHPUnit with Second Level Cache"
run: "vendor/bin/phpunit -c ci/github/phpunit/${{ matrix.extension }}.xml --exclude-group performance,non-cacheable,locking_functional --coverage-clover=coverage-cache.xml"
- name: "Run PHPUnit with Second Level Cache and PHPUnit 10"
run: |
vendor/bin/phpunit -c ci/github/phpunit/${{ matrix.extension }}.xml \
--exclude-group=performance,non-cacheable,locking_functional \
--coverage-clover=coverage-cache.xml
if: "${{ matrix.php-version == '8.1' }}"
env:
ENABLE_SECOND_LEVEL_CACHE: 1
ORM_PROXY_IMPLEMENTATION: "${{ matrix.proxy }}"
ENABLE_NATIVE_LAZY_OBJECTS: ${{ matrix.native_lazy }}
- name: "Run PHPUnit with Second Level Cache and PHPUnit 11+"
run: |
vendor/bin/phpunit -c ci/github/phpunit/${{ matrix.extension }}.xml \
--exclude-group=performance \
--exclude-group=non-cacheable \
--exclude-group=locking_functional \
--coverage-clover=coverage-cache.xml
if: "${{ matrix.php-version != '8.1' }}"
env:
ENABLE_SECOND_LEVEL_CACHE: 1
ENABLE_NATIVE_LAZY_OBJECTS: ${{ matrix.native_lazy }}
- name: "Upload coverage file"
uses: "actions/upload-artifact@v5"
with:
name: "phpunit-${{ matrix.extension }}-${{ matrix.php-version }}-${{ matrix.dbal-version }}-${{ matrix.proxy }}-coverage"
name: "phpunit-${{ matrix.extension }}-${{ matrix.php-version }}-${{ matrix.dbal-version }}-${{ matrix.deps }}-${{ matrix.native_lazy }}-coverage"
path: "coverage*.xml"
phpunit-deprecations:
name: "PHPUnit (fail on deprecations)"
runs-on: "ubuntu-24.04"
steps:
- name: "Checkout"
uses: "actions/checkout@v5"
with:
fetch-depth: 2
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
php-version: "8.5"
extensions: "apcu, pdo, sqlite3"
coverage: "pcov"
ini-values: "zend.assertions=1, apc.enable_cli=1"
- name: "Allow dev dependencies"
run: composer config minimum-stability dev
- name: "Install dependencies with Composer"
uses: "ramsey/composer-install@v3"
with:
composer-options: "--ignore-platform-req=php+"
dependency-versions: "highest"
- name: "Run PHPUnit"
run: "vendor/bin/phpunit -c ci/github/phpunit/sqlite3.xml --fail-on-deprecation"
env:
ENABLE_SECOND_LEVEL_CACHE: 0
ENABLE_NATIVE_LAZY_OBJECTS: 1
phpunit-postgres:
name: "PHPUnit with PostgreSQL"
runs-on: "ubuntu-22.04"
@@ -119,19 +173,19 @@ jobs:
- "8.5"
dbal-version:
- "default"
- "3@dev"
- "3.7"
postgres-version:
- "17"
extension:
- pdo_pgsql
- pgsql
include:
- php-version: "8.0"
dbal-version: "2.13"
- php-version: "8.2"
dbal-version: "4@dev"
postgres-version: "14"
extension: pdo_pgsql
- php-version: "8.2"
dbal-version: "default"
dbal-version: "3.7"
postgres-version: "9.6"
extension: pdo_pgsql
@@ -194,17 +248,13 @@ jobs:
- "8.5"
dbal-version:
- "default"
- "3@dev"
- "3.7"
- "4@dev"
mariadb-version:
- "11.4"
extension:
- "mysqli"
- "pdo_mysql"
include:
- php-version: "8.0"
dbal-version: "2.13"
mariadb-version: "10.6"
extension: "pdo_mysql"
services:
mariadb:
@@ -266,7 +316,7 @@ jobs:
- "8.5"
dbal-version:
- "default"
- "3@dev"
- "3.7"
mysql-version:
- "5.7"
- "8.0"
@@ -274,8 +324,12 @@ jobs:
- "mysqli"
- "pdo_mysql"
include:
- php-version: "8.0"
dbal-version: "2.13"
- php-version: "8.2"
dbal-version: "4@dev"
mysql-version: "8.0"
extension: "mysqli"
- php-version: "8.2"
dbal-version: "4@dev"
mysql-version: "8.0"
extension: "pdo_mysql"
@@ -319,8 +373,22 @@ jobs:
env:
ENABLE_SECOND_LEVEL_CACHE: 0
- name: "Run PHPUnit with Second Level Cache"
run: "vendor/bin/phpunit -c ci/github/phpunit/${{ matrix.extension }}.xml --exclude-group performance,non-cacheable,locking_functional --coverage-clover=coverage-no-cache.xml"
- name: "Run PHPUnit with Second Level Cache and PHPUnit 10"
run: |
vendor/bin/phpunit -c ci/github/phpunit/${{ matrix.extension }}.xml \
--exclude-group=performance,non-cacheable,locking_functional \
--coverage-clover=coverage-no-cache.xml"
if: "${{ matrix.php-version == '8.1' }}"
env:
ENABLE_SECOND_LEVEL_CACHE: 1
- name: "Run PHPUnit with Second Level Cache and PHPUnit 11+"
run: |
vendor/bin/phpunit -c ci/github/phpunit/${{ matrix.extension }}.xml \
--exclude-group=performance \
--exclude-group=non-cacheable \
--exclude-group=locking_functional \
--coverage-clover=coverage-no-cache.xml
if: "${{ matrix.php-version != '8.1' }}"
env:
ENABLE_SECOND_LEVEL_CACHE: 1
@@ -330,40 +398,6 @@ jobs:
name: "${{ github.job }}-${{ matrix.mysql-version }}-${{ matrix.extension }}-${{ matrix.php-version }}-${{ matrix.dbal-version }}-coverage"
path: "coverage*.xml"
phpunit-lower-php-versions:
name: "PHPUnit with SQLite"
runs-on: "ubuntu-22.04"
strategy:
matrix:
php-version:
- "7.1"
deps:
- "highest"
- "lowest"
steps:
- name: "Checkout"
uses: "actions/checkout@v5"
with:
fetch-depth: 2
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
php-version: "${{ matrix.php-version }}"
ini-values: "zend.assertions=1, apc.enable_cli=1"
- name: "Install dependencies with Composer"
uses: "ramsey/composer-install@v3"
with:
dependency-versions: "${{ matrix.deps }}"
- name: "Run PHPUnit"
run: "vendor/bin/phpunit -c ci/github/phpunit/pdo_sqlite.xml"
upload_coverage:
name: "Upload coverage to Codecov"
runs-on: "ubuntu-22.04"

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

@@ -32,7 +32,7 @@ jobs:
strategy:
matrix:
php-version:
- "7.4"
- "8.1"
steps:
- name: "Checkout"

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 }}

24
.github/workflows/stale.yml vendored Normal file
View File

@@ -0,0 +1,24 @@
name: 'Close stale pull requests'
on:
schedule:
- cron: '0 3 * * *'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
with:
stale-pr-message: >
There hasn't been any activity on this pull request in the past 90 days, so
it has been marked as stale and it will be closed automatically if no
further activity occurs in the next 7 days.
If you want to continue working on it, please leave a comment.
close-pr-message: >
This pull request was closed due to inactivity.
days-before-stale: -1
days-before-pr-stale: 90
days-before-pr-close: 7

View File

@@ -22,52 +22,35 @@ on:
jobs:
static-analysis-phpstan:
name: "Static Analysis with PHPStan"
runs-on: "ubuntu-22.04"
name: Static Analysis with PHPStan
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
dbal-version:
- "default"
persistence-version:
- "default"
include:
- dbal-version: "2.13"
persistence-version: "default"
- dbal-version: "default"
persistence-version: "2.5"
- dbal-version: default
config: phpstan.neon
- dbal-version: 3.8.2
config: phpstan-dbal3.neon
steps:
- name: "Checkout code"
uses: "actions/checkout@v5"
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
- name: Install PHP
uses: shivammathur/setup-php@v2
with:
coverage: "none"
coverage: none
php-version: "8.4"
tools: cs2pr
- name: "Require specific DBAL version"
- name: Require specific DBAL version
run: "composer require doctrine/dbal ^${{ matrix.dbal-version }} --no-update"
if: "${{ matrix.dbal-version != 'default' }}"
- name: "Require specific persistence version"
run: "composer require doctrine/persistence ^$([ ${{ matrix.persistence-version }} = default ] && echo '3.1' || echo ${{ matrix.persistence-version }}) --no-update"
- name: "Install dependencies with Composer"
uses: "ramsey/composer-install@v3"
with:
dependency-versions: "highest"
- name: Install dependencies with Composer
uses: ramsey/composer-install@v2
- name: "Run a static analysis with phpstan/phpstan"
run: "vendor/bin/phpstan analyse"
if: "${{ matrix.dbal-version == 'default' && matrix.persistence-version == 'default'}}"
- name: "Run a static analysis with phpstan/phpstan"
run: "vendor/bin/phpstan analyse -c phpstan-dbal2.neon"
if: "${{ matrix.dbal-version == '2.13' }}"
- name: "Run a static analysis with phpstan/phpstan"
run: "vendor/bin/phpstan analyse -c phpstan-persistence2.neon"
if: "${{ matrix.dbal-version == 'default' && matrix.persistence-version != 'default'}}"
- name: Run static analysis with phpstan/phpstan
run: "vendor/bin/phpstan analyse -c ${{ matrix.config }} --error-format=checkstyle | cs2pr"

21
.github/workflows/website-schema.yml vendored Normal file
View File

@@ -0,0 +1,21 @@
name: "Website config validation"
on:
pull_request:
branches:
- "*.x"
paths:
- ".doctrine-project.json"
- ".github/workflows/website-schema.yml"
push:
branches:
- "*.x"
paths:
- ".doctrine-project.json"
- ".github/workflows/website-schema.yml"
jobs:
json-validate:
name: "Validate JSON schema"
uses: "doctrine/.github/.github/workflows/website-schema.yml@7.1.0"

View File

@@ -57,7 +57,7 @@ sqlite database.
Tips for creating unit tests:
1. If you put a test into the `Ticket` namespace as described above, put the testcase and all entities into the same class.
See `https://github.com/doctrine/orm/tree/2.8.x/tests/Tests/ORM/Functional/Ticket/DDC2306Test.php` for an
See `https://github.com/doctrine/orm/tree/3.0.x/tests/Tests/ORM/Functional/Ticket/DDC2306Test.php` for an
example.
## Getting merged

View File

@@ -3,9 +3,7 @@
| [![Build status][4.0 image]][4.0 workflow] | [![Build status][3.6 image]][3.6 workflow] | [![Build status][3.5 image]][3.5 workflow] | [![Build status][2.21 image]][2.21 workflow] | [![Build status][2.20 image]][2.20 workflow] |
| [![Coverage Status][4.0 coverage image]][4.0 coverage] | [![Coverage Status][3.6 coverage image]][3.6 coverage] | [![Coverage Status][3.5 coverage image]][3.5 coverage] | [![Coverage Status][2.21 coverage image]][2.21 coverage] | [![Coverage Status][2.20 coverage image]][2.20 coverage] |
[<h1 align="center">🇺🇦 UKRAINE NEEDS YOUR HELP NOW!</h1>](https://www.doctrine-project.org/stop-war.html)
Doctrine ORM is an object-relational mapper for PHP 7.1+ that provides transparent persistence
Doctrine ORM is an object-relational mapper for PHP 8.1+ that provides transparent persistence
for PHP objects. It sits on top of a powerful database abstraction layer (DBAL). One of its key features
is the option to write database queries in a proprietary object oriented SQL dialect called Doctrine Query Language (DQL),
inspired by Hibernate's HQL. This provides developers with a powerful alternative to SQL that maintains flexibility

View File

@@ -1,10 +1,921 @@
Note about upgrading: Doctrine uses static and runtime mechanisms to raise
awareness about deprecated code.
- Use of `@deprecated` docblock that is detected by IDEs (like PHPStorm) or
Static Analysis tools (like Psalm, phpstan)
- Use of our low-overhead runtime deprecation API, details:
https://github.com/doctrine/deprecations/
# Upgrade to 3.x General Notes
We recommend you upgrade to DBAL 3 first before upgrading to ORM 3. See
the DBAL upgrade docs: https://github.com/doctrine/dbal/blob/3.10.x/UPGRADE.md
Rather than doing several major upgrades at once, we recommend you do the following:
- upgrade to DBAL 3
- deploy and monitor
- upgrade to ORM 3
- deploy and monitor
- upgrade to DBAL 4
- deploy and monitor
If you are using Symfony, the recommended minimal Doctrine Bundle version is 2.15
to run with ORM 3.
At this point, we recommend upgrading to PHP 8.4 first and then directly from
ORM 2.19 to 3.5 and up so that you can skip the lazy ghost proxy generation
and directly start using native lazy objects.
# Upgrade to 3.5
See the General notes to upgrading to 3.x versions above.
## Deprecate not using native lazy objects on PHP 8.4+
Having native lazy objects disabled on PHP 8.4+ is deprecated and will not be
possible in 4.0.
You can enable them through configuration:
```php
$config->enableNativeLazyObjects(true);
```
As a consequence, methods, parameters and commands related to userland lazy
objects have been deprecated on PHP 8.4+:
- `Doctrine\ORM\Tools\Console\Command\GenerateProxiesCommand`
- `Doctrine\ORM\Configuration::getAutoGenerateProxyClasses()`
- `Doctrine\ORM\Configuration::getProxyDir()`
- `Doctrine\ORM\Configuration::getProxyNamespace()`
- `Doctrine\ORM\Configuration::setAutoGenerateProxyClasses()`
- `Doctrine\ORM\Configuration::setProxyDir()`
- `Doctrine\ORM\Configuration::setProxyNamespace()`
- Passing more than one argument to `Doctrine\ORM\Proxy\ProxyFactory::__construct()`
Additionally, some methods of ORMSetup have been deprecated in favor of a new
counterpart.
- `Doctrine\ORM\ORMSetup::createAttributeMetadataConfiguration()` is deprecated in favor of
`Doctrine\ORM\ORMSetup::createAttributeMetadataConfig()`
- `Doctrine\ORM\ORMSetup::createXMLMetadataConfiguration()` is deprecated in favor of
`Doctrine\ORM\ORMSetup::createXMLMetadataConfig()`
- `Doctrine\ORM\ORMSetup::createConfiguration()` is deprecated in favor of
`Doctrine\ORM\ORMSetup::createConfig()`
## Deprecate methods for configuring no longer configurable features
Since 3.0, lazy ghosts are enabled unconditionally, and so is rejecting ID
collisions in the identity map.
As a consequence, the following methods are deprecated and will be removed in 4.0:
* `Doctrine\ORM\Configuration::setLazyGhostObjectEnabled()`
* `Doctrine\ORM\Configuration::isLazyGhostObjectEnabled()`
* `Doctrine\ORM\Configuration::setRejectIdCollisionInIdentityMap()`
* `Doctrine\ORM\Configuration::isRejectIdCollisionInIdentityMapEnabled()`
# Upgrade to 3.4.1
## BC BREAK: You can no longer use the `.*` notation to get all fields of an entity in a DTO
This feature was introduced in 3.4.0, and introduces several issues, so we
decide to remove it before it is used too widely.
# Upgrade to 3.4
See the General notes to upgrading to 3.x versions above.
## Discriminator Map class duplicates
Using the same class several times in a discriminator map is deprecated.
In 4.0, this will be an error.
## `Doctrine\ORM\Mapping\ClassMetadata::$reflFields` deprecated
To better support property hooks and lazy proxies in the future, `$reflFields` had to
be deprecated because we cannot use the PHP internal reflection API directly anymore.
The property was changed from an array to an object of type `LegacyReflectionFields`
that implements `ArrayAccess`.
Use the new `Doctrine\ORM\Mapping\PropertyAccessors\PropertyAccessor` API and access
through `Doctrine\ORM\Mapping\ClassMetadata::$propertyAccessors` instead.
Companion accessor methods are deprecated as well.
# Upgrade to 3.3
See the General notes to upgrading to 3.x versions above.
## Deprecate `DatabaseDriver`
The class `Doctrine\ORM\Mapping\Driver\DatabaseDriver` is deprecated without replacement.
## Add `Doctrine\ORM\Query\OutputWalker` interface, deprecate `Doctrine\ORM\Query\SqlWalker::getExecutor()`
Output walkers should implement the new `\Doctrine\ORM\Query\OutputWalker` interface and create
`Doctrine\ORM\Query\Exec\SqlFinalizer` instances instead of `Doctrine\ORM\Query\Exec\AbstractSqlExecutor`s.
The output walker must not base its workings on the query `firstResult`/`maxResult` values, so that the
`SqlFinalizer` can be kept in the query cache and used regardless of the actual `firstResult`/`maxResult` values.
Any operation dependent on `firstResult`/`maxResult` should take place within the `SqlFinalizer::createExecutor()`
method. Details can be found at https://github.com/doctrine/orm/pull/11188.
# Upgrade to 3.2
See the General notes to upgrading to 3.x versions above.
## Deprecate the `NotSupported` exception
The class `Doctrine\ORM\Exception\NotSupported` is deprecated without replacement.
## Deprecate remaining `Serializable` implementation
Relying on `SequenceGenerator` implementing the `Serializable` is deprecated
because that interface won't be implemented in ORM 4 anymore.
The following methods are deprecated:
* `SequenceGenerator::serialize()`
* `SequenceGenerator::unserialize()`
## `orm:schema-tool:update` option `--complete` is deprecated
That option behaves as a no-op, and is deprecated. It will be removed in 4.0.
## Deprecate properties `$indexes` and `$uniqueConstraints` of `Doctrine\ORM\Mapping\Table`
The properties `$indexes` and `$uniqueConstraints` have been deprecated since they had no effect at all.
The preferred way of defining indices and unique constraints is by
using the `\Doctrine\ORM\Mapping\UniqueConstraint` and `\Doctrine\ORM\Mapping\Index` attributes.
# Upgrade to 3.1
See the General notes to upgrading to 3.x versions above.
## Deprecate `Doctrine\ORM\Mapping\ReflectionEnumProperty`
This class is deprecated and will be removed in 4.0.
Instead, use `Doctrine\Persistence\Reflection\EnumReflectionProperty` from
`doctrine/persistence`.
## Deprecate passing null to `ClassMetadata::fullyQualifiedClassName()`
Passing `null` to `Doctrine\ORM\ClassMetadata::fullyQualifiedClassName()` is
deprecated and will no longer be possible in 4.0.
## Deprecate array access
Using array access on instances of the following classes is deprecated:
- `Doctrine\ORM\Mapping\DiscriminatorColumnMapping`
- `Doctrine\ORM\Mapping\EmbedClassMapping`
- `Doctrine\ORM\Mapping\FieldMapping`
- `Doctrine\ORM\Mapping\JoinColumnMapping`
- `Doctrine\ORM\Mapping\JoinTableMapping`
# Upgrade to 3.0
See the General notes to upgrading to 3.x versions above.
## BC BREAK: Calling `ClassMetadata::getAssociationMappedByTargetField()` with the owning side of an association now throws an exception
Previously, calling
`Doctrine\ORM\Mapping\ClassMetadata::getAssociationMappedByTargetField()` with
the owning side of an association returned `null`, which was undocumented, and
wrong according to the phpdoc of the parent method.
If you do not know whether you are on the owning or inverse side of an association,
you can use `Doctrine\ORM\Mapping\ClassMetadata::isAssociationInverseSide()`
to find out.
## BC BREAK: `Doctrine\ORM\Proxy\Autoloader` no longer extends `Doctrine\Common\Proxy\Autoloader`
Make sure to use the former when writing a type declaration or an `instanceof` check.
## Minor BC BREAK: Changed order of arguments passed to `OneToOne`, `ManyToOne` and `Index` mapping PHP attributes
To keep PHP mapping attributes consistent, order of arguments passed to above attributes has been changed
so `$targetEntity` is a first argument now. This change affects only non-named arguments usage.
## BC BREAK: AUTO keyword for identity generation defaults to IDENTITY for PostgreSQL when using `doctrine/dbal` 4
When using the `AUTO` strategy to let Doctrine determine the identity generation mechanism for
an entity, and when using `doctrine/dbal` 4, PostgreSQL now uses `IDENTITY`
instead of `SEQUENCE` or `SERIAL`.
There are three ways to handle this change.
* If you want to upgrade your existing tables to identity columns, you will need to follow [migration to identity columns on PostgreSQL](https://www.doctrine-project.org/projects/doctrine-dbal/en/4.0/how-to/postgresql-identity-migration.html)
* If you want to keep using SQL sequences, you need to configure the ORM this way:
```php
use Doctrine\DBAL\Platforms\PostgreSQLPlatform;
use Doctrine\ORM\Configuration;
use Doctrine\ORM\Mapping\ClassMetadata;
assert($configuration instanceof Configuration);
$configuration->setIdentityGenerationPreferences([
PostgreSQLPlatform::CLASS => ClassMetadata::GENERATOR_TYPE_SEQUENCE,
]);
```
* You can change individual entities to use the `SEQUENCE` strategy instead of `AUTO`:
```php
diff --git a/src/Entity/Example.php b/src/Entity/Example.php
index 28be8df378..3b7d61bda6 100644
--- a/src/Entity/Example.php
+++ b/src/Entity/Example.php
@@ -38,7 +38,7 @@ class Example
#[ORM\Id]
#[ORM\Column(type: 'integer')]
- #[ORM\GeneratedValue(strategy: 'AUTO')]
+ #[ORM\GeneratedValue(strategy: 'SEQUENCE')]
private int $id;
#[Assert\Length(max: 255)]
```
The later two options require a small database migration that will remove the default
expression fetching the next value from the sequence. It's not strictly necessary to
do this migration because the code will work anyway. A benefit of this approach is
that you can just make and roll out the code changes first and then migrate the database later.
## BC BREAK: Throw exceptions when using illegal attributes on Embeddable
There are only a few attributes allowed on an embeddable such as `#[Column]` or
`#[Embedded]`. Previously all others that target entity classes where ignored,
now they throw an exception.
## BC BREAK: Partial objects are removed
WARNING: This was relaxed in ORM 3.2 when partial was re-allowed for array-hydration.
- The `PARTIAL` keyword in DQL no longer exists (reintroduced in ORM 3.2)
- `Doctrine\ORM\Query\AST\PartialObjectExpression` is removed. (reintroduced in ORM 3.2)
- `Doctrine\ORM\Query\SqlWalker::HINT_PARTIAL` (reintroduced in ORM 3.2) and
`Doctrine\ORM\Query::HINT_FORCE_PARTIAL_LOAD` are removed.
- `Doctrine\ORM\EntityManager*::getPartialReference()` is removed.
## BC BREAK: Enforce ArrayCollection Type on `\Doctrine\ORM\QueryBuilder::setParameters(ArrayCollection $parameters)`
The argument $parameters can no longer be a key=>value array. Only ArrayCollection types are allowed.
### Before
```php
$qb = $em->createQueryBuilder()
->select('u')
->from('User', 'u')
->where('u.id = :user_id1 OR u.id = :user_id2')
->setParameters(array(
'user_id1' => 1,
'user_id2' => 2
));
```
### After
```php
$qb = $em->createQueryBuilder()
->select('u')
->from('User', 'u')
->where('u.id = :user_id1 OR u.id = :user_id2')
->setParameters(new ArrayCollection(array(
new Parameter('user_id1', 1),
new Parameter('user_id2', 2)
)));
```
## BC BREAK: `Doctrine\ORM\Persister\Entity\EntityPersister::executeInserts()` return type changed to `void`
Implementors should adapt to the new signature, and should call
`UnitOfWork::assignPostInsertId()` for each entry in the previously returned
array.
## BC BREAK: `Doctrine\ORM\Proxy\ProxyFactory` no longer extends abstract factory from `doctrine/common`
It is no longer possible to call methods, constants or properties inherited
from that class on a `ProxyFactory` instance.
`Doctrine\ORM\Proxy\ProxyFactory::createProxyDefinition()` and
`Doctrine\ORM\Proxy\ProxyFactory::resetUninitializedProxy()` are removed as well.
## BC BREAK: lazy ghosts are enabled unconditionally
`Doctrine\ORM\Configuration::setLazyGhostObjectEnabled()` and
`Doctrine\ORM\Configuration::isLazyGhostObjectEnabled()` are now no-ops and
will be deprecated in 3.1.0
## BC BREAK: collisions in identity map are unconditionally rejected
`Doctrine\ORM\Configuration::setRejectIdCollisionInIdentityMap()` and
`Doctrine\ORM\Configuration::isRejectIdCollisionInIdentityMapEnabled()` are now
no-ops and will be deprecated in 3.1.0.
## BC BREAK: Lifecycle callback mapping on embedded classes is now explicitly forbidden
Lifecycle callback mapping on embedded classes produced no effect, and is now
explicitly forbidden to point out mistakes.
## BC BREAK: The `NOTIFY` change tracking policy is removed
You should use `DEFERRED_EXPLICIT` instead.
## BC BREAK: `Mapping\Driver\XmlDriver::__construct()` third argument is now enabled by default
The third argument to
`Doctrine\ORM\Mapping\Driver\XmlDriver::__construct()` was introduced to
let users opt-in to XML validation, that is now always enabled by default.
As a consequence, the same goes for
`Doctrine\ORM\Mapping\Driver\SimplifiedXmlDriver`, and for
`Doctrine\ORM\ORMSetup::createXMLMetadataConfiguration()`.
## BC BREAK: `Mapping\Driver\AttributeDriver::__construct()` second argument is now a no-op
The second argument to
`Doctrine\ORM\Mapping\Driver\AttributeDriver::__construct()` was introduced to
let users opt-in to a new behavior, that is now always enforced, regardless of
the value of that argument.
## BC BREAK: `Query::setDQL()` and `Query::setFirstResult()` no longer accept `null`
The `$dqlQuery` argument of `Doctrine\ORM\Query::setDQL()` must always be a
string.
The `$firstResult` argument of `Doctrine\ORM\Query::setFirstResult()` must
always be an integer.
## BC BREAK: `orm:schema-tool:update` option `--complete` is now a no-op
`orm:schema-tool:update` now behaves as if `--complete` was provided,
regardless of whether it is provided or not.
## BC BREAK: Removed `Doctrine\ORM\Proxy\Proxy` interface.
Use `Doctrine\Persistence\Proxy` instead to check whether proxies are initialized.
## BC BREAK: Overriding fields or associations declared in other than mapped superclasses
As stated in the documentation, fields and associations may only be overridden when being inherited
from mapped superclasses. Overriding them for parent entity classes now throws a `MappingException`.
## BC BREAK: Undeclared entity inheritance now throws a `MappingException`
As soon as an entity class inherits from another entity class, inheritance has to
be declared by adding the appropriate configuration for the root entity.
## Removed `getEntityManager()` in `Doctrine\ORM\Event\OnClearEventArgs` and `Doctrine\ORM\Event\*FlushEventArgs`
Use `getObjectManager()` instead.
## BC BREAK: Removed `Doctrine\ORM\Mapping\ClassMetadataInfo` class
Use `Doctrine\ORM\Mapping\ClassMetadata` instead.
## BC BREAK: Removed `Doctrine\ORM\Event\LifecycleEventArgs` class.
Use one of the dedicated event classes instead:
* `Doctrine\ORM\Event\PrePersistEventArgs`
* `Doctrine\ORM\Event\PreUpdateEventArgs`
* `Doctrine\ORM\Event\PreRemoveEventArgs`
* `Doctrine\ORM\Event\PostPersistEventArgs`
* `Doctrine\ORM\Event\PostUpdateEventArgs`
* `Doctrine\ORM\Event\PostRemoveEventArgs`
* `Doctrine\ORM\Event\PostLoadEventArgs`
## BC BREAK: Removed `AttributeDriver::$entityAnnotationClasses` and `AttributeDriver::getReader()`
* If you need to change the behavior of `AttributeDriver::isTransient()`,
override that method instead.
* The attribute reader is internal to the driver and should not be accessed from outside.
## BC BREAK: Removed `Doctrine\ORM\Query\AST\InExpression`
The AST parser will create a `InListExpression` or a `InSubselectExpression` when
encountering an `IN ()` DQL expression instead of a generic `InExpression`.
As a consequence, `SqlWalker::walkInExpression()` has been replaced by
`SqlWalker::walkInListExpression()` and `SqlWalker::walkInSubselectExpression()`.
## BC BREAK: Changed `EntityManagerInterface#refresh($entity)`, `EntityManagerDecorator#refresh($entity)` and `UnitOfWork#refresh($entity)` signatures
The new signatures of these methods add an optional `LockMode|int|null $lockMode`
param with default `null` value (no lock).
## BC Break: Removed AnnotationDriver
The annotation driver and anything related to annotation has been removed.
Please migrate to another mapping driver.
The `Doctrine\ORM\Mapping\Annotation` maker interface has been removed in favor of the new
`Doctrine\ORM\Mapping\MappingAttribute` interface.
## BC BREAK: Removed `EntityManager::create()`
The constructor of `EntityManager` is now public and must be used instead of the `create()` method.
However, the constructor expects a `Connection` while `create()` accepted an array with connection parameters.
You can pass that array to DBAL's `Doctrine\DBAL\DriverManager::getConnection()` method to bootstrap the
connection.
## BC BREAK: Removed `QueryBuilder` methods and constants.
The following `QueryBuilder` constants and methods have been removed:
1. `SELECT`,
2. `DELETE`,
3. `UPDATE`,
4. `STATE_DIRTY`,
5. `STATE_CLEAN`,
6. `getState()`,
7. `getType()`.
## BC BREAK: Omitting only the alias argument for `QueryBuilder::update` and `QueryBuilder::delete` is not supported anymore
When building an UPDATE or DELETE query and when passing a class/type to the function, the alias argument must not be omitted.
### Before
```php
$qb = $em->createQueryBuilder()
->delete('User u')
->where('u.id = :user_id')
->setParameter('user_id', 1);
```
### After
```php
$qb = $em->createQueryBuilder()
->delete('User', 'u')
->where('u.id = :user_id')
->setParameter('user_id', 1);
```
## BC BREAK: Split output walkers and tree walkers
`SqlWalker` and its child classes don't implement the `TreeWalker` interface
anymore.
The following methods have been removed from the `TreeWalker` interface and
from the `TreeWalkerAdapter` and `TreeWalkerChain` classes:
* `setQueryComponent()`
* `walkSelectClause()`
* `walkFromClause()`
* `walkFunction()`
* `walkOrderByClause()`
* `walkOrderByItem()`
* `walkHavingClause()`
* `walkJoin()`
* `walkSelectExpression()`
* `walkQuantifiedExpression()`
* `walkSubselect()`
* `walkSubselectFromClause()`
* `walkSimpleSelectClause()`
* `walkSimpleSelectExpression()`
* `walkAggregateExpression()`
* `walkGroupByClause()`
* `walkGroupByItem()`
* `walkDeleteClause()`
* `walkUpdateClause()`
* `walkUpdateItem()`
* `walkWhereClause()`
* `walkConditionalExpression()`
* `walkConditionalTerm()`
* `walkConditionalFactor()`
* `walkConditionalPrimary()`
* `walkExistsExpression()`
* `walkCollectionMemberExpression()`
* `walkEmptyCollectionComparisonExpression()`
* `walkNullComparisonExpression()`
* `walkInExpression()`
* `walkInstanceOfExpression()`
* `walkLiteral()`
* `walkBetweenExpression()`
* `walkLikeExpression()`
* `walkStateFieldPathExpression()`
* `walkComparisonExpression()`
* `walkInputParameter()`
* `walkArithmeticExpression()`
* `walkArithmeticTerm()`
* `walkStringPrimary()`
* `walkArithmeticFactor()`
* `walkSimpleArithmeticExpression()`
* `walkPathExpression()`
* `walkResultVariable()`
* `getExecutor()`
The following changes have been made to the abstract `TreeWalkerAdapter` class:
* The method `setQueryComponent()` is now protected.
* The method `_getQueryComponents()` has been removed in favor of
`getQueryComponents()`.
## BC BREAK: Removed identity columns emulation through sequences
If the platform you are using does not support identity columns, you should
switch to the `SEQUENCE` strategy.
## BC BREAK: Made setters parameters mandatory
The following methods require an argument when being called. Pass `null`
instead of omitting the argument.
* `Doctrine\ORM\Event\OnClassMetadataNotFoundEventArgs::setFoundMetadata()`
* `Doctrine\ORM\AbstractQuery::setHydrationCacheProfile()`
* `Doctrine\ORM\AbstractQuery::setResultCache()`
* `Doctrine\ORM\AbstractQuery::setResultCacheProfile()`
## BC BREAK: New argument to `NamingStrategy::joinColumnName()`
### Before
```php
<?php
class MyStrategy implements NamingStrategy
{
/**
* @param string $propertyName A property name.
*/
public function joinColumnName($propertyName): string
{
// …
}
}
```
### After
The `class-string` type for `$className` can be inherited from the signature of
the interface.
```php
<?php
class MyStrategy implements NamingStrategy
{
/**
* {@inheritdoc}
*/
public function joinColumnName(string $propertyName, string $className): string
{
// …
}
}
```
## BC BREAK: Remove `StaticPHPDriver` and `DriverChain`
Use `Doctrine\Persistence\Mapping\Driver\StaticPHPDriver` and
`Doctrine\Persistence\Mapping\Driver\MappingDriverChain` from
`doctrine/persistence` instead.
## BC BREAK: `UnderscoreNamingStrategy` is number aware only
The second argument to `UnderscoreNamingStrategy::__construct()` was dropped,
the strategy can no longer be unaware of numbers.
## BC BREAK: Remove `Doctrine\ORM\Tools\DisconnectedClassMetadataFactory`
No replacement is provided.
## BC BREAK: Remove support for `Type::canRequireSQLConversion()`
This feature was deprecated in DBAL 3.3.0 and will be removed in DBAL 4.0.
The value conversion methods are now called regardless of the type.
The `MappingException::sqlConversionNotAllowedForIdentifiers()` method has been removed
as no longer relevant.
## BC Break: Removed the `doctrine` binary.
The documentation explains how the console tools can be bootstrapped for
standalone usage:
https://www.doctrine-project.org/projects/doctrine-orm/en/stable/reference/tools.html
The method `ConsoleRunner::printCliConfigTemplate()` has been removed as well
because it was only useful in the context of the `doctrine` binary.
## BC Break: Removed `EntityManagerHelper` and related logic
All console commands require a `$entityManagerProvider` to be passed via the
constructor. Commands won't try to get the entity manager from a previously
registered `em` console helper.
The following classes have been removed:
* `Doctrine\ORM\Tools\Console\EntityManagerProvider\HelperSetManagerProvider`
* `Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper`
The following breaking changes have been applied to `Doctrine\ORM\Tools\Console\ConsoleRunner`:
* The method `createHelperSet()` has been removed.
* The methods `run()` and `createApplication()` don't accept an instance of
`HelperSet` as first argument anymore.
* The method `addCommands()` requires an instance of `EntityManagerProvider`
as second argument now.
## BC Break: `Exception\ORMException` is no longer a class, but an interface
All methods in `Doctrine\ORM\ORMException` have been extracted to dedicated exceptions.
* `missingMappingDriverImpl()` => `Exception\MissingMappingDriverImplementation::create()`
* `unrecognizedField()` => `Persisters\Exception\UnrecognizedField::byName()`
* `unexpectedAssociationValue()` => `Exception\UnexpectedAssociationValue::create()`
* `invalidOrientation()` => `Persisters\Exception\InvalidOrientation::fromClassNameAndField()`
* `entityManagerClosed()` => `Exception\EntityManagerClosed::create()`
* `invalidHydrationMode()` => `Exception\InvalidHydrationMode::fromMode()`
* `mismatchedEventManager()` => `Exception\MismatchedEventManager::create()`
* `findByRequiresParameter()` => `Repository\Exception\InvalidMagicMethodCall::onMissingParameter()`
* `invalidMagicCall()` => `Repository\Exception\InvalidMagicMethodCall::becauseFieldNotFoundIn()`
* `invalidFindByInverseAssociation()` => `Repository\Exception\InvalidFindByCall::fromInverseSideUsage()`
* `invalidResultCacheDriver()` => `Cache\Exception\InvalidResultCacheDriver::create()`
* `notSupported()` => `Exception\NotSupported::create()`
* `queryCacheNotConfigured()` => `QueryCacheNotConfigured::create()`
* `metadataCacheNotConfigured()` => `Cache\Exception\MetadataCacheNotConfigured::create()`
* `queryCacheUsesNonPersistentCache()` => `Cache\Exception\QueryCacheUsesNonPersistentCache::fromDriver()`
* `metadataCacheUsesNonPersistentCache()` => `Cache\Exception\MetadataCacheUsesNonPersistentCache::fromDriver()`
* `proxyClassesAlwaysRegenerating()` => `Exception\ProxyClassesAlwaysRegenerating::create()`
* `invalidEntityRepository()` => `Exception\InvalidEntityRepository::fromClassName()`
* `missingIdentifierField()` => `Exception\MissingIdentifierField::fromFieldAndClass()`
* `unrecognizedIdentifierFields()` => `Exception\UnrecognizedIdentifierFields::fromClassAndFieldNames()`
* `cantUseInOperatorOnCompositeKeys()` => `Persisters\Exception\CantUseInOperatorOnCompositeKeys::create()`
## BC Break: `CacheException` is no longer a class, but an interface
All methods in `Doctrine\ORM\Cache\CacheException` have been extracted to dedicated exceptions.
* `updateReadOnlyCollection()` => `Cache\Exception\CannotUpdateReadOnlyCollection::fromEntityAndField()`
* `updateReadOnlyEntity()` => `Cache\Exception\CannotUpdateReadOnlyEntity::fromEntity()`
* `nonCacheableEntity()` => `Cache\Exception\NonCacheableEntity::fromEntity()`
* `nonCacheableEntityAssociation()` => `Cache\Exception\NonCacheableEntityAssociation::fromEntityAndField()`
## BC Break: Missing type declaration added for identifier generators
Although undocumented, it was possible to configure a custom repository
class that implements `ObjectRepository` but does not extend the
`EntityRepository` base class. Repository classes have to extend
`EntityRepository` now.
## BC BREAK: Removed support for entity namespace alias
- `EntityManager::getRepository()` no longer accepts the entity namespace alias
notation.
- `Configuration::addEntityNamespace()` and
`Configuration::getEntityNamespace()` have been removed.
## BC BREAK: Remove helper methods from `AbstractCollectionPersister`
The following protected methods of
`Doctrine\ORM\Cache\Persister\Collection\AbstractCollectionPersister`
have been removed.
* `evictCollectionCache()`
* `evictElementCache()`
## BC BREAK: `Doctrine\ORM\Query\TreeWalkerChainIterator`
This class has been removed without replacement.
## BC BREAK: Remove quoting methods from `ClassMetadata`
The following methods have been removed from the class metadata because
quoting is handled by implementations of `Doctrine\ORM\Mapping\QuoteStrategy`:
* `getQuotedIdentifierColumnNames()`
* `getQuotedColumnName()`
* `getQuotedTableName()`
* `getQuotedJoinTableName()`
## BC BREAK: Remove ability to merge detached entities
Merge semantics was a poor fit for the PHP "share-nothing" architecture.
In addition to that, merging caused multiple issues with data integrity
in the managed entity graph, which was constantly spawning more edge-case
bugs/scenarios.
The method `UnitOfWork::merge()` has been removed. The method
`EntityManager::merge()` will throw an exception on each call.
## BC BREAK: Removed ability to partially flush/commit entity manager and unit of work
The following methods don't accept a single entity or an array of entities anymore:
* `Doctrine\ORM\EntityManager::flush()`
* `Doctrine\ORM\Decorator\EntityManagerDecorator::flush()`
* `Doctrine\ORM\UnitOfWork::commit()`
The semantics of `flush()` and `commit()` will remain the same, but the change
tracking will be performed on all entities managed by the unit of work, and not
just on the provided entities, as the parameter is now completely ignored.
## BC BREAK: Removed ability to partially clear entity manager and unit of work
* Passing an argument other than `null` to `EntityManager::clear()` will raise
an exception.
* The unit of work cannot be cleared partially anymore. Passing an argument to
`UnitOfWork::clear()` does not have any effect anymore; the unit of work is
cleared completely.
* The method `EntityRepository::clear()` has been removed.
* The methods `getEntityClass()` and `clearsAllEntities()` have been removed
from `OnClearEventArgs`.
## BC BREAK: Remove support for Doctrine Cache
The Doctrine Cache library is not supported anymore. The following methods
have been removed from `Doctrine\ORM\Configuration`:
* `getQueryCacheImpl()`
* `setQueryCacheImpl()`
* `getHydrationCacheImpl()`
* `setHydrationCacheImpl()`
* `getMetadataCacheImpl()`
* `setMetadataCacheImpl()`
The methods have been replaced by PSR-6 compatible counterparts
(just strip the `Impl` suffix from the old name to get the new one).
## BC BREAK: Remove `Doctrine\ORM\Configuration::newDefaultAnnotationDriver`
This functionality has been moved to the new `ORMSetup` class. Call
`Doctrine\ORM\ORMSetup::createDefaultAnnotationDriver()` to create
a new annotation driver.
## BC BREAK: Remove `Doctrine\ORM\Tools\Setup`
In our effort to migrate from Doctrine Cache to PSR-6, the `Setup` class which
accepted a Doctrine Cache instance in each method has been removed.
The replacement is `Doctrine\ORM\ORMSetup` which accepts a PSR-6
cache instead.
## BC BREAK: Removed named queries
All APIs related to named queries have been removed.
## BC BREAK: Remove old cache accessors and mutators from query classes
The following methods have been removed from `AbstractQuery`:
* `setResultCacheDriver()`
* `getResultCacheDriver()`
* `useResultCache()`
* `getResultCacheLifetime()`
* `getResultCacheId()`
The following methods have been removed from `Query`:
* `setQueryCacheDriver()`
* `getQueryCacheDriver()`
## BC BREAK: Remove `Doctrine\ORM\Cache\MultiGetRegion`
The interface has been merged into `Doctrine\ORM\Cache\Region`.
## BC BREAK: Rename `AbstractIdGenerator::generate()` to `generateId()`
* Implementations of `AbstractIdGenerator` have to implement the method
`generateId()`.
* The method `generate()` has been removed from `AbstractIdGenerator`.
## BC BREAK: Remove cache settings inspection
Doctrine does not provide its own cache implementation anymore and relies on
the PSR-6 standard instead. As a consequence, we cannot determine anymore
whether a given cache adapter is suitable for a production environment.
Because of that, functionality that aims to do so has been removed:
* `Configuration::ensureProductionSettings()`
* the `orm:ensure-production-settings` console command
## BC BREAK: PSR-6-based second level cache
The second level cache has been reworked to consume a PSR-6 cache. Using a
Doctrine Cache instance is not supported anymore.
* `DefaultCacheFactory`: The constructor expects a PSR-6 cache item pool as
second argument now.
* `DefaultMultiGetRegion`: This class has been removed.
* `DefaultRegion`:
* The constructor expects a PSR-6 cache item pool as second argument now.
* The protected `$cache` property is removed.
* The properties `$name` and `$lifetime` as well as the constant
`REGION_KEY_SEPARATOR` and the method `getCacheEntryKey()` are
`private` now.
* The method `getCache()` has been removed.
## BC Break: Remove `Doctrine\ORM\Mapping\Driver\PHPDriver`
Use `StaticPHPDriver` instead when you want to programmatically configure
entity metadata.
## BC BREAK: Remove `Doctrine\ORM\EntityManagerInterface#transactional()`
This method has been replaced by `Doctrine\ORM\EntityManagerInterface#wrapInTransaction()`.
## BC BREAK: Removed support for schema emulation.
The ORM no longer attempts to emulate schemas on SQLite.
## BC BREAK: Remove `Setup::registerAutoloadDirectory()`
Use Composer's autoloader instead.
## BC BREAK: Remove YAML mapping drivers.
If your code relies on `YamlDriver` or `SimpleYamlDriver`, you **MUST** migrate to
attribute, annotation or XML drivers instead.
You can use the `orm:convert-mapping` command to convert your metadata mapping to XML
_before_ upgrading to 3.0:
```sh
php doctrine orm:convert-mapping xml /path/to/mapping-path-converted-to-xml
```
## BC BREAK: Remove code generators and related console commands
These console commands have been removed:
* `orm:convert-d1-schema`
* `orm:convert-mapping`
* `orm:generate:entities`
* `orm:generate-repositories`
These classes have been deprecated:
* `Doctrine\ORM\Tools\ConvertDoctrine1Schema`
* `Doctrine\ORM\Tools\EntityGenerator`
* `Doctrine\ORM\Tools\EntityRepositoryGenerator`
The entire `Doctrine\ORM\Tools\Export` namespace has been removed as well.
## BC BREAK: Removed `Doctrine\ORM\Version`
Use Composer's runtime API if you _really_ need to check the version of the ORM package at runtime.
## BC BREAK: EntityRepository::count() signature change
The argument `$criteria` of `Doctrine\ORM\EntityRepository::count()` is now
optional. Overrides in child classes should be made compatible.
## BC BREAK: changes in exception hierarchy
- `Doctrine\ORM\ORMException` has been removed
- `Doctrine\ORM\Exception\ORMException` is now an interface
## Variadic methods now use native variadics
The following methods were using `func_get_args()` to simulate a variadic argument:
- `Doctrine\ORM\Query\Expr#andX()`
- `Doctrine\ORM\Query\Expr#orX()`
- `Doctrine\ORM\QueryBuilder#select()`
- `Doctrine\ORM\QueryBuilder#addSelect()`
- `Doctrine\ORM\QueryBuilder#where()`
- `Doctrine\ORM\QueryBuilder#andWhere()`
- `Doctrine\ORM\QueryBuilder#orWhere()`
- `Doctrine\ORM\QueryBuilder#groupBy()`
- `Doctrine\ORM\QueryBuilder#andGroupBy()`
- `Doctrine\ORM\QueryBuilder#having()`
- `Doctrine\ORM\QueryBuilder#andHaving()`
- `Doctrine\ORM\QueryBuilder#orHaving()`
A variadic argument is now actually used in their signatures signature (`...$x`).
Signatures of overridden methods should be changed accordingly
## Minor BC BREAK: removed `Doctrine\ORM\EntityManagerInterface#copy()`
Method `Doctrine\ORM\EntityManagerInterface#copy()` never got its implementation and is removed in 3.0.
## BC BREAK: Removed classes related to UUID and TABLE generator strategies
The following classes have been removed:
- `Doctrine\ORM\Id\TableGenerator`
- `Doctrine\ORM\Id\UuidGenerator`
Using the `UUID` strategy for generating identifiers is not supported anymore.
## BC BREAK: Removed `Query::iterate()`
The deprecated method `Query::iterate()` has been removed along with the
following classes and methods:
- `AbstractHydrator::iterate()`
- `AbstractHydrator::hydrateRow()`
- `IterableResult`
Use `toIterable()` instead.
# Upgrade to 2.20
## Add `Doctrine\ORM\Query\OutputWalker` interface, deprecate `Doctrine\ORM\Query\SqlWalker::getExecutor()`
Output walkers should implement the new `\Doctrine\ORM\Query\OutputWalker` interface and create
`Doctrine\ORM\Query\Exec\SqlFinalizer` instances instead of `Doctrine\ORM\Query\Exec\AbstractSqlExecutor`s.
The output walker must not base its workings on the query `firstResult`/`maxResult` values, so that the
The output walker must not base its workings on the query `firstResult`/`maxResult` values, so that the
`SqlFinalizer` can be kept in the query cache and used regardless of the actual `firstResult`/`maxResult` values.
Any operation dependent on `firstResult`/`maxResult` should take place within the `SqlFinalizer::createExecutor()`
method. Details can be found at https://github.com/doctrine/orm/pull/11188.
@@ -17,7 +928,7 @@ change in behavior.
Progress on this is tracked at https://github.com/doctrine/orm/issues/11624 .
## PARTIAL DQL syntax is undeprecated
## PARTIAL DQL syntax is undeprecated
Use of the PARTIAL keyword is not deprecated anymore in DQL, because we will be
able to support PARTIAL objects with PHP 8.4 Lazy Objects and

View File

@@ -1,4 +0,0 @@
#!/usr/bin/env php
<?php
include(__DIR__ . '/doctrine.php');

View File

@@ -1,43 +0,0 @@
<?php
fwrite(
STDERR,
'[Warning] The use of this script is discouraged. See'
. ' https://www.doctrine-project.org/projects/doctrine-orm/en/current/reference/tools.html#doctrine-console'
. ' for instructions on bootstrapping the console runner.'
. PHP_EOL
);
echo PHP_EOL . PHP_EOL;
require_once 'Doctrine/Common/ClassLoader.php';
$classLoader = new \Doctrine\Common\ClassLoader('Doctrine');
$classLoader->register();
$classLoader = new \Doctrine\Common\ClassLoader('Symfony');
$classLoader->register();
$configFile = getcwd() . DIRECTORY_SEPARATOR . 'cli-config.php';
$helperSet = null;
if (file_exists($configFile)) {
if ( ! is_readable($configFile)) {
trigger_error(
'Configuration file [' . $configFile . '] does not have read permission.', E_USER_ERROR
);
}
require $configFile;
foreach ($GLOBALS as $helperSetCandidate) {
if ($helperSetCandidate instanceof \Symfony\Component\Console\Helper\HelperSet) {
$helperSet = $helperSetCandidate;
break;
}
}
}
$helperSet = ($helperSet) ?: new \Symfony\Component\Console\Helper\HelperSet();
\Doctrine\ORM\Tools\Console\ConsoleRunner::run($helperSet);

View File

@@ -1,9 +0,0 @@
@echo off
if "%PHPBIN%" == "" set PHPBIN=@php_bin@
if not exist "%PHPBIN%" if "%PHP_PEAR_PHP_BIN%" neq "" goto USE_PEAR_PATH
GOTO RUN
:USE_PEAR_PATH
set PHPBIN=%PHP_PEAR_PHP_BIN%
:RUN
"%PHPBIN%" "@bin_dir@\doctrine" %*

View File

@@ -1,62 +0,0 @@
<?php
use Symfony\Component\Console\Helper\HelperSet;
use Doctrine\ORM\Tools\Console\ConsoleRunner;
fwrite(
STDERR,
'[Warning] The use of this script is discouraged. See'
. ' https://www.doctrine-project.org/projects/doctrine-orm/en/current/reference/tools.html#doctrine-console'
. ' for instructions on bootstrapping the console runner.'
. PHP_EOL
);
echo PHP_EOL . PHP_EOL;
$autoloadFiles = [
__DIR__ . '/../vendor/autoload.php',
__DIR__ . '/../../../autoload.php'
];
foreach ($autoloadFiles as $autoloadFile) {
if (file_exists($autoloadFile)) {
require_once $autoloadFile;
break;
}
}
$directories = [getcwd(), getcwd() . DIRECTORY_SEPARATOR . 'config'];
$configFile = null;
foreach ($directories as $directory) {
$configFile = $directory . DIRECTORY_SEPARATOR . 'cli-config.php';
if (file_exists($configFile)) {
break;
}
}
if ( ! file_exists($configFile)) {
ConsoleRunner::printCliConfigTemplate();
exit(1);
}
if ( ! is_readable($configFile)) {
echo 'Configuration file [' . $configFile . '] does not have read permission.' . "\n";
exit(1);
}
$commands = [];
$helperSet = require $configFile;
if ( ! ($helperSet instanceof HelperSet)) {
foreach ($GLOBALS as $helperSetCandidate) {
if ($helperSetCandidate instanceof HelperSet) {
$helperSet = $helperSetCandidate;
break;
}
}
}
ConsoleRunner::run($helperSet, $commands);

View File

@@ -3,9 +3,13 @@
xsi:noNamespaceSchemaLocation="../../../vendor/phpunit/phpunit/phpunit.xsd"
colors="true"
beStrictAboutOutputDuringTests="true"
beStrictAboutTodoAnnotatedTests="true"
displayDetailsOnTestsThatTriggerDeprecations="true"
displayDetailsOnTestsThatTriggerNotices="true"
displayDetailsOnTestsThatTriggerWarnings="true"
failOnNotice="true"
failOnWarning="true"
failOnRisky="true"
convertDeprecationsToExceptions="true"
cacheDirectory=".phpunit.cache"
>
<php>
<ini name="error_reporting" value="-1" />
@@ -14,9 +18,13 @@
<var name="db_port" value="3306"/>
<var name="db_user" value="root" />
<var name="db_dbname" value="doctrine_tests" />
<var name="db_default_table_option_charset" value="utf8mb4" />
<var name="db_default_table_option_collation" value="utf8mb4_unicode_ci" />
<var name="db_default_table_option_engine" value="InnoDB" />
<!-- necessary change for some CLI/console output test assertions -->
<env name="COLUMNS" value="120"/>
<env name="DOCTRINE_DEPRECATIONS" value="trigger"/>
</php>
<testsuites>
@@ -25,11 +33,11 @@
</testsuite>
</testsuites>
<filter>
<whitelist>
<source ignoreSuppressionOfDeprecations="true">
<include>
<directory suffix=".php">../../../src</directory>
</whitelist>
</filter>
</include>
</source>
<groups>
<exclude>

View File

@@ -3,9 +3,13 @@
xsi:noNamespaceSchemaLocation="../../../vendor/phpunit/phpunit/phpunit.xsd"
colors="true"
beStrictAboutOutputDuringTests="true"
beStrictAboutTodoAnnotatedTests="true"
displayDetailsOnTestsThatTriggerDeprecations="true"
displayDetailsOnTestsThatTriggerNotices="true"
displayDetailsOnTestsThatTriggerWarnings="true"
failOnNotice="true"
failOnWarning="true"
failOnRisky="true"
convertDeprecationsToExceptions="true"
cacheDirectory=".phpunit.cache"
>
<php>
<ini name="error_reporting" value="-1" />
@@ -14,9 +18,13 @@
<var name="db_port" value="3306"/>
<var name="db_user" value="root" />
<var name="db_dbname" value="doctrine_tests" />
<var name="db_default_table_option_charset" value="utf8mb4" />
<var name="db_default_table_option_collation" value="utf8mb4_unicode_ci" />
<var name="db_default_table_option_engine" value="InnoDB" />
<!-- necessary change for some CLI/console output test assertions -->
<env name="COLUMNS" value="120"/>
<env name="DOCTRINE_DEPRECATIONS" value="trigger"/>
</php>
<testsuites>
@@ -25,12 +33,11 @@
</testsuite>
</testsuites>
<filter>
<whitelist>
<source ignoreSuppressionOfDeprecations="true">
<include>
<directory suffix=".php">../../../src</directory>
</whitelist>
</filter>
</include>
</source>
<groups>
<exclude>

View File

@@ -3,9 +3,13 @@
xsi:noNamespaceSchemaLocation="../../../vendor/phpunit/phpunit/phpunit.xsd"
colors="true"
beStrictAboutOutputDuringTests="true"
beStrictAboutTodoAnnotatedTests="true"
displayDetailsOnTestsThatTriggerDeprecations="true"
displayDetailsOnTestsThatTriggerNotices="true"
displayDetailsOnTestsThatTriggerWarnings="true"
failOnNotice="true"
failOnWarning="true"
failOnRisky="true"
convertDeprecationsToExceptions="true"
cacheDirectory=".phpunit.cache"
>
<php>
<ini name="error_reporting" value="-1" />
@@ -17,6 +21,7 @@
<!-- necessary change for some CLI/console output test assertions -->
<env name="COLUMNS" value="120"/>
<env name="DOCTRINE_DEPRECATIONS" value="trigger"/>
</php>
<testsuites>
@@ -25,11 +30,11 @@
</testsuite>
</testsuites>
<filter>
<whitelist>
<source ignoreSuppressionOfDeprecations="true">
<include>
<directory suffix=".php">../../../src</directory>
</whitelist>
</filter>
</include>
</source>
<groups>
<exclude>

View File

@@ -3,9 +3,13 @@
xsi:noNamespaceSchemaLocation="../../../vendor/phpunit/phpunit/phpunit.xsd"
colors="true"
beStrictAboutOutputDuringTests="true"
beStrictAboutTodoAnnotatedTests="true"
displayDetailsOnTestsThatTriggerDeprecations="true"
displayDetailsOnTestsThatTriggerNotices="true"
displayDetailsOnTestsThatTriggerWarnings="true"
failOnNotice="true"
failOnWarning="true"
failOnRisky="true"
convertDeprecationsToExceptions="true"
cacheDirectory=".phpunit.cache"
>
<php>
<ini name="error_reporting" value="-1" />
@@ -15,6 +19,7 @@
<!-- necessary change for some CLI/console output test assertions -->
<env name="COLUMNS" value="120"/>
<env name="DOCTRINE_DEPRECATIONS" value="trigger"/>
</php>
<testsuites>
@@ -23,11 +28,11 @@
</testsuite>
</testsuites>
<filter>
<whitelist>
<source ignoreSuppressionOfDeprecations="true">
<include>
<directory suffix=".php">../../../src</directory>
</whitelist>
</filter>
</include>
</source>
<groups>
<exclude>

View File

@@ -3,9 +3,13 @@
xsi:noNamespaceSchemaLocation="../../../vendor/phpunit/phpunit/phpunit.xsd"
colors="true"
beStrictAboutOutputDuringTests="true"
beStrictAboutTodoAnnotatedTests="true"
displayDetailsOnTestsThatTriggerDeprecations="true"
displayDetailsOnTestsThatTriggerNotices="true"
displayDetailsOnTestsThatTriggerWarnings="true"
failOnNotice="true"
failOnWarning="true"
failOnRisky="true"
convertDeprecationsToExceptions="true"
cacheDirectory=".phpunit.cache"
>
<php>
<ini name="error_reporting" value="-1" />
@@ -17,6 +21,7 @@
<!-- necessary change for some CLI/console output test assertions -->
<env name="COLUMNS" value="120"/>
<env name="DOCTRINE_DEPRECATIONS" value="trigger"/>
</php>
<testsuites>
@@ -25,11 +30,11 @@
</testsuite>
</testsuites>
<filter>
<whitelist>
<source ignoreSuppressionOfDeprecations="true">
<include>
<directory suffix=".php">../../../src</directory>
</whitelist>
</filter>
</include>
</source>
<groups>
<exclude>

View File

@@ -3,9 +3,13 @@
xsi:noNamespaceSchemaLocation="../../../vendor/phpunit/phpunit/phpunit.xsd"
colors="true"
beStrictAboutOutputDuringTests="true"
beStrictAboutTodoAnnotatedTests="true"
displayDetailsOnTestsThatTriggerDeprecations="true"
displayDetailsOnTestsThatTriggerNotices="true"
displayDetailsOnTestsThatTriggerWarnings="true"
failOnNotice="true"
failOnWarning="true"
failOnRisky="true"
convertDeprecationsToExceptions="true"
cacheDirectory=".phpunit.cache"
>
<php>
<ini name="error_reporting" value="-1" />
@@ -15,6 +19,7 @@
<!-- necessary change for some CLI/console output test assertions -->
<env name="COLUMNS" value="120"/>
<env name="DOCTRINE_DEPRECATIONS" value="trigger"/>
</php>
<testsuites>
@@ -23,11 +28,11 @@
</testsuite>
</testsuites>
<filter>
<whitelist>
<source ignoreSuppressionOfDeprecations="true">
<include>
<directory suffix=".php">../../../src</directory>
</whitelist>
</filter>
</include>
</source>
<groups>
<exclude>

View File

@@ -1,19 +1,77 @@
{
"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"
"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"
}
],
"homepage": "https://www.doctrine-project.org/projects/orm.html",
"require": {
"php": "^8.1",
"ext-ctype": "*",
"composer-runtime-api": "^2",
"doctrine/collections": "^2.2",
"doctrine/dbal": "^3.8.2 || ^4",
"doctrine/deprecations": "^0.5.3 || ^1",
"doctrine/event-manager": "^1.2 || ^2",
"doctrine/inflector": "^1.4 || ^2.0",
"doctrine/instantiator": "^1.3 || ^2",
"doctrine/lexer": "^3",
"doctrine/persistence": "^3.3.1 || ^4",
"psr/cache": "^1 || ^2 || ^3",
"symfony/console": "^5.4 || ^6.0 || ^7.0",
"symfony/var-exporter": "^6.3.9 || ^7.0"
},
"require-dev": {
"doctrine/coding-standard": "^14.0",
"phpbench/phpbench": "^1.0",
"phpdocumentor/guides-cli": "^1.4",
"phpstan/extension-installer": "^1.4",
"phpstan/phpstan": "2.1.23",
"phpstan/phpstan-deprecation-rules": "^2",
"phpunit/phpunit": "^10.5.0 || ^11.5",
"psr/log": "^1 || ^2 || ^3",
"symfony/cache": "^5.4 || ^6.2 || ^7.0"
},
"suggest": {
"ext-dom": "Provides support for XSD validation for XML mapping files",
"symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0"
},
"autoload": {
"psr-4": {
"Doctrine\\ORM\\": "src"
}
},
"autoload-dev": {
"psr-4": {
"Doctrine\\Performance\\": "tests/Performance",
"Doctrine\\StaticAnalysis\\": "tests/StaticAnalysis",
"Doctrine\\Tests\\": "tests/Tests"
}
},
"config": {
"allow-plugins": {
@@ -23,58 +81,7 @@
},
"sort-packages": true
},
"require": {
"php": "^7.1 || ^8.0",
"composer-runtime-api": "^2",
"ext-ctype": "*",
"doctrine/cache": "^1.12.1 || ^2.1.1",
"doctrine/collections": "^1.5 || ^2.1",
"doctrine/common": "^3.0.3",
"doctrine/dbal": "^2.13.1 || ^3.2",
"doctrine/deprecations": "^0.5.3 || ^1",
"doctrine/event-manager": "^1.2 || ^2",
"doctrine/inflector": "^1.4 || ^2.0",
"doctrine/instantiator": "^1.3 || ^2",
"doctrine/lexer": "^2 || ^3",
"doctrine/persistence": "^2.4 || ^3",
"psr/cache": "^1 || ^2 || ^3",
"symfony/console": "^4.2 || ^5.0 || ^6.0 || ^7.0",
"symfony/polyfill-php72": "^1.23",
"symfony/polyfill-php80": "^1.16"
},
"require-dev": {
"doctrine/annotations": "^1.13 || ^2",
"doctrine/coding-standard": "^9.0.2 || ^14.0",
"phpbench/phpbench": "^0.16.10 || ^1.0",
"phpstan/extension-installer": "~1.1.0 || ^1.4",
"phpstan/phpstan": "~1.4.10 || 2.1.22",
"phpstan/phpstan-deprecation-rules": "^1 || ^2",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.6",
"psr/log": "^1 || ^2 || ^3",
"symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7.0",
"symfony/var-exporter": "^4.4 || ^5.4 || ^6.2 || ^7.0",
"symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0"
},
"conflict": {
"doctrine/annotations": "<1.13 || >= 3.0"
},
"suggest": {
"ext-dom": "Provides support for XSD validation for XML mapping files",
"symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0",
"symfony/yaml": "If you want to use YAML Metadata Mapping Driver"
},
"autoload": {
"psr-4": { "Doctrine\\ORM\\": "src" }
},
"autoload-dev": {
"psr-4": {
"Doctrine\\Tests\\": "tests/Tests",
"Doctrine\\StaticAnalysis\\": "tests/StaticAnalysis",
"Doctrine\\Performance\\": "tests/Performance"
}
},
"bin": ["bin/doctrine"],
"archive": {
"exclude": ["!vendor", "tests", "*phpunit.xml", "build.xml", "build.properties", "composer.phar", "vendor/satooshi", "lib/vendor", "*.swp"]
"scripts": {
"docs": "composer --working-dir docs update && ./docs/vendor/bin/build-docs.sh @additional_args"
}
}

View File

@@ -140,11 +140,6 @@ Now we're going to create the ``point`` type and implement all required methods.
return $value;
}
public function canRequireSQLConversion()
{
return true;
}
public function convertToPHPValueSQL($sqlExpr, AbstractPlatform $platform)
{
return sprintf('AsText(%s)', $sqlExpr);

View File

@@ -352,7 +352,7 @@ the database using a FOR UPDATE.
use Bank\Entities\Account;
use Doctrine\DBAL\LockMode;
$account = $em->find(Account::class, $accId, LockMode::PESSIMISTIC_READ);
$account = $em->find(Account::class, $accId, LockMode::PESSIMISTIC_WRITE);
Keeping Updates and Deletes in Sync
-----------------------------------

View File

@@ -232,6 +232,33 @@ vendors SQL parser to show us further errors in the parsing
process, for example if the Unit would not be one of the supported
values by MySql.
Typed functions
---------------
By default, result of custom functions is fetched as-is from the database driver.
If you want to be sure that the type is always the same, then your custom function needs to
implement ``Doctrine\ORM\Query\AST\TypedExpression``. Then, the result is wired
through ``Doctrine\DBAL\Types\Type::convertToPhpValue()`` of the ``Type`` returned in ``getReturnType()``.
.. code-block:: php
<?php
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\AST\TypedExpression;
class DateDiff extends FunctionNode implements TypedExpression
{
// ...
public function getReturnType(): Type
{
return Type::getType(Types::INTEGER);
}
}
Conclusion
----------

View File

@@ -1,75 +0,0 @@
Implementing the Notify ChangeTracking Policy
=============================================
.. sectionauthor:: Roman Borschel <roman@code-factory.org>
The NOTIFY change-tracking policy is the most effective
change-tracking policy provided by Doctrine but it requires some
boilerplate code. This recipe will show you how this boilerplate
code should look like. We will implement it on a
`Layer Supertype <https://martinfowler.com/eaaCatalog/layerSupertype.html>`_
for all our domain objects.
.. note::
The notify change tracking policy is deprecated and will be removed in ORM 3.0.
(\ `Details <https://github.com/doctrine/orm/issues/8383>`_)
Implementing NotifyPropertyChanged
----------------------------------
The NOTIFY policy is based on the assumption that the entities
notify interested listeners of changes to their properties. For
that purpose, a class that wants to use this policy needs to
implement the ``NotifyPropertyChanged`` interface from the
``Doctrine\Common`` namespace.
.. code-block:: php
<?php
use Doctrine\Persistence\NotifyPropertyChanged;
use Doctrine\Persistence\PropertyChangedListener;
abstract class DomainObject implements NotifyPropertyChanged
{
private $listeners = array();
public function addPropertyChangedListener(PropertyChangedListener $listener) {
$this->listeners[] = $listener;
}
/** Notifies listeners of a change. */
protected function onPropertyChanged($propName, $oldValue, $newValue) {
if ($this->listeners) {
foreach ($this->listeners as $listener) {
$listener->propertyChanged($this, $propName, $oldValue, $newValue);
}
}
}
}
Then, in each property setter of concrete, derived domain classes,
you need to invoke onPropertyChanged as follows to notify
listeners:
.. code-block:: php
<?php
// Mapping not shown, either in attributes, annotations, xml or yaml as usual
class MyEntity extends DomainObject
{
private $data;
// ... other fields as usual
public function setData($data) {
if ($data != $this->data) { // check: is it actually modified?
$this->onPropertyChanged('data', $this->data, $data);
$this->data = $data;
}
}
}
The check whether the new value is different from the old one is
not mandatory but recommended. That way you can avoid unnecessary
updates and also have full control over when you consider a
property changed.

View File

@@ -43,20 +43,21 @@ entities:
.. code-block:: php
<?php
/** @Entity */
#[Entity]
class Article
{
const STATUS_VISIBLE = 'visible';
const STATUS_INVISIBLE = 'invisible';
public const STATUS_VISIBLE = 'visible';
public const STATUS_INVISIBLE = 'invisible';
/** @Column(type="string") */
#[Column(type: "string")]
private $status;
public function setStatus($status)
public function setStatus(string $status): void
{
if (!in_array($status, array(self::STATUS_VISIBLE, self::STATUS_INVISIBLE))) {
if (!in_array($status, [self::STATUS_VISIBLE, self::STATUS_INVISIBLE], true)) {
throw new \InvalidArgumentException("Invalid status");
}
$this->status = $status;
}
}
@@ -67,10 +68,10 @@ the **columnDefinition** attribute.
.. code-block:: php
<?php
/** @Entity */
#[Entity]
class Article
{
/** @Column(type="string", columnDefinition="ENUM('visible', 'invisible')") */
#[Column(type: "string", columnDefinition: "ENUM('visible', 'invisible')")]
private $status;
}
@@ -92,37 +93,33 @@ For example for the previous enum type:
class EnumVisibilityType extends Type
{
const ENUM_VISIBILITY = 'enumvisibility';
const STATUS_VISIBLE = 'visible';
const STATUS_INVISIBLE = 'invisible';
private const ENUM_VISIBILITY = 'enumvisibility';
private const STATUS_VISIBLE = 'visible';
private const STATUS_INVISIBLE = 'invisible';
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform): string
{
return "ENUM('visible', 'invisible')";
}
public function convertToPHPValue($value, AbstractPlatform $platform)
public function convertToPHPValue(mixed $value, AbstractPlatform $platform): mixed
{
return $value;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
public function convertToDatabaseValue(mixed $value, AbstractPlatform $platform): string
{
if (!in_array($value, array(self::STATUS_VISIBLE, self::STATUS_INVISIBLE))) {
if (!in_array($value, [self::STATUS_VISIBLE, self::STATUS_INVISIBLE], true)) {
throw new \InvalidArgumentException("Invalid status");
}
return $value;
}
public function getName()
public function getName(): string
{
return self::ENUM_VISIBILITY;
}
public function requiresSQLCommentHint(AbstractPlatform $platform)
{
return true;
}
}
You can register this type with ``Type::addType('enumvisibility', 'MyProject\DBAL\EnumVisibilityType');``.
@@ -131,10 +128,10 @@ Then in your entity you can just use this type:
.. code-block:: php
<?php
/** @Entity */
#[Entity]
class Article
{
/** @Column(type="enumvisibility") */
#[Column(type: "enumvisibility")]
private $status;
}
@@ -151,37 +148,33 @@ You can generalize this approach easily to create a base class for enums:
abstract class EnumType extends Type
{
protected $name;
protected $values = array();
protected $values = [];
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform): string
{
$values = array_map(function($val) { return "'".$val."'"; }, $this->values);
$values = array_map(fn($val) => "'".$val."'", $this->values);
return "ENUM(".implode(", ", $values).")";
}
public function convertToPHPValue($value, AbstractPlatform $platform)
public function convertToPHPValue(mixed $value, AbstractPlatform $platform): mixed
{
return $value;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
public function convertToDatabaseValue(mixed $value, AbstractPlatform $platform): mixed
{
if (!in_array($value, $this->values)) {
if (!in_array($value, $this->values, true)) {
throw new \InvalidArgumentException("Invalid '".$this->name."' value.");
}
return $value;
}
public function getName()
public function getName(): string
{
return $this->name;
}
public function requiresSQLCommentHint(AbstractPlatform $platform)
{
return true;
}
}
With this base class you can define an enum as easily as:
@@ -194,6 +187,5 @@ With this base class you can define an enum as easily as:
class EnumVisibilityType extends EnumType
{
protected $name = 'enumvisibility';
protected $values = array('visible', 'invisible');
protected $values = ['visible', 'invisible'];
}

View File

@@ -155,7 +155,7 @@ As you can see, we have a method "setBlockEntity" which ties a potential strateg
* that is used for this blockitem. (This string (!) value will be persisted by Doctrine ORM)
*
* This is a doctrine field, so make sure that you use a
#[Column] attribute or setup your yaml or xml files correctly
#[Column] attribute or setup your xml files correctly
* @var string
*/
protected $strategyClassName;

View File

@@ -71,23 +71,6 @@ First Attributes:
public function assertCustomerAllowedBuying() {}
}
As Annotations:
.. code-block:: php
<?php
/**
* @Entity
* @HasLifecycleCallbacks
*/
class Order
{
/**
* @PrePersist @PreUpdate
*/
public function assertCustomerAllowedBuying() {}
}
In XML Mappings:
.. code-block:: xml

View File

@@ -162,15 +162,13 @@ requiring timezoned datetimes:
<?php
namespace Shipping;
/**
* @Entity
*/
#[Entity]
class Event
{
/** @Column(type="datetime") */
#[Column(type: 'datetime')]
private $created;
/** @Column(type="string") */
#[Column(type: 'string')]
private $timezone;
/**

View File

@@ -1,4 +1,4 @@
Welcome to Doctrine 2 ORM's documentation!
Welcome to Doctrine ORM's documentation!
==========================================
The Doctrine documentation is comprised of tutorials, a reference section and
@@ -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>`_
@@ -39,10 +38,8 @@ Mapping Objects onto a Database
:doc:`Inheritance <reference/inheritance-mapping>`
* **Drivers**:
:doc:`Docblock Annotations <reference/annotations-reference>` \|
:doc:`Attributes <reference/attributes-reference>` \|
:doc:`XML <reference/xml-mapping>` \|
:doc:`YAML <reference/yaml-mapping>` \|
:doc:`PHP <reference/php-mapping>`
Working with Objects
@@ -75,6 +72,7 @@ Advanced Topics
* :doc:`TypedFieldMapper <reference/typedfieldmapper>`
* :doc:`Improving Performance <reference/improving-performance>`
* :doc:`Caching <reference/caching>`
* :doc:`Partial Hydration <reference/partial-hydration>`
* :doc:`Partial Objects <reference/partial-objects>`
* :doc:`Change Tracking Policies <reference/change-tracking-policies>`
* :doc:`Best Practices <reference/best-practices>`
@@ -113,7 +111,6 @@ Cookbook
* **Implementation**:
:doc:`Array Access <cookbook/implementing-arrayaccess-for-domain-objects>` \|
:doc:`Notify ChangeTracking Example <cookbook/implementing-the-notify-changetracking-policy>` \|
:doc:`Working with DateTime <cookbook/working-with-datetime>` \|
:doc:`Validation <cookbook/validation-of-entities>` \|
:doc:`Entities in the Session <cookbook/entities-in-session>` \|

View File

@@ -19,7 +19,7 @@ steps of configuration.
// ...
if ($applicationMode == "development") {
if ($applicationMode === "development") {
$queryCache = new ArrayAdapter();
$metadataCache = new ArrayAdapter();
} else {
@@ -32,13 +32,18 @@ steps of configuration.
$driverImpl = new AttributeDriver(['/path/to/lib/MyProject/Entities'], true);
$config->setMetadataDriverImpl($driverImpl);
$config->setQueryCache($queryCache);
$config->setProxyDir('/path/to/myproject/lib/MyProject/Proxies');
$config->setProxyNamespace('MyProject\Proxies');
if ($applicationMode == "development") {
$config->setAutoGenerateProxyClasses(true);
if (PHP_VERSION_ID > 80400) {
$config->enableNativeLazyObjects(true);
} else {
$config->setAutoGenerateProxyClasses(false);
$config->setProxyDir('/path/to/myproject/lib/MyProject/Proxies');
$config->setProxyNamespace('MyProject\Proxies');
if ($applicationMode === "development") {
$config->setAutoGenerateProxyClasses(true);
} else {
$config->setAutoGenerateProxyClasses(false);
}
}
$connection = DriverManager::getConnection([
@@ -71,8 +76,27 @@ Configuration Options
The following sections describe all the configuration options
available on a ``Doctrine\ORM\Configuration`` instance.
Proxy Directory (**REQUIRED**)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. _reference-native-lazy-objects:
Native Lazy Objects (**OPTIONAL**)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
With PHP 8.4 we recommend that you use native lazy objects instead of
the code generation approach using the ``symfony/var-exporter`` Ghost trait.
With Doctrine 4, the minimal requirement will become PHP 8.4 and native lazy objects
will become the only approach to lazy loading.
.. code-block:: php
<?php
$config->enableNativeLazyObjects(true);
Proxy Directory
~~~~~~~~~~~~~~~
Required except if you use native lazy objects with PHP 8.4.
This setting will be removed in the future.
.. code-block:: php
@@ -85,8 +109,11 @@ classes. For a detailed explanation on proxy classes and how they
are used in Doctrine, refer to the "Proxy Objects" section further
down.
Proxy Namespace (**REQUIRED**)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Proxy Namespace
~~~~~~~~~~~~~~~
Required except if you use native lazy objects with PHP 8.4.
This setting will be removed in the future.
.. code-block:: php
@@ -111,21 +138,16 @@ Gets or sets the metadata driver implementation that is used by
Doctrine to acquire the object-relational metadata for your
classes.
There are currently 5 available implementations:
There are currently 3 available implementations:
- ``Doctrine\ORM\Mapping\Driver\AttributeDriver``
- ``Doctrine\ORM\Mapping\Driver\XmlDriver``
- ``Doctrine\ORM\Mapping\Driver\DriverChain``
- ``Doctrine\ORM\Mapping\Driver\AnnotationDriver`` (deprecated and will
be removed in ``doctrine/orm`` 3.0)
- ``Doctrine\ORM\Mapping\Driver\YamlDriver`` (deprecated and will be
removed in ``doctrine/orm`` 3.0)
Throughout the most part of this manual the AttributeDriver is
used in the examples. For information on the usage of the
AnnotationDriver, XmlDriver or YamlDriver please refer to the dedicated
chapters ``Annotation Reference``, ``XML Mapping`` and ``YAML Mapping``.
XmlDriver please refer to the dedicated chapter ``XML Mapping``.
The attribute driver can be injected in the ``Doctrine\ORM\Configuration``:
@@ -155,9 +177,9 @@ Metadata Cache (**RECOMMENDED**)
Gets or sets the cache adapter to use for caching metadata
information, that is, all the information you supply via attributes,
annotations, xml or yaml, so that they do not need to be parsed and
loaded from scratch on every single request which is a waste of
resources. The cache implementation must implement the PSR-6
xml, so that they do not need to be parsed and loaded from scratch on
every single request which is a waste of resources. The cache
implementation must implement the PSR-6
``Psr\Cache\CacheItemPoolInterface`` interface.
Usage of a metadata cache is highly recommended.
@@ -205,6 +227,9 @@ deprecated ``Doctrine\DBAL\Logging\SQLLogger`` interface.
Auto-generating Proxy Classes (**OPTIONAL**)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This setting is not required if you use native lazy objects with PHP 8.4
and will be removed in the future.
Proxy classes can either be generated manually through the Doctrine
Console or automatically at runtime by Doctrine. The configuration
option that controls this behavior is:
@@ -425,7 +450,7 @@ Multiple Metadata Sources
When using different components using Doctrine ORM you may end up
with them using two different metadata drivers, for example XML and
YAML. You can use the MappingDriverChain Metadata implementations to
PHP. You can use the MappingDriverChain Metadata implementations to
aggregate these drivers based on namespaces:
.. code-block:: php
@@ -435,7 +460,7 @@ aggregate these drivers based on namespaces:
$chain = new MappingDriverChain();
$chain->addDriver($xmlDriver, 'Doctrine\Tests\Models\Company');
$chain->addDriver($yamlDriver, 'Doctrine\Tests\ORM\Mapping');
$chain->addDriver($phpDriver, 'Doctrine\Tests\ORM\Mapping');
Based on the namespace of the entity the loading of entities is
delegated to the appropriate driver. The chain semantics come from

File diff suppressed because it is too large Load Diff

View File

@@ -18,7 +18,7 @@ well.
Requirements
------------
Doctrine ORM requires a minimum of PHP 7.1. For greatly improved
Doctrine ORM requires a minimum of PHP 8.1. For greatly improved
performance it is also recommended that you use APC with PHP.
Doctrine ORM Packages
@@ -33,14 +33,13 @@ Doctrine ORM is divided into four main packages.
- ORM (depends on DBAL+Persistence+Collections)
This manual mainly covers the ORM package, sometimes touching parts
of the underlying DBAL and Persistence packages. The Doctrine code base
is split in to these packages for a few reasons and they are to...
of the underlying DBAL and Persistence packages. The Doctrine codebase
is split into these packages for a few reasons:
- ...make things more maintainable and decoupled
- ...allow you to use the code in Doctrine Persistence and Collections
without the ORM or DBAL
- ...allow you to use the DBAL without the ORM
- to make things more maintainable and decoupled
- to allow you to use the code in Doctrine Persistence and Collections without the ORM or DBAL
- to allow you to use the DBAL without the ORM
Collection, Event Manager and Persistence
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -80,8 +79,9 @@ Entities
An entity is a lightweight, persistent domain object. An entity can
be any regular PHP class observing the following restrictions:
- An entity class must not be final nor read-only but
it may contain final methods or read-only properties.
- An entity class can be final or read-only when
you use :ref:`native lazy objects <reference-native-lazy-objects>`.
It may contain final methods or read-only properties too.
- Any two entity classes in a class hierarchy that inherit
directly or indirectly from one another must not have a mapped
property with the same name. That is, if B inherits from A then B

View File

@@ -56,27 +56,6 @@ A many-to-one association is the most common association between objects. Exampl
// ...
}
.. code-block:: annotation
<?php
/** @Entity */
class User
{
// ...
/**
* @ManyToOne(targetEntity="Address")
* @JoinColumn(name="address_id", referencedColumnName="id")
*/
private Address|null $address = null;
}
/** @Entity */
class Address
{
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -87,18 +66,6 @@ A many-to-one association is the most common association between objects. Exampl
</entity>
</doctrine-mapping>
.. code-block:: yaml
User:
type: entity
manyToOne:
address:
targetEntity: Address
joinColumn:
name: address_id
referencedColumnName: id
.. note::
The above ``#[JoinColumn]`` is optional as it would default
@@ -154,30 +121,6 @@ references one ``Shipment`` entity.
// ...
}
.. code-block:: annotation
<?php
/** @Entity */
class Product
{
// ...
/**
* One Product has One Shipment.
* @OneToOne(targetEntity="Shipment")
* @JoinColumn(name="shipment_id", referencedColumnName="id")
*/
private Shipment|null $shipment = null;
// ...
}
/** @Entity */
class Shipment
{
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -188,17 +131,6 @@ references one ``Shipment`` entity.
</entity>
</doctrine-mapping>
.. code-block:: yaml
Product:
type: entity
oneToOne:
shipment:
targetEntity: Shipment
joinColumn:
name: shipment_id
referencedColumnName: id
Note that the ``#[JoinColumn]`` is not really necessary in this example,
as the defaults would be the same.
@@ -259,38 +191,6 @@ object.
// ...
}
.. code-block:: annotation
<?php
/** @Entity */
class Customer
{
// ...
/**
* One Customer has One Cart.
* @OneToOne(targetEntity="Cart", mappedBy="customer")
*/
private Cart|null $cart = null;
// ...
}
/** @Entity */
class Cart
{
// ...
/**
* One Cart has One Customer.
* @OneToOne(targetEntity="Customer", inversedBy="cart")
* @JoinColumn(name="customer_id", referencedColumnName="id")
*/
private Customer|null $customer = null;
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -304,22 +204,6 @@ object.
</entity>
</doctrine-mapping>
.. code-block:: yaml
Customer:
oneToOne:
cart:
targetEntity: Cart
mappedBy: customer
Cart:
oneToOne:
customer:
targetEntity: Customer
inversedBy: cart
joinColumn:
name: customer_id
referencedColumnName: id
Note that the @JoinColumn is not really necessary in this example,
as the defaults would be the same.
@@ -428,41 +312,6 @@ bidirectional many-to-one.
// ...
}
.. code-block:: annotation
<?php
use Doctrine\Common\Collections\ArrayCollection;
/** @Entity */
class Product
{
// ...
/**
* One product has many features. This is the inverse side.
* @var Collection<int, Feature>
* @OneToMany(targetEntity="Feature", mappedBy="product")
*/
private Collection $features;
// ...
public function __construct() {
$this->features = new ArrayCollection();
}
}
/** @Entity */
class Feature
{
// ...
/**
* Many features have one product. This is the owning side.
* @ManyToOne(targetEntity="Product", inversedBy="features")
* @JoinColumn(name="product_id", referencedColumnName="id")
*/
private Product|null $product = null;
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -476,24 +325,6 @@ bidirectional many-to-one.
</entity>
</doctrine-mapping>
.. code-block:: yaml
Product:
type: entity
oneToMany:
features:
targetEntity: Feature
mappedBy: product
Feature:
type: entity
manyToOne:
product:
targetEntity: Product
inversedBy: features
joinColumn:
name: product_id
referencedColumnName: id
Note that the @JoinColumn is not really necessary in this example,
as the defaults would be the same.
@@ -556,39 +387,6 @@ The following example sets up such a unidirectional one-to-many association:
// ...
}
.. code-block:: annotation
<?php
/** @Entity */
class User
{
// ...
/**
* Many Users have Many Phonenumbers.
* @ManyToMany(targetEntity="Phonenumber")
* @JoinTable(name="users_phonenumbers",
* joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="phonenumber_id", referencedColumnName="id", unique=true)}
* )
* @var Collection<int, Phonenumber>
*/
private Collection $phonenumbers;
public function __construct()
{
$this->phonenumbers = new \Doctrine\Common\Collections\ArrayCollection();
}
// ...
}
/** @Entity */
class Phonenumber
{
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -606,24 +404,6 @@ The following example sets up such a unidirectional one-to-many association:
</entity>
</doctrine-mapping>
.. code-block:: yaml
User:
type: entity
manyToMany:
phonenumbers:
targetEntity: Phonenumber
joinTable:
name: users_phonenumbers
joinColumns:
user_id:
referencedColumnName: id
inverseJoinColumns:
phonenumber_id:
referencedColumnName: id
unique: true
Generates the following MySQL Schema:
.. code-block:: sql
@@ -684,33 +464,6 @@ database perspective is known as an adjacency list approach.
}
}
.. code-block:: annotation
<?php
/** @Entity */
class Category
{
// ...
/**
* One Category has Many Categories.
* @OneToMany(targetEntity="Category", mappedBy="parent")
* @var Collection<int, Category>
*/
private Collection $children;
/**
* Many Categories have One Category.
* @ManyToOne(targetEntity="Category", inversedBy="children")
* @JoinColumn(name="parent_id", referencedColumnName="id")
*/
private Category|null $parent = null;
// ...
public function __construct() {
$this->children = new \Doctrine\Common\Collections\ArrayCollection();
}
}
.. code-block:: xml
<doctrine-mapping>
@@ -720,19 +473,6 @@ database perspective is known as an adjacency list approach.
</entity>
</doctrine-mapping>
.. code-block:: yaml
Category:
type: entity
oneToMany:
children:
targetEntity: Category
mappedBy: parent
manyToOne:
parent:
targetEntity: Category
inversedBy: children
Note that the @JoinColumn is not really necessary in this example,
as the defaults would be the same.
@@ -787,38 +527,6 @@ entities:
// ...
}
.. code-block:: annotation
<?php
/** @Entity */
class User
{
// ...
/**
* Many Users have Many Groups.
* @ManyToMany(targetEntity="Group")
* @JoinTable(name="users_groups",
* joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="group_id", referencedColumnName="id")}
* )
* @var Collection<int, Group>
*/
private Collection $groups;
// ...
public function __construct() {
$this->groups = new \Doctrine\Common\Collections\ArrayCollection();
}
}
/** @Entity */
class Group
{
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -836,22 +544,6 @@ entities:
</entity>
</doctrine-mapping>
.. code-block:: yaml
User:
type: entity
manyToMany:
groups:
targetEntity: Group
joinTable:
name: users_groups
joinColumns:
user_id:
referencedColumnName: id
inverseJoinColumns:
group_id:
referencedColumnName: id
Generated MySQL Schema:
.. code-block:: sql
@@ -939,47 +631,6 @@ one is bidirectional.
// ...
}
.. code-block:: annotation
<?php
/** @Entity */
class User
{
// ...
/**
* Many Users have Many Groups.
* @ManyToMany(targetEntity="Group", inversedBy="users")
* @JoinTable(name="users_groups")
* @var Collection<int, Group>
*/
private Collection $groups;
public function __construct() {
$this->groups = new \Doctrine\Common\Collections\ArrayCollection();
}
// ...
}
/** @Entity */
class Group
{
// ...
/**
* Many Groups have Many Users.
* @ManyToMany(targetEntity="User", mappedBy="groups")
* @var Collection<int, User>
*/
private Collection $users;
public function __construct() {
$this->users = new \Doctrine\Common\Collections\ArrayCollection();
}
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -1001,30 +652,6 @@ one is bidirectional.
</entity>
</doctrine-mapping>
.. code-block:: yaml
User:
type: entity
manyToMany:
groups:
targetEntity: Group
inversedBy: users
joinTable:
name: users_groups
joinColumns:
user_id:
referencedColumnName: id
inverseJoinColumns:
group_id:
referencedColumnName: id
Group:
type: entity
manyToMany:
users:
targetEntity: User
mappedBy: groups
The MySQL schema is exactly the same as for the Many-To-Many
uni-directional case above.
@@ -1172,12 +799,6 @@ As an example, consider this mapping:
#[OneToOne(targetEntity: Shipment::class)]
private Shipment|null $shipment = null;
.. code-block:: annotation
<?php
/** @OneToOne(targetEntity="Shipment") */
private Shipment|null $shipment = null;
.. code-block:: xml
<doctrine-mapping>
@@ -1186,14 +807,6 @@ As an example, consider this mapping:
</entity>
</doctrine-mapping>
.. code-block:: yaml
Product:
type: entity
oneToOne:
shipment:
targetEntity: Shipment
This is essentially the same as the following, more verbose,
mapping:
@@ -1207,16 +820,6 @@ mapping:
#[JoinColumn(name: 'shipment_id', referencedColumnName: 'id')]
private Shipment|null $shipment = null;
.. code-block:: annotation
<?php
/**
* One Product has One Shipment.
* @OneToOne(targetEntity="Shipment")
* @JoinColumn(name="shipment_id", referencedColumnName="id")
*/
private Shipment|null $shipment = null;
.. code-block:: xml
<doctrine-mapping>
@@ -1227,17 +830,6 @@ mapping:
</entity>
</doctrine-mapping>
.. code-block:: yaml
Product:
type: entity
oneToOne:
shipment:
targetEntity: Shipment
joinColumn:
name: shipment_id
referencedColumnName: id
The @JoinTable definition used for many-to-many mappings has
similar defaults. As an example, consider this mapping:
@@ -1255,20 +847,6 @@ similar defaults. As an example, consider this mapping:
// ...
}
.. code-block:: annotation
<?php
class User
{
// ...
/**
* @ManyToMany(targetEntity="Group")
* @var Collection<int, Group>
*/
private Collection $groups;
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -1277,14 +855,6 @@ similar defaults. As an example, consider this mapping:
</entity>
</doctrine-mapping>
.. code-block:: yaml
User:
type: entity
manyToMany:
groups:
targetEntity: Group
This is essentially the same as the following, more verbose, mapping:
.. configuration-block::
@@ -1307,25 +877,6 @@ This is essentially the same as the following, more verbose, mapping:
// ...
}
.. code-block:: annotation
<?php
class User
{
// ...
/**
* Many Users have Many Groups.
* @ManyToMany(targetEntity="Group")
* @JoinTable(name="User_Group",
* joinColumns={@JoinColumn(name="User_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="Group_id", referencedColumnName="id")}
* )
* @var Collection<int, Group>
*/
private Collection $groups;
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -1343,22 +894,6 @@ This is essentially the same as the following, more verbose, mapping:
</entity>
</doctrine-mapping>
.. code-block:: yaml
User:
type: entity
manyToMany:
groups:
targetEntity: Group
joinTable:
name: User_Group
joinColumns:
User_id:
referencedColumnName: id
inverseJoinColumns:
Group_id:
referencedColumnName: id
In that case, the name of the join table defaults to a combination
of the simple, unqualified class names of the participating
classes, separated by an underscore character. The names of the
@@ -1378,12 +913,6 @@ associations as they will be set based on type. So that:
#[OneToOne]
private Shipment $shipment;
.. code-block:: annotation
<?php
/** @OneToOne */
private Shipment $shipment;
.. code-block:: xml
<doctrine-mapping>
@@ -1392,13 +921,6 @@ associations as they will be set based on type. So that:
</entity>
</doctrine-mapping>
.. code-block:: yaml
Product:
type: entity
oneToOne:
shipment: ~
Is essentially the same as following:
.. configuration-block::
@@ -1431,17 +953,6 @@ Is essentially the same as following:
</entity>
</doctrine-mapping>
.. code-block:: yaml
Product:
type: entity
oneToOne:
shipment:
targetEntity: Shipment
joinColumn:
name: shipment_id
referencedColumnName: id
If you accept these defaults, you can reduce the mapping code to a
minimum.

View File

@@ -4,8 +4,9 @@ Attributes Reference
PHP 8 adds native support for metadata with its "Attributes" feature.
Doctrine ORM provides support for mapping metadata using PHP attributes as of version 2.9.
The attributes metadata support is closely modelled after the already existing
annotation metadata supported since the first version 2.0.
The attributes metadata support is closely modelled after the already
existing and now removed annotation metadata supported since the first
version 2.0.
Index
-----
@@ -174,6 +175,10 @@ Optional parameters:
- **unique**: Boolean value to determine if the value of the column
should be unique across all rows of the underlying entities table.
- **index**: Boolean value to generate an index for this column.
For more advanced usages, take a look at :ref:`#[Index] <attrref_index>`.
If not specified, default value is ``false``.
- **nullable**: Determines if NULL values allowed for this column.
If not specified, default value is ``false``.
@@ -244,6 +249,9 @@ Examples:
#[Column(type: "string", length: 32, unique: true, nullable: false)]
protected $username;
#[Column(type: "string", index: true)]
protected $firstName;
#[Column(type: "string", columnDefinition: "CHAR(2) NOT NULL")]
protected $country;
@@ -314,7 +322,6 @@ Example:
Entity,
ChangeTrackingPolicy("DEFERRED_IMPLICIT"),
ChangeTrackingPolicy("DEFERRED_EXPLICIT"),
ChangeTrackingPolicy("NOTIFY")
]
class User {}
@@ -489,9 +496,8 @@ used as default.
Optional parameters:
- **strategy**: Set the name of the identifier generation strategy.
Valid values are ``AUTO``, ``SEQUENCE``, ``IDENTITY``, ``UUID``
(deprecated), ``CUSTOM`` and ``NONE``.
If not specified, the default value is ``AUTO``.
Valid values are ``AUTO``, ``SEQUENCE``, ``IDENTITY``, ``CUSTOM`` and
``NONE``. If not specified, the default value is ``AUTO``.
Example:
@@ -677,6 +683,7 @@ Optional parameters:
- **unique**: Determines whether this relation is exclusive between the
affected entities and should be enforced as such on the database
constraint level. Defaults to false.
- **deferrable**: Determines whether this relation constraint can be deferred. Defaults to false.
- **nullable**: Determine whether the related entity is required, or if
null is an allowed state for the relation. Defaults to true.
- **onDelete**: Cascade Action (Database-level)
@@ -718,10 +725,6 @@ details of the database join table. If you do not specify
``#[JoinTable]`` on these relations reasonable mapping defaults apply
using the affected table and the column names.
A notable difference to the annotation metadata support, ``#[JoinColumn]``
and ``#[InverseJoinColumn]`` can be specified at the property level and are not
nested within the ``#[JoinTable]`` attribute.
Required attribute:
- **name**: Database name of the join-table
@@ -937,7 +940,7 @@ Example:
#[OneToMany(
targetEntity: "Phonenumber",
mappedBy: "user",
cascade: ["persist", "remove", "merge"],
cascade: ["persist", "remove"],
orphanRemoval: true)
]
public $phonenumbers;
@@ -1144,7 +1147,7 @@ Marker attribute that defines a specified column as version attribute used in
an :ref:`optimistic locking <transactions-and-concurrency_optimistic-locking>`
scenario. It only works on :ref:`#[Column] <attrref_column>` attributes that have
the type ``integer`` or ``datetime``. Setting ``#[Version]`` on a property with
:ref:`#[Id <attrref_id>` is not supported.
:ref:`#[Id] <attrref_id>` is not supported.
Example:

View File

@@ -47,17 +47,14 @@ mapping metadata:
- :doc:`Attributes <attributes-reference>`
- :doc:`XML <xml-mapping>`
- :doc:`PHP code <php-mapping>`
- :doc:`Docblock Annotations <annotations-reference>` (deprecated and will be removed in ``doctrine/orm`` 3.0)
- :doc:`YAML <yaml-mapping>` (deprecated and will be removed in ``doctrine/orm`` 3.0.)
This manual will usually show mapping metadata via attributes, though
many examples also show the equivalent configuration in annotations,
YAML and XML.
many examples also show the equivalent configuration in XML.
.. note::
All metadata drivers perform equally. Once the metadata of a class has been
read from the source (attributes, annotations, XML, etc.) it is stored in an instance
read from the source (attributes, XML, etc.) it is stored in an instance
of the ``Doctrine\ORM\Mapping\ClassMetadata`` class which are
stored in the metadata cache. If you're not using a metadata cache (not
recommended!) then the XML driver is the fastest.
@@ -77,17 +74,6 @@ Marking our ``Message`` class as an entity for Doctrine is straightforward:
// ...
}
.. code-block:: annotation
<?php
use Doctrine\ORM\Mapping\Entity;
/** @Entity */
class Message
{
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -96,12 +82,6 @@ Marking our ``Message`` class as an entity for Doctrine is straightforward:
</entity>
</doctrine-mapping>
.. code-block:: yaml
Message:
type: entity
# ...
With no additional information, Doctrine expects the entity to be saved
into a table with the same name as the class in our case ``Message``.
You can change this by configuring information about the table:
@@ -121,21 +101,6 @@ You can change this by configuring information about the table:
// ...
}
.. code-block:: annotation
<?php
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\Table;
/**
* @Entity
* @Table(name="message")
*/
class Message
{
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -144,13 +109,6 @@ You can change this by configuring information about the table:
</entity>
</doctrine-mapping>
.. code-block:: yaml
Message:
type: entity
table: message
# ...
Now the class ``Message`` will be saved and fetched from the table ``message``.
Property Mapping
@@ -182,23 +140,6 @@ specified, ``string`` is used as the default.
private $postedAt;
}
.. code-block:: annotation
<?php
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\Column;
/** @Entity */
class Message
{
/** @Column(type="integer") */
private $id;
/** @Column(length=140) */
private $text;
/** @Column(type="datetime", name="posted_at") */
private $postedAt;
}
.. code-block:: xml
<doctrine-mapping>
@@ -209,19 +150,6 @@ specified, ``string`` is used as the default.
</entity>
</doctrine-mapping>
.. code-block:: yaml
Message:
type: entity
fields:
id:
type: integer
text:
length: 140
postedAt:
type: datetime
column: posted_at
When we don't explicitly specify a column name via the ``name`` option, Doctrine
assumes the field name is also the column name. So in this example:
@@ -286,6 +214,8 @@ These are the "automatic" mapping rules:
| Any other type | ``Types::STRING`` |
+-----------------------+-------------------------------+
.. versionadded:: 2.11
As of version 2.11 Doctrine can also automatically map typed properties using a
PHP 8.1 enum to set the right ``type`` and ``enumType``.
@@ -296,6 +226,70 @@ and a custom ``Doctrine\ORM\Mapping\TypedFieldMapper`` implementation.
:doc:`Read more about TypedFieldMapper <typedfieldmapper>`.
Property Hooks
--------------
.. versionadded:: 3.4
Doctrine supports mapping hooked properties as long as they have a backed property
and are not virtual.
.. configuration-block::
.. code-block:: attribute
<?php
use Doctrine\ORM\Mapping\Column;
use Doctrine\DBAL\Types\Types;
#[Entity]
class Message
{
#[Column(type: Types::INTEGER)]
private $id;
#[Column(type: Types::STRING)]
public string $language = 'de' {
// Override the "read" action with arbitrary logic.
get => strtoupper($this->language);
// Override the "write" action with arbitrary logic.
set {
$this->language = strtolower($value);
}
}
}
.. code-block:: xml
<doctrine-mapping>
<entity name="Message">
<field name="id" type="integer" />
<field name="language" />
</entity>
</doctrine-mapping>
If you attempt to map a virtual property with ``#[Column]`` an exception will be thrown.
Some caveats apply to the use of property hooks, as they behave differently when accessing the property through
the entity or directly through DQL/EntityRepository. Because the property hook can modify the value of the property in a way
that value and raw value are different, you have to use the raw value representation when querying for the property.
.. code-block:: php
<?php
$queryBuilder = $entityManager->createQueryBuilder();
$queryBuilder->select('m')
->from(Message::class, 'm')
->where('m.language = :language')
->setParameter('language', 'de'); // Use lower case here for raw value representation
$query = $queryBuilder->getQuery();
$result = $query->getResult();
$messageRepository = $entityManager->getRepository(Message::class);
$deMessages = $messageRepository->findBy(['language' => 'de']); // Use lower case here for raw value representation
.. _reference-mapping-types:
Doctrine Mapping Types
@@ -347,20 +341,6 @@ the field that serves as the identifier with the ``#[Id]`` attribute.
// ...
}
.. code-block:: annotation
<?php
class Message
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue
*/
private int|null $id = null;
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -372,24 +352,27 @@ the field that serves as the identifier with the ``#[Id]`` attribute.
</entity>
</doctrine-mapping>
.. code-block:: yaml
Message:
type: entity
id:
id:
type: integer
generator:
strategy: AUTO
fields:
# fields here
In most cases using the automatic generator strategy (``#[GeneratedValue]``) is
what you want, but for backwards-compatibility reasons it might not. It
defaults to the identifier generation mechanism your current database
vendor preferred at the time that strategy was introduced:
``AUTO_INCREMENT`` with MySQL, sequences with PostgreSQL and Oracle and
so on.
If you are using `doctrine/dbal` 4, we now recommend using ``IDENTITY``
for PostgreSQL, and ``AUTO`` resolves to it because of that.
You can stick with ``SEQUENCE`` while still using the ``AUTO``
strategy, by configuring what it defaults to.
.. code-block:: php
<?php
use Doctrine\DBAL\Platforms\PostgreSQLPlatform;
use Doctrine\ORM\Configuration;
$config = new Configuration();
$config->setIdentityGenerationPreferences([
PostgreSQLPlatform::class => ClassMetadata::GENERATOR_TYPE_SEQUENCE,
]);
.. _identifier-generation-strategies:
@@ -406,26 +389,26 @@ Here is the list of possible generation strategies:
- ``AUTO`` (default): Tells Doctrine to pick the strategy that is
preferred by the used database platform. The preferred strategies
are ``IDENTITY`` for MySQL, SQLite, MsSQL and SQL Anywhere and, for
historical reasons, ``SEQUENCE`` for Oracle and PostgreSQL. This
strategy provides full portability.
are ``IDENTITY`` for MySQL, SQLite, MsSQL, SQL Anywhere and
PostgreSQL (on DBAL 4) and, for historical reasons, ``SEQUENCE``
for Oracle and PostgreSQL (on DBAL 3). This strategy provides
full portability.
- ``IDENTITY``: Tells Doctrine to use special identity columns in
the database that generate a value on insertion of a row. This
strategy does currently not provide full portability and is
supported by the following platforms: MySQL/SQLite/SQL Anywhere
(``AUTO_INCREMENT``), MSSQL (``IDENTITY``) and PostgreSQL (``SERIAL``).
(``AUTO_INCREMENT``), MSSQL (``IDENTITY``) and PostgreSQL (``SERIAL``
on DBAL 3, ``GENERATED BY DEFAULT AS IDENTITY`` on DBAL 4).
- ``SEQUENCE``: Tells Doctrine to use a database sequence for ID
generation. This strategy does currently not provide full
portability. Sequences are supported by Oracle, PostgreSql and
portability. Sequences are supported by Oracle, PostgreSQL and
SQL Anywhere.
- ``UUID`` (deprecated): Tells Doctrine to use the built-in Universally
Unique Identifier generator. This strategy provides full portability.
- ``NONE``: Tells Doctrine that the identifiers are assigned (and
thus generated) by your code. The assignment must take place before
a new entity is passed to ``EntityManager#persist``. NONE is the
same as leaving off the ``#[GeneratedValue]`` entirely.
- ``CUSTOM``: With this option, you can use the ``#[CustomIdGenerator]`` attribute.
It will allow you to pass a :ref:`class of your own to generate the identifiers. <annref_customidgenerator>`
It will allow you to pass a :ref:`class of your own to generate the identifiers. <attrref_customidgenerator>`
Sequence Generator
^^^^^^^^^^^^^^^^^^
@@ -448,20 +431,6 @@ besides specifying the sequence's name:
// ...
}
.. code-block:: annotation
<?php
class Message
{
/**
* @Id
* @GeneratedValue(strategy="SEQUENCE")
* @SequenceGenerator(sequenceName="message_seq", initialValue=1, allocationSize=100)
*/
protected int|null $id = null;
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -473,20 +442,6 @@ besides specifying the sequence's name:
</entity>
</doctrine-mapping>
.. code-block:: yaml
Message:
type: entity
id:
id:
type: integer
generator:
strategy: SEQUENCE
sequenceGenerator:
sequenceName: message_seq
allocationSize: 100
initialValue: 1
The initial value specifies at which value the sequence should
start.

View File

@@ -43,7 +43,7 @@ should use events judiciously.
Use cascades judiciously
------------------------
Automatic cascades of the persist/remove/merge/etc. operations are
Automatic cascades of the persist/remove/etc. operations are
very handy but should be used wisely. Do NOT simply add all
cascades to all associations. Think about which cascades actually
do make sense for you for a particular association, given the

View File

@@ -109,7 +109,7 @@ Metadata Cache
~~~~~~~~~~~~~~
Your class metadata can be parsed from a few different sources like
YAML, XML, Attributes, Annotations etc. Instead of parsing this
XML, Attributes, etc. Instead of parsing this
information on each request we should cache it using one of the cache
drivers.

View File

@@ -5,7 +5,7 @@ Change tracking is the process of determining what has changed in
managed entities since the last time they were synchronized with
the database.
Doctrine provides 3 different change tracking policies, each having
Doctrine provides 2 different change tracking policies, each having
its particular advantages and disadvantages. The change tracking
policy can be defined on a per-class basis (or more precisely,
per-hierarchy).
@@ -56,122 +56,3 @@ This policy can be configured as follows:
{
// ...
}
Notify
~~~~~~
.. note::
The notify change tracking policy is deprecated and will be removed in ORM 3.0.
(\ `Details <https://github.com/doctrine/orm/issues/8383>`_)
This policy is based on the assumption that the entities notify
interested listeners of changes to their properties. For that
purpose, a class that wants to use this policy needs to implement
the ``NotifyPropertyChanged`` interface from the Doctrine
namespace. As a guideline, such an implementation can look as
follows:
.. code-block:: php
<?php
use Doctrine\Persistence\NotifyPropertyChanged,
Doctrine\Persistence\PropertyChangedListener;
#[Entity]
#[ChangeTrackingPolicy('NOTIFY')]
class MyEntity implements NotifyPropertyChanged
{
// ...
private array $_listeners = array();
public function addPropertyChangedListener(PropertyChangedListener $listener): void
{
$this->_listeners[] = $listener;
}
}
Then, in each property setter of this class or derived classes, you
need to notify all the ``PropertyChangedListener`` instances. As an
example we add a convenience method on ``MyEntity`` that shows this
behaviour:
.. code-block:: php
<?php
// ...
class MyEntity implements NotifyPropertyChanged
{
// ...
protected function _onPropertyChanged($propName, $oldValue, $newValue): void
{
if ($this->_listeners) {
foreach ($this->_listeners as $listener) {
$listener->propertyChanged($this, $propName, $oldValue, $newValue);
}
}
}
public function setData($data): void
{
if ($data != $this->data) {
$this->_onPropertyChanged('data', $this->data, $data);
$this->data = $data;
}
}
}
You have to invoke ``_onPropertyChanged`` inside every method that
changes the persistent state of ``MyEntity``.
The check whether the new value is different from the old one is
not mandatory but recommended. That way you also have full control
over when you consider a property changed.
If your entity contains an embeddable, you will need to notify
separately for each property in the embeddable when it changes
for example:
.. code-block:: php
<?php
// ...
class MyEntity implements NotifyPropertyChanged
{
public function setEmbeddable(MyValueObject $embeddable): void
{
if (!$embeddable->equals($this->embeddable)) {
// notice the entityField.embeddableField notation for referencing the property
$this->_onPropertyChanged('embeddable.prop1', $this->embeddable->getProp1(), $embeddable->getProp1());
$this->_onPropertyChanged('embeddable.prop2', $this->embeddable->getProp2(), $embeddable->getProp2());
$this->embeddable = $embeddable;
}
}
}
This would update all the fields of the embeddable, you may wish to
implement a diff method on your embedded object which returns only
the changed fields.
The negative point of this policy is obvious: You need implement an
interface and write some plumbing code. But also note that we tried
hard to keep this notification functionality abstract. Strictly
speaking, it has nothing to do with the persistence layer and the
Doctrine ORM or DBAL. You may find that property notification
events come in handy in many other scenarios as well. As mentioned
earlier, the ``Doctrine\Common`` namespace is not that evil and
consists solely of very small classes and interfaces that have
almost no external dependencies (none to the DBAL and none to the
ORM) and that you can easily take with you should you want to swap
out the persistence layer. This change tracking policy does not
introduce a dependency on the Doctrine DBAL/ORM or the persistence
layer.
The positive point and main advantage of this policy is its
effectiveness. It has the best performance characteristics of the 3
policies with larger units of work and a flush() operation is very
cheap when nothing has changed.

View File

@@ -56,42 +56,22 @@ access point to ORM functionality provided by Doctrine.
'dbname' => 'foo',
];
$config = ORMSetup::createAttributeMetadataConfiguration($paths, $isDevMode);
$config = ORMSetup::createAttributeMetadataConfig($paths, $isDevMode);
// on PHP < 8.4, use ORMSetup::createAttributeMetadataConfiguration() instead
$connection = DriverManager::getConnection($dbParams, $config);
$entityManager = new EntityManager($connection, $config);
.. note::
The ``ORMSetup`` class has been introduced with ORM 2.12. It's predecessor ``Setup`` is deprecated and will
be removed in version 3.0.
Or if you prefer XML:
.. code-block:: php
<?php
$paths = ['/path/to/xml-mappings'];
$config = ORMSetup::createXMLMetadataConfiguration($paths, $isDevMode);
$config = ORMSetup::createXMLMetadataConfig($paths, $isDevMode);
// on PHP < 8.4, use ORMSetup::createXMLMetadataConfiguration() instead
$connection = DriverManager::getConnection($dbParams, $config);
$entityManager = new EntityManager($connection, $config);
Or if you prefer YAML:
.. code-block:: php
<?php
$paths = ['/path/to/yml-mappings'];
$config = ORMSetup::createYAMLMetadataConfiguration($paths, $isDevMode);
$connection = DriverManager::getConnection($dbParams, $config);
$entityManager = new EntityManager($connection, $config);
.. note::
If you want to use yml mapping you should add yaml dependency to your `composer.json`:
::
"symfony/yaml": "*"
Inside the ``ORMSetup`` methods several assumptions are made:
- If ``$isDevMode`` is true caching is done in memory with the ``ArrayAdapter``. Proxy objects are recreated on every request.

View File

@@ -524,8 +524,8 @@ when the DQL is switched to an arbitrary join.
aggregation (GROUP BY)
Partial Object Syntax
^^^^^^^^^^^^^^^^^^^^^
Partial Hydration Syntax
^^^^^^^^^^^^^^^^^^^^^^^^
By default when you run a DQL query in Doctrine and select only a
subset of the fields for a given entity, you do not receive objects
@@ -533,7 +533,7 @@ back. Instead, you receive only arrays as a flat rectangular result
set, similar to how you would if you were just using SQL directly
and joining some data.
If you want to select partial objects you can use the ``partial``
If you want to select partial objects or fields in array hydration you can use the ``partial``
DQL keyword:
.. code-block:: php
@@ -542,12 +542,13 @@ DQL keyword:
$query = $em->createQuery('SELECT partial u.{id, username} FROM CmsUser u');
$users = $query->getResult(); // array of partially loaded CmsUser objects
You use the partial syntax when joining as well:
You can use the partial syntax when joining as well:
.. code-block:: php
<?php
$query = $em->createQuery('SELECT partial u.{id, username}, partial a.{id, name} FROM CmsUser u JOIN u.articles a');
$usersArray = $query->getArrayResult(); // array of partially loaded CmsUser and CmsArticle fields
$users = $query->getResult(); // array of partially loaded CmsUser objects
"NEW" Operator Syntax
@@ -587,7 +588,101 @@ And then use the ``NEW`` DQL keyword :
$query = $em->createQuery('SELECT NEW CustomerDTO(c.name, e.email, a.city, SUM(o.value)) FROM Customer c JOIN c.email e JOIN c.address a JOIN c.orders o GROUP BY c');
$users = $query->getResult(); // array of CustomerDTO
Note that you can only pass scalar expressions to the constructor.
You can also nest several DTO :
.. code-block:: php
<?php
class CustomerDTO
{
public function __construct(string $name, string $email, AddressDTO $address, string|null $value = null)
{
// Bind values to the object properties.
}
}
class AddressDTO
{
public function __construct(string $street, string $city, string $zip)
{
// Bind values to the object properties.
}
}
.. code-block:: php
<?php
$query = $em->createQuery('SELECT NEW CustomerDTO(c.name, e.email, NEW AddressDTO(a.street, a.city, a.zip)) FROM Customer c JOIN c.email e JOIN c.address a');
$users = $query->getResult(); // array of CustomerDTO
Note that you can only pass scalar expressions or other Data Transfer Objects to the constructor.
If you use your data transfer objects for multiple queries, and you would rather not have to
specify arguments that precede the ones you are really interested in, you can use named arguments.
Consider the following DTO, which uses optional arguments:
.. code-block:: php
<?php
class CustomerDTO
{
public function __construct(
public string|null $name = null,
public string|null $email = null,
public string|null $city = null,
public mixed|null $value = null,
public AddressDTO|null $address = null,
) {
}
}
You can specify arbitrary arguments in an arbitrary order by using the named argument syntax, and the ORM will try to match argument names with the selected column names.
The syntax relies on the NAMED keyword, like so:
.. code-block:: php
<?php
$query = $em->createQuery('SELECT NEW NAMED CustomerDTO(a.city, c.name) FROM Customer c JOIN c.address a');
$users = $query->getResult(); // array of CustomerDTO
// CustomerDTO => {name : 'SMITH', email: null, city: 'London', value: null}
ORM will also give precedence to column aliases over column names :
.. code-block:: php
<?php
$query = $em->createQuery('SELECT NEW NAMED CustomerDTO(c.name, CONCAT(a.city, ' ' , a.zip) AS value) FROM Customer c JOIN c.address a');
$users = $query->getResult(); // array of CustomerDTO
// CustomerDTO => {name : 'DOE', email: null, city: null, value: 'New York 10011'}
To define a custom name for a DTO constructor argument, you can either alias the column with the ``AS`` keyword.
The ``NAMED`` keyword must precede all DTO you want to instantiate :
.. code-block:: php
<?php
$query = $em->createQuery('SELECT NEW NAMED CustomerDTO(c.name, NEW NAMED AddressDTO(a.street, a.city, a.zip) AS address) FROM Customer c JOIN c.address a');
$users = $query->getResult(); // array of CustomerDTO
// CustomerDTO => {name : 'DOE', email: null, city: null, value: 'New York 10011'}
If two arguments have the same name, a ``DuplicateFieldException`` is thrown.
If a field cannot be matched with a property name, a ``NoMatchingPropertyException`` is thrown. This typically happens when using functions without aliasing them.
You can hydrate an entity nested in a DTO :
.. code-block:: php
<?php
$query = $em->createQuery('SELECT NEW CustomerDTO(c.name, a AS address) FROM Customer c JOIN c.address a');
$users = $query->getResult(); // array of CustomerDTO
// CustomerDTO => {name : 'DOE', email: null, address : {city: 'New York', zip: '10011', address: 'Abbey Road'}
Using INDEX BY
~~~~~~~~~~~~~~
@@ -1516,8 +1611,8 @@ Identifiers
/* Alias Identification declaration (the "u" of "FROM User u") */
AliasIdentificationVariable :: = identifier
/* identifier that must be a class name (the "User" of "FROM User u"), possibly as a fully qualified class name or namespace-aliased */
AbstractSchemaName ::= fully_qualified_name | aliased_name | identifier
/* identifier that must be a class name (the "User" of "FROM User u"), possibly as a fully qualified class name */
AbstractSchemaName ::= fully_qualified_name | identifier
/* Alias ResultVariable declaration (the "total" of "COUNT(*) AS total") */
AliasResultVariable = identifier
@@ -1612,12 +1707,13 @@ Select Expressions
.. code-block:: php
SelectExpression ::= (IdentificationVariable | ScalarExpression | AggregateExpression | FunctionDeclaration | PartialObjectExpression | "(" Subselect ")" | CaseExpression | NewObjectExpression) [["AS"] ["HIDDEN"] AliasResultVariable]
SimpleSelectExpression ::= (StateFieldPathExpression | IdentificationVariable | FunctionDeclaration | AggregateExpression | "(" Subselect ")" | ScalarExpression) [["AS"] AliasResultVariable]
PartialObjectExpression ::= "PARTIAL" IdentificationVariable "." PartialFieldSet
PartialFieldSet ::= "{" SimpleStateField {"," SimpleStateField}* "}"
NewObjectExpression ::= "NEW" AbstractSchemaName "(" NewObjectArg {"," NewObjectArg}* ")"
NewObjectArg ::= ScalarExpression | "(" Subselect ")"
SelectExpression ::= (IdentificationVariable | ScalarExpression | AggregateExpression | FunctionDeclaration | PartialObjectExpression | "(" Subselect ")" | CaseExpression | NewObjectExpression) [["AS"] ["HIDDEN"] AliasResultVariable]
SimpleSelectExpression ::= (StateFieldPathExpression | IdentificationVariable | FunctionDeclaration | AggregateExpression | "(" Subselect ")" | ScalarExpression) [["AS"] AliasResultVariable]
PartialObjectExpression ::= "PARTIAL" IdentificationVariable "." PartialFieldSet
PartialFieldSet ::= "{" SimpleStateField {"," SimpleStateField}* "}"
NewObjectExpression ::= "NEW" AbstractSchemaName "(" NewObjectArg {"," NewObjectArg}* ")"
NewObjectArg ::= (ScalarExpression | "(" Subselect ")" | NewObjectExpression | EntityAsDtoArgumentExpression) ["AS" AliasResultVariable]
EntityAsDtoArgumentExpression ::= IdentificationVariable
Conditional Expressions
~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -260,40 +260,6 @@ specific to a particular entity class's lifecycle.
$this->value = 'changed from preUpdate callback!';
}
}
.. code-block:: annotation
<?php
use Doctrine\ORM\Event\PrePersistEventArgs;
/**
* @Entity
* @HasLifecycleCallbacks
*/
class User
{
// ...
/** @Column(type="string", length=255) */
public $value;
/** @PrePersist */
public function doStuffOnPrePersist(PrePersistEventArgs $eventArgs)
{
$this->createdAt = date('Y-m-d H:i:s');
}
/** @PrePersist */
public function doOtherStuffOnPrePersist()
{
$this->value = 'changed from prePersist callback!';
}
/** @PreUpdate */
public function doStuffOnPreUpdate(PreUpdateEventArgs $eventArgs)
{
$this->value = 'changed from preUpdate callback!';
}
}
.. code-block:: xml
<?xml version="1.0" encoding="UTF-8"?>
@@ -311,17 +277,6 @@ specific to a particular entity class's lifecycle.
</lifecycle-callbacks>
</entity>
</doctrine-mapping>
.. code-block:: yaml
User:
type: entity
fields:
# ...
value:
type: string(255)
lifecycleCallbacks:
prePersist: [ doStuffOnPrePersist, doOtherStuffOnPrePersist ]
preUpdate: [ doStuffOnPreUpdate ]
Lifecycle Callbacks Event Argument
----------------------------------
@@ -794,16 +749,6 @@ An entity listener is a lifecycle listener class used for an entity.
{
// ....
}
.. code-block:: annotation
<?php
namespace MyProject\Entity;
/** @Entity @EntityListeners({"UserListener"}) */
class User
{
// ....
}
.. code-block:: xml
<doctrine-mapping>
@@ -814,13 +759,6 @@ An entity listener is a lifecycle listener class used for an entity.
<!-- .... -->
</entity>
</doctrine-mapping>
.. code-block:: yaml
MyProject\Entity\User:
type: entity
entityListeners:
UserListener:
# ....
.. _reference-entity-listeners:
@@ -893,45 +831,6 @@ you need to map the listener method using the event type mapping:
public function postLoadHandler(User $user, PostLoadEventArgs $event): void { // ... }
}
.. code-block:: annotation
<?php
use Doctrine\ORM\Event\PostLoadEventArgs;
use Doctrine\ORM\Event\PostPersistEventArgs;
use Doctrine\ORM\Event\PostRemoveEventArgs;
use Doctrine\ORM\Event\PostUpdateEventArgs;
use Doctrine\ORM\Event\PreFlushEventArgs;
use Doctrine\ORM\Event\PrePersistEventArgs;
use Doctrine\ORM\Event\PreRemoveEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
class UserListener
{
/** @PrePersist */
public function prePersistHandler(User $user, PrePersistEventArgs $event): void { // ... }
/** @PostPersist */
public function postPersistHandler(User $user, PostPersistEventArgs $event): void { // ... }
/** @PreUpdate */
public function preUpdateHandler(User $user, PreUpdateEventArgs $event): void { // ... }
/** @PostUpdate */
public function postUpdateHandler(User $user, PostUpdateEventArgs $event): void { // ... }
/** @PostRemove */
public function postRemoveHandler(User $user, PostRemoveEventArgs $event): void { // ... }
/** @PreRemove */
public function preRemoveHandler(User $user, PreRemoveEventArgs $event): void { // ... }
/** @PreFlush */
public function preFlushHandler(User $user, PreFlushEventArgs $event): void { // ... }
/** @PostLoad */
public function postLoadHandler(User $user, PostLoadEventArgs $event): void { // ... }
}
.. code-block:: xml
<doctrine-mapping>
@@ -954,24 +853,6 @@ you need to map the listener method using the event type mapping:
<!-- .... -->
</entity>
</doctrine-mapping>
.. code-block:: yaml
MyProject\Entity\User:
type: entity
entityListeners:
UserListener:
preFlush: [preFlushHandler]
postLoad: [postLoadHandler]
postPersist: [postPersistHandler]
prePersist: [prePersistHandler]
postUpdate: [postUpdateHandler]
preUpdate: [preUpdateHandler]
postRemove: [postRemoveHandler]
preRemove: [preRemoveHandler]
# ....
.. note::
@@ -994,7 +875,8 @@ Specifying an entity listener instance :
// User.php
/** @Entity @EntityListeners({"UserListener"}) */
#[Entity]
#[EntityListeners(["UserListener"])
class User
{
// ....
@@ -1052,7 +934,7 @@ Load ClassMetadata Event
``loadClassMetadata`` - The ``loadClassMetadata`` event occurs after the
mapping metadata for a class has been loaded from a mapping source
(attributes/annotations/xml/yaml) in to a ``Doctrine\ORM\Mapping\ClassMetadata`` instance.
(attributes/xml) in to a ``Doctrine\ORM\Mapping\ClassMetadata`` instance.
You can hook in to this process and manipulate the instance.
This event is not a lifecycle callback.

View File

@@ -16,7 +16,7 @@ is common to multiple entity classes.
Mapped superclasses, just as regular, non-mapped classes, can
appear in the middle of an otherwise mapped inheritance hierarchy
(through Single Table Inheritance or Class Table Inheritance). They
are not query-able, and need not have an ``#[Id]`` property.
are not query-able, and do not require an ``#[Id]`` property.
No database table will be created for a mapped superclass itself,
only for entity classes inheriting from it. That implies that a
@@ -208,44 +208,6 @@ Example:
// ...
}
.. code-block:: annotation
<?php
namespace MyProject\Model;
/**
* @Entity
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
*/
class Person
{
// ...
}
/**
* @Entity
*/
class Employee extends Person
{
// ...
}
.. code-block:: yaml
MyProject\Model\Person:
type: entity
inheritanceType: SINGLE_TABLE
discriminatorColumn:
name: discr
type: string
discriminatorMap:
person: Person
employee: Employee
MyProject\Model\Employee:
type: entity
In this example, the ``#[DiscriminatorMap]`` specifies that in the
discriminator column, a value of "person" identifies a row as being of type
@@ -439,58 +401,6 @@ Example:
{
}
.. code-block:: annotation
<?php
// user mapping
namespace MyProject\Model;
/**
* @MappedSuperclass
*/
class User
{
// other fields mapping
/**
* @ManyToMany(targetEntity="Group", inversedBy="users")
* @JoinTable(name="users_groups",
* joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="group_id", referencedColumnName="id")}
* )
* @var Collection<int, Group>
*/
protected Collection $groups;
/**
* @ManyToOne(targetEntity="Address")
* @JoinColumn(name="address_id", referencedColumnName="id")
*/
protected Address|null $address = null;
}
// admin mapping
namespace MyProject\Model;
/**
* @Entity
* @AssociationOverrides({
* @AssociationOverride(name="groups",
* joinTable=@JoinTable(
* name="users_admingroups",
* joinColumns=@JoinColumn(name="adminuser_id"),
* inverseJoinColumns=@JoinColumn(name="admingroup_id")
* )
* ),
* @AssociationOverride(name="address",
* joinColumns=@JoinColumn(
* name="adminaddress_id", referencedColumnName="id"
* )
* )
* })
*/
class Admin extends User
{
}
.. code-block:: xml
<!-- user mapping -->
@@ -500,7 +410,6 @@ Example:
<many-to-many field="groups" target-entity="Group" inversed-by="users">
<cascade>
<cascade-persist/>
<cascade-merge/>
<cascade-detach/>
</cascade>
<join-table name="users_groups">
@@ -537,51 +446,6 @@ Example:
</association-overrides>
</entity>
</doctrine-mapping>
.. code-block:: yaml
# user mapping
MyProject\Model\User:
type: mappedSuperclass
# other fields mapping
manyToOne:
address:
targetEntity: Address
joinColumn:
name: address_id
referencedColumnName: id
cascade: [ persist, merge ]
manyToMany:
groups:
targetEntity: Group
joinTable:
name: users_groups
joinColumns:
user_id:
referencedColumnName: id
inverseJoinColumns:
group_id:
referencedColumnName: id
cascade: [ persist, merge, detach ]
# admin mapping
MyProject\Model\Admin:
type: entity
associationOverride:
address:
joinColumn:
adminaddress_id:
name: adminaddress_id
referencedColumnName: id
groups:
joinTable:
name: users_admingroups
joinColumns:
adminuser_id:
referencedColumnName: id
inverseJoinColumns:
admingroup_id:
referencedColumnName: id
Things to note:
@@ -645,51 +509,6 @@ Could be used by an entity that extends a mapped superclass to override a field
{
}
.. code-block:: annotation
<?php
// user mapping
namespace MyProject\Model;
/**
* @MappedSuperclass
*/
class User
{
/** @Id @GeneratedValue @Column(type="integer", name="user_id", length=150) */
protected int|null $id = null;
/** @Column(name="user_name", nullable=true, unique=false, length=250) */
protected string $name;
// other fields mapping
}
// guest mapping
namespace MyProject\Model;
/**
* @Entity
* @AttributeOverrides({
* @AttributeOverride(name="id",
* column=@Column(
* name = "guest_id",
* type = "integer",
* length = 140
* )
* ),
* @AttributeOverride(name="name",
* column=@Column(
* name = "guest_name",
* nullable = false,
* unique = true,
* length = 240
* )
* )
* })
*/
class Guest extends User
{
}
.. code-block:: xml
<!-- user mapping -->
@@ -702,7 +521,6 @@ Could be used by an entity that extends a mapped superclass to override a field
<many-to-one field="address" target-entity="Address">
<cascade>
<cascade-persist/>
<cascade-merge/>
</cascade>
<join-column name="address_id" referenced-column-name="id"/>
</many-to-one>
@@ -723,42 +541,6 @@ Could be used by an entity that extends a mapped superclass to override a field
</attribute-overrides>
</entity>
</doctrine-mapping>
.. code-block:: yaml
# user mapping
MyProject\Model\User:
type: mappedSuperclass
id:
id:
type: integer
column: user_id
length: 150
generator:
strategy: AUTO
fields:
name:
type: string
column: user_name
length: 250
nullable: true
unique: false
#other fields mapping
# guest mapping
MyProject\Model\Guest:
type: entity
attributeOverride:
id:
column: guest_id
type: integer
length: 140
name:
column: guest_name
type: string
length: 240
nullable: false
unique: true
Things to note:

View File

@@ -65,15 +65,6 @@ Where the ``attribute_name`` column contains the key and
The feature request for persistence of primitive value arrays
`is described in the DDC-298 ticket <https://github.com/doctrine/orm/issues/3743>`_.
Cascade Merge with Bi-directional Associations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
There are two bugs now that concern the use of cascade merge in combination with bi-directional associations.
Make sure to study the behavior of cascade merge if you are using it:
- `DDC-875 <https://github.com/doctrine/orm/issues/5398>`_ Merge can sometimes add the same entity twice into a collection
- `DDC-763 <https://github.com/doctrine/orm/issues/5277>`_ Cascade merge on associated entities can insert too many rows through "Persistence by Reachability"
Custom Persisters
~~~~~~~~~~~~~~~~~

View File

@@ -16,13 +16,6 @@ metadata:
- **Attributes** (AttributeDriver)
- **PHP Code in files or static functions** (PhpDriver)
There are also two deprecated ways to do this:
- **Class DocBlock Annotations** (AnnotationDriver)
- **YAML files** (YamlDriver)
They will be removed in 3.0, make sure to avoid them.
Something important to note about the above drivers is they are all
an intermediate step to the same end result. The mapping
information is populated to ``Doctrine\ORM\Mapping\ClassMetadata``
@@ -44,11 +37,7 @@ an entity.
$em->getConfiguration()->setMetadataCacheImpl(new ApcuCache());
If you want to use one of the included core metadata drivers you need to
configure it. If you pick the annotation driver despite it being
deprecated, you will additionally need to install
``doctrine/annotations``. All the drivers are in the
``Doctrine\ORM\Mapping\Driver`` namespace:
All the drivers are in the ``Doctrine\ORM\Mapping\Driver`` namespace:
.. code-block:: php

View File

@@ -110,28 +110,28 @@ You need to create a class which implements ``Doctrine\ORM\Mapping\NamingStrateg
<?php
class MyAppNamingStrategy implements NamingStrategy
{
public function classToTableName($className)
public function classToTableName(string $className): string
{
return 'MyApp_' . substr($className, strrpos($className, '\\') + 1);
}
public function propertyToColumnName($propertyName)
public function propertyToColumnName(string $propertyName): string
{
return $propertyName;
}
public function referenceColumnName()
public function referenceColumnName(): string
{
return 'id';
}
public function joinColumnName($propertyName, $className = null)
public function joinColumnName(string $propertyName, ?string $className = null): string
{
return $propertyName . '_' . $this->referenceColumnName();
}
public function joinTableName($sourceEntity, $targetEntity, $propertyName = null)
public function joinTableName(string $sourceEntity, string $targetEntity, string $propertyName): string
{
return strtolower($this->classToTableName($sourceEntity) . '_' .
$this->classToTableName($targetEntity));
}
public function joinKeyColumnName($entityName, $referencedColumnName = null)
public function joinKeyColumnName(string $entityName, ?string $referencedColumnName): string
{
return strtolower($this->classToTableName($entityName) . '_' .
($referencedColumnName ?: $this->referenceColumnName()));

View File

@@ -465,477 +465,3 @@ above would result in partial objects if any objects in the result
are actually a subtype of User. When using DQL, Doctrine
automatically includes the necessary joins for this mapping
strategy but with native SQL it is your responsibility.
Named Native Query
------------------
.. note::
Named Native Queries are deprecated as of version 2.9 and will be removed in ORM 3.0
You can also map a native query using a named native query mapping.
To achieve that, you must describe the SQL resultset structure
using named native query (and sql resultset mappings if is a several resultset mappings).
Like named query, a named native query can be defined at class level or in a XML or YAML file.
A resultSetMapping parameter is defined in @NamedNativeQuery,
it represents the name of a defined @SqlResultSetMapping.
.. configuration-block::
.. code-block:: php
<?php
namespace MyProject\Model;
/**
* @NamedNativeQueries({
* @NamedNativeQuery(
* name = "fetchMultipleJoinsEntityResults",
* resultSetMapping= "mappingMultipleJoinsEntityResults",
* query = "SELECT u.id AS u_id, u.name AS u_name, u.status AS u_status, a.id AS a_id, a.zip AS a_zip, a.country AS a_country, COUNT(p.phonenumber) AS numphones FROM users u INNER JOIN addresses a ON u.id = a.user_id INNER JOIN phonenumbers p ON u.id = p.user_id GROUP BY u.id, u.name, u.status, u.username, a.id, a.zip, a.country ORDER BY u.username"
* ),
* })
* @SqlResultSetMappings({
* @SqlResultSetMapping(
* name = "mappingMultipleJoinsEntityResults",
* entities= {
* @EntityResult(
* entityClass = "__CLASS__",
* fields = {
* @FieldResult(name = "id", column="u_id"),
* @FieldResult(name = "name", column="u_name"),
* @FieldResult(name = "status", column="u_status"),
* }
* ),
* @EntityResult(
* entityClass = "Address",
* fields = {
* @FieldResult(name = "id", column="a_id"),
* @FieldResult(name = "zip", column="a_zip"),
* @FieldResult(name = "country", column="a_country"),
* }
* )
* },
* columns = {
* @ColumnResult("numphones")
* }
* )
*})
*/
class User
{
/** @Id @Column(type="integer") @GeneratedValue */
public $id;
/** @Column(type="string", length=50, nullable=true) */
public $status;
/** @Column(type="string", length=255, unique=true) */
public $username;
/** @Column(type="string", length=255) */
public $name;
/** @OneToMany(targetEntity="Phonenumber") */
public $phonenumbers;
/** @OneToOne(targetEntity="Address") */
public $address;
// ....
}
.. code-block:: xml
<doctrine-mapping>
<entity name="MyProject\Model\User">
<named-native-queries>
<named-native-query name="fetchMultipleJoinsEntityResults" result-set-mapping="mappingMultipleJoinsEntityResults">
<query>SELECT u.id AS u_id, u.name AS u_name, u.status AS u_status, a.id AS a_id, a.zip AS a_zip, a.country AS a_country, COUNT(p.phonenumber) AS numphones FROM users u INNER JOIN addresses a ON u.id = a.user_id INNER JOIN phonenumbers p ON u.id = p.user_id GROUP BY u.id, u.name, u.status, u.username, a.id, a.zip, a.country ORDER BY u.username</query>
</named-native-query>
</named-native-queries>
<sql-result-set-mappings>
<sql-result-set-mapping name="mappingMultipleJoinsEntityResults">
<entity-result entity-class="__CLASS__">
<field-result name="id" column="u_id"/>
<field-result name="name" column="u_name"/>
<field-result name="status" column="u_status"/>
</entity-result>
<entity-result entity-class="Address">
<field-result name="id" column="a_id"/>
<field-result name="zip" column="a_zip"/>
<field-result name="country" column="a_country"/>
</entity-result>
<column-result name="numphones"/>
</sql-result-set-mapping>
</sql-result-set-mappings>
</entity>
</doctrine-mapping>
.. code-block:: yaml
MyProject\Model\User:
type: entity
namedNativeQueries:
fetchMultipleJoinsEntityResults:
name: fetchMultipleJoinsEntityResults
resultSetMapping: mappingMultipleJoinsEntityResults
query: SELECT u.id AS u_id, u.name AS u_name, u.status AS u_status, a.id AS a_id, a.zip AS a_zip, a.country AS a_country, COUNT(p.phonenumber) AS numphones FROM users u INNER JOIN addresses a ON u.id = a.user_id INNER JOIN phonenumbers p ON u.id = p.user_id GROUP BY u.id, u.name, u.status, u.username, a.id, a.zip, a.country ORDER BY u.username
sqlResultSetMappings:
mappingMultipleJoinsEntityResults:
name: mappingMultipleJoinsEntityResults
columnResult:
0:
name: numphones
entityResult:
0:
entityClass: __CLASS__
fieldResult:
0:
name: id
column: u_id
1:
name: name
column: u_name
2:
name: status
column: u_status
1:
entityClass: Address
fieldResult:
0:
name: id
column: a_id
1:
name: zip
column: a_zip
2:
name: country
column: a_country
Things to note:
- The resultset mapping declares the entities retrieved by this native query.
- Each field of the entity is bound to a SQL alias (or column name).
- All fields of the entity including the ones of subclasses
and the foreign key columns of related entities have to be present in the SQL query.
- Field definitions are optional provided that they map to the same
column name as the one declared on the class property.
- ``__CLASS__`` is an alias for the mapped class
In the above example,
the ``fetchJoinedAddress`` named query use the joinMapping result set mapping.
This mapping returns 2 entities, User and Address, each property is declared and associated to a column name,
actually the column name retrieved by the query.
Let's now see an implicit declaration of the property / column.
.. configuration-block::
.. code-block:: php
<?php
namespace MyProject\Model;
/**
* @NamedNativeQueries({
* @NamedNativeQuery(
* name = "findAll",
* resultSetMapping = "mappingFindAll",
* query = "SELECT * FROM addresses"
* ),
* })
* @SqlResultSetMappings({
* @SqlResultSetMapping(
* name = "mappingFindAll",
* entities= {
* @EntityResult(
* entityClass = "Address"
* )
* }
* )
* })
*/
class Address
{
/** @Id @Column(type="integer") @GeneratedValue */
public $id;
/** @Column() */
public $country;
/** @Column() */
public $zip;
/** @Column()*/
public $city;
// ....
}
.. code-block:: xml
<doctrine-mapping>
<entity name="MyProject\Model\Address">
<named-native-queries>
<named-native-query name="findAll" result-set-mapping="mappingFindAll">
<query>SELECT * FROM addresses</query>
</named-native-query>
</named-native-queries>
<sql-result-set-mappings>
<sql-result-set-mapping name="mappingFindAll">
<entity-result entity-class="Address"/>
</sql-result-set-mapping>
</sql-result-set-mappings>
</entity>
</doctrine-mapping>
.. code-block:: yaml
MyProject\Model\Address:
type: entity
namedNativeQueries:
findAll:
resultSetMapping: mappingFindAll
query: SELECT * FROM addresses
sqlResultSetMappings:
mappingFindAll:
name: mappingFindAll
entityResult:
address:
entityClass: Address
In this example, we only describe the entity member of the result set mapping.
The property / column mappings is done using the entity mapping values.
In this case the model property is bound to the model_txt column.
If the association to a related entity involve a composite primary key,
a @FieldResult element should be used for each foreign key column.
The @FieldResult name is composed of the property name for the relationship,
followed by a dot ("."), followed by the name or the field or property of the primary key.
.. configuration-block::
.. code-block:: php
<?php
namespace MyProject\Model;
/**
* @NamedNativeQueries({
* @NamedNativeQuery(
* name = "fetchJoinedAddress",
* resultSetMapping= "mappingJoinedAddress",
* query = "SELECT u.id, u.name, u.status, a.id AS a_id, a.country AS a_country, a.zip AS a_zip, a.city AS a_city FROM users u INNER JOIN addresses a ON u.id = a.user_id WHERE u.username = ?"
* ),
* })
* @SqlResultSetMappings({
* @SqlResultSetMapping(
* name = "mappingJoinedAddress",
* entities= {
* @EntityResult(
* entityClass = "__CLASS__",
* fields = {
* @FieldResult(name = "id"),
* @FieldResult(name = "name"),
* @FieldResult(name = "status"),
* @FieldResult(name = "address.id", column = "a_id"),
* @FieldResult(name = "address.zip", column = "a_zip"),
* @FieldResult(name = "address.city", column = "a_city"),
* @FieldResult(name = "address.country", column = "a_country"),
* }
* )
* }
* )
* })
*/
class User
{
/** @Id @Column(type="integer") @GeneratedValue */
public $id;
/** @Column(type="string", length=50, nullable=true) */
public $status;
/** @Column(type="string", length=255, unique=true) */
public $username;
/** @Column(type="string", length=255) */
public $name;
/** @OneToOne(targetEntity="Address") */
public $address;
// ....
}
.. code-block:: xml
<doctrine-mapping>
<entity name="MyProject\Model\User">
<named-native-queries>
<named-native-query name="fetchJoinedAddress" result-set-mapping="mappingJoinedAddress">
<query>SELECT u.id, u.name, u.status, a.id AS a_id, a.country AS a_country, a.zip AS a_zip, a.city AS a_city FROM users u INNER JOIN addresses a ON u.id = a.user_id WHERE u.username = ?</query>
</named-native-query>
</named-native-queries>
<sql-result-set-mappings>
<sql-result-set-mapping name="mappingJoinedAddress">
<entity-result entity-class="__CLASS__">
<field-result name="id"/>
<field-result name="name"/>
<field-result name="status"/>
<field-result name="address.id" column="a_id"/>
<field-result name="address.zip" column="a_zip"/>
<field-result name="address.city" column="a_city"/>
<field-result name="address.country" column="a_country"/>
</entity-result>
</sql-result-set-mapping>
</sql-result-set-mappings>
</entity>
</doctrine-mapping>
.. code-block:: yaml
MyProject\Model\User:
type: entity
namedNativeQueries:
fetchJoinedAddress:
name: fetchJoinedAddress
resultSetMapping: mappingJoinedAddress
query: SELECT u.id, u.name, u.status, a.id AS a_id, a.country AS a_country, a.zip AS a_zip, a.city AS a_city FROM users u INNER JOIN addresses a ON u.id = a.user_id WHERE u.username = ?
sqlResultSetMappings:
mappingJoinedAddress:
entityResult:
0:
entityClass: __CLASS__
fieldResult:
0:
name: id
1:
name: name
2:
name: status
3:
name: address.id
column: a_id
4:
name: address.zip
column: a_zip
5:
name: address.city
column: a_city
6:
name: address.country
column: a_country
If you retrieve a single entity and if you use the default mapping,
you can use the resultClass attribute instead of resultSetMapping:
.. configuration-block::
.. code-block:: php
<?php
namespace MyProject\Model;
/**
* @NamedNativeQueries({
* @NamedNativeQuery(
* name = "find-by-id",
* resultClass = "Address",
* query = "SELECT * FROM addresses"
* ),
* })
*/
class Address
{
// ....
}
.. code-block:: xml
<doctrine-mapping>
<entity name="MyProject\Model\Address">
<named-native-queries>
<named-native-query name="find-by-id" result-class="Address">
<query>SELECT * FROM addresses WHERE id = ?</query>
</named-native-query>
</named-native-queries>
</entity>
</doctrine-mapping>
.. code-block:: yaml
MyProject\Model\Address:
type: entity
namedNativeQueries:
findAll:
name: findAll
resultClass: Address
query: SELECT * FROM addresses
In some of your native queries, you'll have to return scalar values,
for example when building report queries.
You can map them in the @SqlResultsetMapping through @ColumnResult.
You actually can even mix, entities and scalar returns in the same native query (this is probably not that common though).
.. configuration-block::
.. code-block:: php
<?php
namespace MyProject\Model;
/**
* @NamedNativeQueries({
* @NamedNativeQuery(
* name = "count",
* resultSetMapping= "mappingCount",
* query = "SELECT COUNT(*) AS count FROM addresses"
* )
* })
* @SqlResultSetMappings({
* @SqlResultSetMapping(
* name = "mappingCount",
* columns = {
* @ColumnResult(
* name = "count"
* )
* }
* )
* })
*/
class Address
{
// ....
}
.. code-block:: xml
<doctrine-mapping>
<entity name="MyProject\Model\Address">
<named-native-query name="count" result-set-mapping="mappingCount">
<query>SELECT COUNT(*) AS count FROM addresses</query>
</named-native-query>
<sql-result-set-mappings>
<sql-result-set-mapping name="mappingCount">
<column-result name="count"/>
</sql-result-set-mapping>
</sql-result-set-mappings>
</entity>
</doctrine-mapping>
.. code-block:: yaml
MyProject\Model\Address:
type: entity
namedNativeQueries:
count:
name: count
resultSetMapping: mappingCount
query: SELECT COUNT(*) AS count FROM addresses
sqlResultSetMappings:
mappingCount:
name: mappingCount
columnResult:
count:
name: count

View File

@@ -0,0 +1,15 @@
Partial Hydration
=================
Partial hydration of entities is allowed in the array hydrator, when
only a subset of the fields of an entity are loaded from the database
and the nested results are still created based on the entity relationship structure.
.. code-block:: php
<?php
$users = $em->createQuery("SELECT PARTIAL u.{id,name}, partial a.{id,street} FROM MyApp\Domain\User u JOIN u.addresses a")
->getArrayResult();
This is a useful optimization when you are not interested in all fields of an entity
for performance reasons, for example in use-cases for exporting or rendering lots of data.

View File

@@ -1,19 +1,11 @@
Partial Objects
===============
.. note::
Creating Partial Objects through DQL is deprecated and
will be removed in the future, use data transfer object
support in DQL instead. (\ `Details
<https://github.com/doctrine/orm/issues/8471>`_)
A partial object is an object whose state is not fully initialized
after being reconstituted from the database and that is
disconnected from the rest of its data. The following section will
describe why partial objects are problematic and what the approach
of Doctrine2 to this problem is.
of Doctrine to this problem is.
.. note::
@@ -94,5 +86,3 @@ When should I force partial objects?
Mainly for optimization purposes, but be careful of premature
optimization as partial objects lead to potentially more fragile
code.

View File

@@ -1,97 +1,20 @@
PHP Mapping
===========
Doctrine ORM also allows you to provide the ORM metadata in the form
of plain PHP code using the ``ClassMetadata`` API. You can write
the code in PHP files or inside of a static function named
``loadMetadata($class)`` on the entity class itself.
PHP Files
---------
.. note::
PHPDriver is deprecated and will be removed in 3.0, use StaticPHPDriver
instead.
If you wish to write your mapping information inside PHP files that
are named after the entity and included to populate the metadata
for an entity you can do so by using the ``PHPDriver``:
.. code-block:: php
<?php
$driver = new PHPDriver('/path/to/php/mapping/files');
$em->getConfiguration()->setMetadataDriverImpl($driver);
Now imagine we had an entity named ``Entities\User`` and we wanted
to write a mapping file for it using the above configured
``PHPDriver`` instance:
.. code-block:: php
<?php
namespace Entities;
class User
{
private $id;
private $username;
}
To write the mapping information you just need to create a file
named ``Entities.User.php`` inside of the
``/path/to/php/mapping/files`` folder:
.. code-block:: php
<?php
// /path/to/php/mapping/files/Entities.User.php
$metadata->mapField(array(
'id' => true,
'fieldName' => 'id',
'type' => 'integer'
));
$metadata->mapField(array(
'fieldName' => 'username',
'type' => 'string',
'options' => array(
'fixed' => true,
'comment' => "User's login name"
)
));
$metadata->mapField(array(
'fieldName' => 'login_count',
'type' => 'integer',
'nullable' => false,
'options' => array(
'unsigned' => true,
'default' => 0
)
));
Now we can easily retrieve the populated ``ClassMetadata`` instance
where the ``PHPDriver`` includes the file and the
``ClassMetadataFactory`` caches it for later retrieval:
.. code-block:: php
<?php
$class = $em->getClassMetadata('Entities\User');
// or
$class = $em->getMetadataFactory()->getMetadataFor('Entities\User');
Doctrine ORM also allows you to provide the ORM metadata in the form of plain
PHP code using the ``ClassMetadata`` API. You can write the code in inside of a
static function named ``loadMetadata($class)`` on the entity class itself.
Static Function
---------------
In addition to the PHP files you can also specify your mapping
information inside of a static function defined on the entity class
itself. This is useful for cases where you want to keep your entity
and mapping information together but don't want to use attributes or
annotations. For this you just need to use the ``StaticPHPDriver``:
In addition to other drivers using configuration languages you can also
programatically specify your mapping information inside of a static function
defined on the entity class itself.
This is useful for cases where you want to keep your entity and mapping
information together but don't want to use attributes. For this you just
need to use the ``StaticPHPDriver``:
.. code-block:: php
@@ -164,13 +87,11 @@ The API of the ClassMetadataBuilder has the following methods with a fluent inte
- ``setTable($name)``
- ``addIndex(array $columns, $indexName)``
- ``addUniqueConstraint(array $columns, $constraintName)``
- ``addNamedQuery($name, $dqlQuery)``
- ``setJoinedTableInheritance()``
- ``setSingleTableInheritance()``
- ``setDiscriminatorColumn($name, $type = 'string', $length = 255, $columnDefinition = null, $enumType = null, $options = [])``
- ``addDiscriminatorMapClass($name, $class)``
- ``setChangeTrackingPolicyDeferredExplicit()``
- ``setChangeTrackingPolicyNotify()``
- ``addLifecycleEvent($methodName, $event)``
- ``addManyToOne($name, $targetEntity, $inversedBy = null)``
- ``addInverseOneToOne($name, $targetEntity, $mappedBy)``
@@ -272,7 +193,6 @@ Inheritance Getters
- ``isInheritanceTypeNone()``
- ``isInheritanceTypeJoined()``
- ``isInheritanceTypeSingleTable()``
- ``isInheritanceTypeTablePerClass()``
- ``isInheritedField($fieldName)``
- ``isInheritedAssociation($fieldName)``
@@ -282,7 +202,6 @@ Change Tracking Getters
- ``isChangeTrackingDeferredExplicit()``
- ``isChangeTrackingDeferredImplicit()``
- ``isChangeTrackingNotify()``
Field & Association Getters
~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -290,6 +209,7 @@ Field & Association Getters
- ``isUniqueField($fieldName)``
- ``isNullable($fieldName)``
- ``isIndexed($fieldName)``
- ``getColumnName($fieldName)``
- ``getFieldMapping($fieldName)``
- ``getAssociationMapping($fieldName)``

View File

@@ -611,3 +611,21 @@ same query of example 6 written using
->add('from', new Expr\From('User', 'u'))
->add('where', new Expr\Comparison('u.id', '=', '?1'))
->add('orderBy', new Expr\OrderBy('u.name', 'ASC'));
Binding Parameters to Placeholders
----------------------------------
It is often not necessary to know about the exact placeholder names when
building a query. You can use a helper method to bind a value to a placeholder
and directly use that placeholder in your query as a return value:
.. code-block:: php
<?php
// $qb instanceof QueryBuilder
$qb->select('u')
->from('User', 'u')
->where('u.email = ' . $qb->createNamedParameter($userInputEmail))
;
// SELECT u FROM User u WHERE email = :dcValue1

View File

@@ -295,30 +295,6 @@ level cache region.
// other properties and methods
}
.. code-block:: annotation
<?php
/**
* @Entity
* @Cache("NONSTRICT_READ_WRITE")
*/
class State
{
/**
* @Id
* @GeneratedValue
* @Column(type="integer")
*/
protected int|null $id = null;
/**
* @Column(unique=true)
*/
protected string $name;
// other properties and methods
}
.. code-block:: xml
<?xml version="1.0" encoding="utf-8"?>
@@ -335,24 +311,6 @@ level cache region.
</entity>
</doctrine-mapping>
.. code-block:: yaml
Country:
type: entity
cache:
usage: READ_ONLY
region: my_entity_region
id:
id:
type: integer
id: true
generator:
strategy: IDENTITY
fields:
name:
type: string
Association cache definition
----------------------------
The most common use case is to cache entities. But we can also cache relationships.
@@ -389,44 +347,6 @@ It caches the primary keys of association and cache each element will be cached
// other properties and methods
}
.. code-block:: annotation
<?php
/**
* @Entity
* @Cache("NONSTRICT_READ_WRITE")
*/
class State
{
/**
* @Id
* @GeneratedValue
* @Column(type="integer")
*/
protected int|null $id = null;
/**
* @Column(unique=true)
*/
protected string $name;
/**
* @Cache("NONSTRICT_READ_WRITE")
* @ManyToOne(targetEntity="Country")
* @JoinColumn(name="country_id", referencedColumnName="id")
*/
protected Country|null $country;
/**
* @Cache("NONSTRICT_READ_WRITE")
* @OneToMany(targetEntity="City", mappedBy="state")
* @var Collection<int, City>
*/
protected Collection $cities;
// other properties and methods
}
.. code-block:: xml
<?xml version="1.0" encoding="utf-8"?>
@@ -458,38 +378,6 @@ It caches the primary keys of association and cache each element will be cached
</entity>
</doctrine-mapping>
.. code-block:: yaml
State:
type: entity
cache:
usage: NONSTRICT_READ_WRITE
id:
id:
type: integer
id: true
generator:
strategy: IDENTITY
fields:
name:
type: string
manyToOne:
state:
targetEntity: Country
joinColumns:
country_id:
referencedColumnName: id
cache:
usage: NONSTRICT_READ_WRITE
oneToMany:
cities:
targetEntity:City
mappedBy: state
cache:
usage: NONSTRICT_READ_WRITE
.. note::
for this to work, the target entity must also be marked as cacheable.

View File

@@ -83,18 +83,8 @@ The following Commands are currently available:
cache drivers.
- ``orm:clear-cache:result`` Clear result cache of the various
cache drivers.
- ``orm:convert-d1-schema`` Converts Doctrine 1.X schema into a
Doctrine 2.X schema.
- ``orm:convert-mapping`` Convert mapping information between
supported formats.
- ``orm:ensure-production-settings`` Verify that Doctrine is
properly configured for a production environment.
- ``orm:generate-entities`` Generate entity classes and method
stubs from your mapping information.
- ``orm:generate-proxies`` Generates proxy classes for entity
classes.
- ``orm:generate-repositories`` Generate repository classes from
your mapping information.
classes. Deprecated in favor of using native lazy objects.
- ``orm:run-dql`` Executes arbitrary DQL directly from the command
line.
- ``orm:schema-tool:create`` Processes the schema and either
@@ -107,14 +97,10 @@ The following Commands are currently available:
update the database schema of EntityManager Storage Connection or
generate the SQL output.
For these commands are also available aliases:
The following alias is defined:
- ``orm:convert:d1-schema`` is alias for ``orm:convert-d1-schema``.
- ``orm:convert:mapping`` is alias for ``orm:convert-mapping``.
- ``orm:generate:entities`` is alias for ``orm:generate-entities``.
- ``orm:generate:proxies`` is alias for ``orm:generate-proxies``.
- ``orm:generate:repositories`` is alias for ``orm:generate-repositories``.
.. note::
@@ -225,163 +211,6 @@ will output the SQL for the ran operation.
$ php bin/doctrine orm:schema-tool:create --dump-sql
Entity Generation
-----------------
Generate entity classes and method stubs from your mapping information.
.. code-block:: php
$ php bin/doctrine orm:generate-entities
$ php bin/doctrine orm:generate-entities --update-entities
$ php bin/doctrine orm:generate-entities --regenerate-entities
This command is not suited for constant usage. It is a little helper and does
not support all the mapping edge cases very well. You still have to put work
in your entities after using this command.
It is possible to use the EntityGenerator on code that you have already written. It will
not be lost. The EntityGenerator will only append new code to your
file and will not delete the old code. However this approach may still be prone
to error and we suggest you use code repositories such as GIT or SVN to make
backups of your code.
It makes sense to generate the entity code if you are using entities as Data
Access Objects only and don't put much additional logic on them. If you are
however putting much more logic on the entities you should refrain from using
the entity-generator and code your entities manually.
.. note::
Even if you specified Inheritance options in your
XML or YAML Mapping files the generator cannot generate the base and
child classes for you correctly, because it doesn't know which
class is supposed to extend which. You have to adjust the entity
code manually for inheritance to work!
Convert Mapping Information
---------------------------
Convert mapping information between supported formats.
This is an **execute one-time** command. It should not be necessary for
you to call this method multiple times, especially when using the ``--from-database``
flag.
Converting an existing database schema into mapping files only solves about 70-80%
of the necessary mapping information. Additionally the detection from an existing
database cannot detect inverse associations, inheritance types,
entities with foreign keys as primary keys and many of the
semantical operations on associations such as cascade.
.. note::
There is no need to convert YAML or XML mapping files to annotations
every time you make changes. All mapping drivers are first class citizens
in Doctrine 2 and can be used as runtime mapping for the ORM. See the
docs on XML and YAML Mapping for an example how to register this metadata
drivers as primary mapping source.
To convert some mapping information between the various supported
formats you can use the ``ClassMetadataExporter`` to get exporter
instances for the different formats:
.. code-block:: php
<?php
$cme = new \Doctrine\ORM\Tools\Export\ClassMetadataExporter();
Once you have a instance you can use it to get an exporter. For
example, the yml exporter:
.. code-block:: php
<?php
$exporter = $cme->getExporter('yml', '/path/to/export/yml');
Now you can export some ``ClassMetadata`` instances:
.. code-block:: php
<?php
$classes = array(
$em->getClassMetadata('Entities\User'),
$em->getClassMetadata('Entities\Profile')
);
$exporter->setMetadata($classes);
$exporter->export();
This functionality is also available from the command line to
convert your loaded mapping information to another format. The
``orm:convert-mapping`` command accepts two arguments, the type to
convert to and the path to generate it:
.. code-block:: php
$ php bin/doctrine orm:convert-mapping xml /path/to/mapping-path-converted-to-xml
Reverse Engineering
-------------------
You can use the ``DatabaseDriver`` to reverse engineer a database to an
array of ``ClassMetadata`` instances and generate YAML, XML, etc. from
them.
.. note::
Reverse Engineering is a **one-time** process that can get you started with a project.
Converting an existing database schema into mapping files only detects about 70-80%
of the necessary mapping information. Additionally the detection from an existing
database cannot detect inverse associations, inheritance types,
entities with foreign keys as primary keys and many of the
semantical operations on associations such as cascade.
First you need to retrieve the metadata instances with the
``DatabaseDriver``:
.. code-block:: php
<?php
$em->getConfiguration()->setMetadataDriverImpl(
new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
$em->getConnection()->getSchemaManager()
)
);
$cmf = new \Doctrine\ORM\Tools\DisconnectedClassMetadataFactory();
$cmf->setEntityManager($em);
$metadata = $cmf->getAllMetadata();
Now you can get an exporter instance and export the loaded metadata
to yml:
.. code-block:: php
<?php
$cme = new \Doctrine\ORM\Tools\Export\ClassMetadataExporter();
$exporter = $cme->getExporter('yml', '/path/to/export/yml');
$exporter->setMetadata($metadata);
$exporter->export();
You can also reverse engineer a database using the
``orm:convert-mapping`` command:
.. code-block:: php
$ php bin/doctrine orm:convert-mapping --from-database yml /path/to/mapping-path-converted-to-yml
.. note::
Reverse Engineering is not always working perfectly
depending on special cases. It will only detect Many-To-One
relations (even if they are One-To-One) and will try to create
entities from Many-To-Many tables. It also has problems with naming
of foreign keys that have multiple column names. Any Reverse
Engineered Database-Schema needs considerable manual work to become
a useful domain model.
Runtime vs Development Mapping Validation
-----------------------------------------

View File

@@ -202,17 +202,6 @@ example we'll use an integer.
// ...
}
.. code-block:: annotation
<?php
class User
{
// ...
/** @Version @Column(type="integer") */
private int $version;
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -221,15 +210,6 @@ example we'll use an integer.
</entity>
</doctrine-mapping>
.. code-block:: yaml
User:
type: entity
fields:
version:
type: integer
version: true
Alternatively a datetime type can be used (which maps to a SQL
timestamp or datetime):
@@ -246,17 +226,6 @@ timestamp or datetime):
// ...
}
.. code-block:: annotation
<?php
class User
{
// ...
/** @Version @Column(type="datetime") */
private DateTime $version;
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -265,15 +234,6 @@ timestamp or datetime):
</entity>
</doctrine-mapping>
.. code-block:: yaml
User:
type: entity
fields:
version:
type: datetime
version: true
Version numbers (not timestamps) should however be preferred as
they can not potentially conflict in a highly concurrent
environment, unlike timestamps where this is a possibility,

View File

@@ -47,21 +47,6 @@ Then, an entity using the ``CustomIdObject`` typed field will be correctly assig
// ...
}
.. code-block:: annotation
<?php
/**
* @Entity
* @Table(name="cms_users_typed_with_custom_typed_field")
*/
class UserTypedWithCustomTypedField
{
/** @Column */
public CustomIdObject $customId;
// ...
}
.. code-block:: xml
<doctrine-mapping>
@@ -176,4 +161,4 @@ You need to create a class which implements ``Doctrine\ORM\Mapping\TypedFieldMap
Note that this case checks whether the mapping is already assigned, and if yes, it skips it. This is up to your
implementation. You can make a "greedy" mapper which will always override the mapping with its own type, or one
that behaves like the ``DefaultTypedFieldMapper`` and does not modify the type once its set prior in the chain.
that behaves like the ``DefaultTypedFieldMapper`` and does not modify the type once its set prior in the chain.

View File

@@ -129,16 +129,10 @@ optimize the performance of the Flush Operation:
- Temporarily mark entities as read only. If you have a very large UnitOfWork
but know that a large set of entities has not changed, just mark them as read
only with ``$entityManager->getUnitOfWork()->markReadOnly($entity)``.
- Flush only a single entity with ``$entityManager->flush($entity)``.
- Use :doc:`Change Tracking Policies <change-tracking-policies>` to use more
explicit strategies of notifying the UnitOfWork what objects/properties
changed.
.. note::
Flush only a single entity with ``$entityManager->flush($entity)`` is deprecated and will be removed in ORM 3.0.
(\ `Details <https://github.com/doctrine/orm/issues/8459>`_)
Query Internals
---------------

View File

@@ -415,7 +415,7 @@ Transitive persistence / Cascade Operations
Doctrine ORM provides a mechanism for transitive persistence through cascading of certain operations.
Each association to another entity or a collection of
entities can be configured to automatically cascade the following operations to the associated entities:
``persist``, ``remove``, ``merge``, ``detach``, ``refresh`` or ``all``.
``persist``, ``remove``, ``detach``, ``refresh`` or ``all``.
The main use case for ``cascade: persist`` is to avoid "exposing" associated entities to your PHP application.
Continuing with the User-Comment example of this chapter, this is how the creation of a new user and a new

View File

@@ -166,7 +166,7 @@ your code. See the following code:
Traversing the object graph for parts that are lazy-loaded will
easily trigger lots of SQL queries and will perform badly if used
to heavily. Make sure to use DQL to fetch-join all the parts of the
too heavily. Make sure to use DQL to fetch-join all the parts of the
object-graph that you need as efficiently as possible.
@@ -414,77 +414,6 @@ automatically without invoking the ``detach`` method:
The ``detach`` operation is usually not as frequently needed and
used as ``persist`` and ``remove``.
Merging entities
----------------
Merging entities refers to the merging of (usually detached)
entities into the context of an EntityManager so that they become
managed again. To merge the state of an entity into an
EntityManager use the ``EntityManager#merge($entity)`` method. The
state of the passed entity will be merged into a managed copy of
this entity and this copy will subsequently be returned.
Example:
.. code-block:: php
<?php
$detachedEntity = unserialize($serializedEntity); // some detached entity
$entity = $em->merge($detachedEntity);
// $entity now refers to the fully managed copy returned by the merge operation.
// The EntityManager $em now manages the persistence of $entity as usual.
The semantics of the merge operation, applied to an entity X, are
as follows:
- If X is a detached entity, the state of X is copied onto a
pre-existing managed entity instance X' of the same identity.
- If X is a new entity instance, a new managed copy X' will be
created and the state of X is copied onto this managed instance.
- If X is a removed entity instance, an InvalidArgumentException
will be thrown.
- If X is a managed entity, it is ignored by the merge operation,
however, the merge operation is cascaded to entities referenced by
relationships from X if these relationships have been mapped with
the cascade element value MERGE or ALL (see ":ref:`transitive-persistence`").
- For all entities Y referenced by relationships from X having the
cascade element value MERGE or ALL, Y is merged recursively as Y'.
For all such Y referenced by X, X' is set to reference Y'. (Note
that if X is managed then X is the same object as X'.)
- If X is an entity merged to X', with a reference to another
entity Y, where cascade=MERGE or cascade=ALL is not specified, then
navigation of the same association from X' yields a reference to a
managed object Y' with the same persistent identity as Y.
The ``merge`` operation will throw an ``OptimisticLockException``
if the entity being merged uses optimistic locking through a
version field and the versions of the entity being merged and the
managed copy don't match. This usually means that the entity has
been modified while being detached.
The ``merge`` operation is usually not as frequently needed and
used as ``persist`` and ``remove``. The most common scenario for
the ``merge`` operation is to reattach entities to an EntityManager
that come from some cache (and are therefore detached) and you want
to modify and persist such an entity.
.. warning::
If you need to perform multiple merges of entities that share certain subparts
of their object-graphs and cascade merge, then you have to call ``EntityManager#clear()`` between the
successive calls to ``EntityManager#merge()``. Otherwise you might end up with
multiple copies of the "same" object in the database, however with different ids.
.. note::
If you load some detached entities from a cache and you do
not need to persist or delete them or otherwise make use of them
without the need for persistence services there is no need to use
``merge``. I.e. you can simply pass detached objects from a cache
directly to the view.
Synchronization with the Database
---------------------------------
@@ -595,7 +524,7 @@ during development.
.. note::
Do not invoke ``flush`` after every change to an entity
or every single invocation of persist/remove/merge/... This is an
or every single invocation of persist/remove/... This is an
anti-pattern and unnecessarily reduces the performance of your
application. Instead, form units of work that operate on your
objects and call ``flush`` when you are done. While serving a
@@ -863,7 +792,7 @@ By default the EntityManager returns a default implementation of
``Doctrine\ORM\EntityRepository`` when you call
``EntityManager#getRepository($entityClass)``. You can overwrite
this behaviour by specifying the class name of your own Entity
Repository in the Attribute, Annotation, XML or YAML metadata. In large
Repository in the Attribute or XML metadata. In large
applications that require lots of specialized DQL queries using a
custom repository is one recommended way of grouping these queries
in a central location.

View File

@@ -2,7 +2,8 @@ XML Mapping
===========
The XML mapping driver enables you to provide the ORM metadata in
form of XML documents.
form of XML documents. It requires the ``dom`` extension in order to be
able to validate your mapping documents against its XML Schema.
The XML driver is backed by an XML Schema document that describes
the structure of a mapping document. The most recent version of the
@@ -45,7 +46,7 @@ In order to work, this requires certain conventions:
.. code-block:: php
<?php
$driver->setFileExtension('.xml');
$driver->getLocator()->setFileExtension('.xml');
It is recommended to put all XML mapping documents in a single
folder but you can spread the documents over several folders if you
@@ -111,7 +112,6 @@ of several common elements:
<indexes>
<index name="name_idx" columns="name"/>
<index columns="user_email"/>
</indexes>
<unique-constraints>
@@ -130,7 +130,7 @@ of several common elements:
</id>
<field name="name" column="name" type="string" length="50" nullable="true" unique="true" />
<field name="email" column="user_email" type="string" column-definition="CHAR(32) NOT NULL" />
<field name="email" column="user_email" type="string" index="true" column-definition="CHAR(32) NOT NULL" />
<one-to-one field="address" target-entity="Address" inversed-by="user">
<cascade><cascade-remove /></cascade>
@@ -254,6 +254,8 @@ Optional attributes:
only.
- unique - Should this field contain a unique value across the
table? Defaults to false.
- index - Should an index be created for this column? Defaults to
false.
- nullable - Should this field allow NULL as a value? Defaults to
false.
- insertable - Should this field be inserted? Defaults to true.
@@ -691,7 +693,6 @@ specified by their respective tags:
- ``<cascade-persist />``
- ``<cascade-merge />``
- ``<cascade-remove />``
- ``<cascade-refresh />``
- ``<cascade-detach />``

View File

@@ -1,158 +0,0 @@
YAML Mapping
============
.. warning::
The YAML driver is deprecated and will be removed in version 3.0.
It is strongly recommended to switch to one of the other mappings.
The YAML mapping driver enables you to provide the ORM metadata in
form of YAML documents.
The YAML mapping document of a class is loaded on-demand the first
time it is requested and subsequently stored in the metadata cache.
In order to work, this requires certain conventions:
- Each entity/mapped superclass must get its own dedicated YAML
mapping document.
- The name of the mapping document must consist of the fully
qualified name of the class, where namespace separators are
replaced by dots (.).
- All mapping documents should get the extension ".dcm.yml" to
identify it as a Doctrine mapping file. This is more of a
convention and you are not forced to do this. You can change the
file extension easily enough.
.. code-block:: php
<?php
$driver->setFileExtension('.yml');
It is recommended to put all YAML mapping documents in a single
folder but you can spread the documents over several folders if you
want to. In order to tell the YamlDriver where to look for your
mapping documents, supply an array of paths as the first argument
of the constructor, like this:
.. code-block:: php
<?php
use Doctrine\ORM\Mapping\Driver\YamlDriver;
// $config instanceof Doctrine\ORM\Configuration
$driver = new YamlDriver(array('/path/to/files'));
$config->setMetadataDriverImpl($driver);
Simplified YAML Driver
~~~~~~~~~~~~~~~~~~~~~~
The Symfony project sponsored a driver that simplifies usage of the YAML Driver.
The changes between the original driver are:
- File Extension is .orm.yml
- Filenames are shortened, "MyProject\\Entities\\User" will become User.orm.yml
- You can add a global file and add multiple entities in this file.
Configuration of this client works a little bit different:
.. code-block:: php
<?php
$namespaces = array(
'/path/to/files1' => 'MyProject\Entities',
'/path/to/files2' => 'OtherProject\Entities'
);
$driver = new \Doctrine\ORM\Mapping\Driver\SimplifiedYamlDriver($namespaces);
$driver->setGlobalBasename('global'); // global.orm.yml
Example
-------
As a quick start, here is a small example document that makes use
of several common elements:
.. code-block:: yaml
# Doctrine.Tests.ORM.Mapping.User.dcm.yml
Doctrine\Tests\ORM\Mapping\User:
type: entity
repositoryClass: Doctrine\Tests\ORM\Mapping\UserRepository
table: cms_users
schema: schema_name # The schema the table lies in, for platforms that support schemas (Optional, >= 2.5)
readOnly: true
indexes:
name_index:
columns: [ name ]
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
type: string
length: 50
email:
type: string
length: 32
column: user_email
unique: true
options:
fixed: true
comment: User's email address
loginCount:
type: integer
column: login_count
nullable: false
options:
unsigned: true
default: 0
oneToOne:
address:
targetEntity: Address
joinColumn:
name: address_id
referencedColumnName: id
onDelete: CASCADE
oneToMany:
phonenumbers:
targetEntity: Phonenumber
mappedBy: user
cascade: ["persist", "merge"]
manyToMany:
groups:
targetEntity: Group
joinTable:
name: cms_users_groups
joinColumns:
user_id:
referencedColumnName: id
inverseJoinColumns:
group_id:
referencedColumnName: id
lifecycleCallbacks:
prePersist: [ doStuffOnPrePersist, doOtherStuffOnPrePersistToo ]
postPersist: [ doStuffOnPostPersist ]
Be aware that class-names specified in the YAML files should be
fully qualified.
Reference
~~~~~~~~~~~~~~~~~~~~~~
Unique Constraints
------------------
It is possible to define unique constraints by the following declaration:
.. code-block:: yaml
# ECommerceProduct.orm.yml
ECommerceProduct:
type: entity
fields:
# definition of some fields
uniqueConstraints:
search_idx:
columns: [ name, email ]

View File

@@ -5,8 +5,6 @@
:depth: 3
tutorials/getting-started
tutorials/getting-started-database
tutorials/getting-started-models
tutorials/working-with-indexed-associations
tutorials/extra-lazy-associations
tutorials/composite-primary-keys
@@ -37,11 +35,10 @@
reference/query-builder
reference/native-sql
reference/change-tracking-policies
reference/partial-hydration
reference/partial-objects
reference/annotations-reference
reference/attributes-reference
reference/xml-mapping
reference/yaml-mapping
reference/php-mapping
reference/caching
reference/improving-performance
@@ -67,7 +64,6 @@
cookbook/dql-user-defined-functions
cookbook/generated-columns
cookbook/implementing-arrayaccess-for-domain-objects
cookbook/implementing-the-notify-changetracking-policy
cookbook/resolve-target-entity-listener
cookbook/sql-table-prefixes
cookbook/strategy-cookbook-introduction

View File

@@ -50,38 +50,6 @@ and year of production as primary keys:
}
}
.. code-block:: annotation
<?php
namespace VehicleCatalogue\Model;
/**
* @Entity
*/
class Car
{
/** @Id @Column(type="string") */
private string $name;
/** @Id @Column(type="integer") */
private int $year;
public function __construct($name, $year)
{
$this->name = $name;
$this->year = $year;
}
public function getModelName(): string
{
return $this->name;
}
public function getYearOfProduction(): int
{
return $this->year;
}
}
.. code-block:: xml
<?xml version="1.0" encoding="UTF-8"?>
@@ -96,16 +64,6 @@ and year of production as primary keys:
</entity>
</doctrine-mapping>
.. code-block:: yaml
VehicleCatalogue\Model\Car:
type: entity
id:
name:
type: string
year:
type: integer
Now you can use this entity:
.. code-block:: php
@@ -161,7 +119,6 @@ The semantics of mapping identity through foreign entities are easy:
- Only allowed on Many-To-One or One-To-One associations.
- Plug an ``#[Id]`` attribute onto every association.
- Set an attribute ``association-key`` with the field name of the association in XML.
- Set a key ``associationKey:`` with the field name of the association in YAML.
Use-Case 1: Dynamic Attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -215,57 +172,6 @@ We keep up the example of an Article with arbitrary attributes, the mapping look
}
}
.. code-block:: annotation
<?php
namespace Application\Model;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @Entity
*/
class Article
{
/** @Id @Column(type="integer") @GeneratedValue */
private int|null $id = null;
/** @Column(type="string") */
private string $title;
/**
* @OneToMany(targetEntity="ArticleAttribute", mappedBy="article", cascade={"ALL"}, indexBy="attribute")
* @var Collection<int, ArticleAttribute>
*/
private Collection $attributes;
public function addAttribute($name, $value): void
{
$this->attributes[$name] = new ArticleAttribute($name, $value, $this);
}
}
/**
* @Entity
*/
class ArticleAttribute
{
/** @Id @ManyToOne(targetEntity="Article", inversedBy="attributes") */
private Article|null $article;
/** @Id @Column(type="string") */
private string $attribute;
/** @Column(type="string") */
private string $value;
public function __construct($name, $value, $article)
{
$this->attribute = $name;
$this->value = $value;
$this->article = $article;
}
}
.. code-block:: xml
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
@@ -284,24 +190,6 @@ We keep up the example of an Article with arbitrary attributes, the mapping look
</doctrine-mapping>
.. code-block:: yaml
Application\Model\ArticleAttribute:
type: entity
id:
article:
associationKey: true
attribute:
type: string
fields:
value:
type: string
manyToOne:
article:
targetEntity: Article
inversedBy: attributes
Use-Case 2: Simple Derived Identity
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -329,26 +217,6 @@ One good example for this is a user-address relationship:
private User|null $user = null;
}
.. code-block:: yaml
User:
type: entity
id:
id:
type: integer
generator:
strategy: AUTO
Address:
type: entity
id:
user:
associationKey: true
oneToOne:
user:
targetEntity: User
Use-Case 3: Join-Table with Metadata
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -382,7 +250,7 @@ of products purchased and maybe even the current price.
public function __construct(
#[ManyToOne(targetEntity: Customer::class)]
private Customer $customer,
private Customer $customer
) {
$this->items = new ArrayCollection();
$this->created = new DateTime("now");
@@ -427,6 +295,7 @@ of products purchased and maybe even the current price.
$this->order = $order;
$this->product = $product;
$this->offeredPrice = $product->getCurrentPrice();
$this->amount = $amount;
}
}

View File

@@ -44,33 +44,6 @@ instead of simply adding the respective columns to the ``User`` class.
private string $country;
}
.. code-block:: annotation
<?php
/** @Entity */
class User
{
/** @Embedded(class = "Address") */
private Address $address;
}
/** @Embeddable */
class Address
{
/** @Column(type = "string") */
private string $street;
/** @Column(type = "string") */
private string $postalCode;
/** @Column(type = "string") */
private string $city;
/** @Column(type = "string") */
private string $country;
}
.. code-block:: xml
<doctrine-mapping>
@@ -86,22 +59,6 @@ instead of simply adding the respective columns to the ``User`` class.
</embeddable>
</doctrine-mapping>
.. code-block:: yaml
User:
type: entity
embedded:
address:
class: Address
Address:
type: embeddable
fields:
street: { type: string }
postalCode: { type: string }
city: { type: string }
country: { type: string }
In terms of your database schema, Doctrine will automatically inline all
columns from the ``Address`` class into the table of the ``User`` class,
just as if you had declared them directly there.
@@ -147,32 +104,12 @@ The following example shows you how to set your prefix to ``myPrefix_``:
private Address $address;
}
.. code-block:: annotation
<?php
/** @Entity */
class User
{
/** @Embedded(class = "Address", columnPrefix = "myPrefix_") */
private $address;
}
.. code-block:: xml
<entity name="User">
<embedded name="address" class="Address" column-prefix="myPrefix_" />
</entity>
.. code-block:: yaml
User:
type: entity
embedded:
address:
class: Address
columnPrefix: myPrefix_
To have Doctrine drop the prefix and use the value object's property name
directly, set ``columnPrefix=false`` (``use-column-prefix="false"`` for XML):
@@ -189,32 +126,12 @@ directly, set ``columnPrefix=false`` (``use-column-prefix="false"`` for XML):
private Address $address;
}
.. code-block:: annotation
<?php
/** @Entity */
class User
{
/** @Embedded(class = "Address", columnPrefix = false) */
private Address $address;
}
.. code-block:: xml
<entity name="User">
<embedded name="address" class="Address" use-column-prefix="false" />
</entity>
.. code-block:: yaml
User:
type: entity
embedded:
address:
class: Address
columnPrefix: false
DQL
---

View File

@@ -17,6 +17,7 @@ can be called without triggering a full load of the collection:
- ``Collection#contains($entity)``
- ``Collection#containsKey($key)``
- ``Collection#count()``
- ``Collection#first()``
- ``Collection#get($key)``
- ``Collection#isEmpty()``
- ``Collection#slice($offset, $length = null)``
@@ -66,23 +67,6 @@ switch to extra lazy as shown in these examples:
public Collection $users;
}
.. code-block:: annotation
<?php
namespace Doctrine\Tests\Models\CMS;
/**
* @Entity
*/
class CmsGroup
{
/**
* @ManyToMany(targetEntity="CmsUser", mappedBy="groups", fetch="EXTRA_LAZY")
* @var Collection<int, CmsUser>
*/
public Collection $users;
}
.. code-block:: xml
<?xml version="1.0" encoding="UTF-8"?>
@@ -96,14 +80,3 @@ switch to extra lazy as shown in these examples:
<many-to-many field="users" target-entity="CmsUser" mapped-by="groups" fetch="EXTRA_LAZY" />
</entity>
</doctrine-mapping>
.. code-block:: yaml
Doctrine\Tests\Models\CMS\CmsGroup:
type: entity
# ...
manyToMany:
users:
targetEntity: CmsUser
mappedBy: groups
fetch: EXTRA_LAZY

View File

@@ -1,26 +0,0 @@
Getting Started: Database First
===============================
.. note:: *Development Workflows*
When you :doc:`Code First <getting-started>`, you
start with developing Objects and then map them onto your database. When
you :doc:`Model First <getting-started-models>`, you are modelling your application using tools (for
example UML) and generate database schema and PHP code from this model.
When you have a Database First, you already have a database schema
and generate the corresponding PHP code from it.
.. note::
This getting started guide is in development.
Development of new applications often starts with an existing database schema.
When the database schema is the starting point for your application, then
development is said to use the *Database First* approach to Doctrine.
In this workflow you would modify the database schema first and then
regenerate the PHP code to use with this schema. You need a flexible
code-generator for this task.
We spun off a subproject, Doctrine CodeGenerator, that will fill this gap and
allow you to do *Database First* development.

View File

@@ -1,24 +0,0 @@
Getting Started: Model First
============================
.. note:: *Development Workflows*
When you :doc:`Code First <getting-started>`, you
start with developing Objects and then map them onto your database. When
you Model First, you are modelling your application using tools (for
example UML) and generate database schema and PHP code from this model.
When you have a :doc:`Database First <getting-started-database>`, then you already have a database schema
and generate the corresponding PHP code from it.
.. note::
This getting started guide is in development.
There are applications when you start with a high-level description of the
model using modelling tools such as UML. Modelling tools could also be Excel,
XML or CSV files that describe the model in some structured way. If your
application is using a modelling tool, then the development workflow is said to
be a *Model First* approach to Doctrine2.
In this workflow you always change the model description and then regenerate
both PHP code and database schema from this model.

View File

@@ -27,7 +27,7 @@ What is Doctrine?
-----------------
Doctrine ORM is an `object-relational mapper (ORM) <https://en.wikipedia.org/wiki/Object-relational_mapping>`_
for PHP 7.1+ that provides transparent persistence for PHP objects. It uses the Data Mapper
for PHP that provides transparent persistence for PHP objects. It uses the Data Mapper
pattern at the heart, aiming for a complete separation of your domain/business
logic from the persistence in a relational database management system.
@@ -49,8 +49,9 @@ An entity contains persistable properties. A persistable property
is an instance variable of the entity that is saved into and retrieved from the database
by Doctrine's data mapping capabilities.
An entity class must not be final nor read-only, although
it can contain final methods or read-only properties.
An entity class can be final or read-only when you use
:ref:`native lazy objects <reference-native-lazy-objects>`.
It may contain final methods or read-only properties too.
An Example Model: Bug Tracker
-----------------------------
@@ -82,10 +83,9 @@ that directory with the following contents:
{
"require": {
"doctrine/orm": "^2.11.0",
"doctrine/dbal": "^3.2",
"symfony/yaml": "^5.4",
"symfony/cache": "^5.4"
"doctrine/orm": "^3",
"doctrine/dbal": "^4",
"symfony/cache": "^7"
},
"autoload": {
"psr-0": {"": "src/"}
@@ -107,12 +107,8 @@ Add the following directories::
doctrine2-tutorial
|-- config
| `-- xml
| `-- yaml
`-- src
.. note::
The YAML driver is deprecated and will be removed in version 3.0.
It is strongly recommended to switch to one of the other mappings.
.. note::
It is strongly recommended that you require ``doctrine/dbal`` in your
``composer.json`` as well, because using the ORM means mapping objects
@@ -143,23 +139,15 @@ step:
require_once "vendor/autoload.php";
// Create a simple "default" Doctrine ORM configuration for Attributes
$config = ORMSetup::createAttributeMetadataConfiguration(
$config = ORMSetup::createAttributeMetadataConfig( // on PHP < 8.4, use ORMSetup::createAttributeMetadataConfiguration()
paths: [__DIR__ . '/src'],
isDevMode: true,
);
// or if you prefer annotation, YAML or XML
// $config = ORMSetup::createAnnotationMetadataConfiguration(
// paths: array(__DIR__."/src"),
// isDevMode: true,
// );
// $config = ORMSetup::createXMLMetadataConfiguration(
// or if you prefer XML
// $config = ORMSetup::createXMLMetadataConfig( // on PHP < 8.4, use ORMSetup::createXMLMetadataConfiguration()
// paths: [__DIR__ . '/config/xml'],
// isDevMode: true,
//);
// $config = ORMSetup::createYAMLMetadataConfiguration(
// paths: array(__DIR__."/config/yaml"),
// isDevMode: true,
// );
// configuring the database connection
$connection = DriverManager::getConnection([
@@ -170,10 +158,6 @@ step:
// obtaining the entity manager
$entityManager = new EntityManager($connection, $config);
.. note::
The YAML driver is deprecated and will be removed in version 3.0.
It is strongly recommended to switch to one of the other mappings.
The ``require_once`` statement sets up the class autoloading for Doctrine and
its dependencies using Composer's autoloader.
@@ -500,8 +484,8 @@ language describes how entities, their properties and references should be
persisted and what constraints should be applied to them.
Metadata for an Entity can be configured using attributes directly in
the Entity class itself, or in an external XML or YAML file. This
Getting Started guide will demonstrate metadata mappings using all three
the Entity class itself, or in an external XML file. This
Getting Started guide will demonstrate metadata mappings using both
methods, but you only need to choose one.
.. configuration-block::
@@ -527,33 +511,6 @@ methods, but you only need to choose one.
// .. (other code)
}
.. code-block:: annotation
<?php
// src/Product.php
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="products")
*/
class Product
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
private int|null $id = null;
/**
* @ORM\Column(type="string")
*/
private string $name;
// .. (other code)
}
.. code-block:: xml
<!-- config/xml/Product.dcm.xml -->
@@ -571,25 +528,6 @@ methods, but you only need to choose one.
</entity>
</doctrine-mapping>
.. note::
The YAML driver is deprecated and will be removed in version 3.0.
It is strongly recommended to switch to one of the other mappings.
.. code-block:: yaml
# config/yaml/Product.dcm.yml
Product:
type: entity
table: products
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
type: string
The top-level ``entity`` definition specifies information about
the class and table name. The primitive type ``Product#name`` is
defined as a ``field`` attribute. The ``id`` property is defined with
@@ -597,7 +535,7 @@ the ``id`` tag. It has a ``generator`` tag nested inside, which
specifies that the primary key generation mechanism should automatically
use the database platform's native id generation strategy (for
example, AUTO INCREMENT in the case of MySql, or Sequences in the
case of PostgreSql and Oracle).
case of PostgreSQL and Oracle).
Now that we have defined our first entity and its metadata,
let's update the database schema:
@@ -1082,59 +1020,6 @@ the ``Product`` before:
// ... (other code)
}
.. code-block:: annotation
<?php
// src/Bug.php
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="bugs")
*/
class Bug
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
private int|null $id = null;
/**
* @ORM\Column(type="string")
*/
private string $description;
/**
* @ORM\Column(type="datetime")
*/
private DateTime $created;
/**
* @ORM\Column(type="string")
*/
private string $status;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="assignedBugs")
*/
private User|null $engineer;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="reportedBugs")
*/
private User|null $reporter;
/**
* @ORM\ManyToMany(targetEntity="Product")
*/
private Collection $products;
// ... (other code)
}
.. code-block:: xml
<!-- config/xml/Bug.dcm.xml -->
@@ -1159,40 +1044,6 @@ the ``Product`` before:
</entity>
</doctrine-mapping>
.. note::
The YAML driver is deprecated and will be removed in version 3.0.
It is strongly recommended to switch to one of the other mappings.
.. code-block:: yaml
# config/yaml/Bug.dcm.yml
Bug:
type: entity
table: bugs
id:
id:
type: integer
generator:
strategy: AUTO
fields:
description:
type: text
created:
type: datetime
status:
type: string
manyToOne:
reporter:
targetEntity: User
inversedBy: reportedBugs
engineer:
targetEntity: User
inversedBy: assignedBugs
manyToMany:
products:
targetEntity: Product
Here we have the entity, id and primitive type definitions.
For the "created" field we have used the ``datetime`` type,
which translates the YYYY-mm-dd HH:mm:ss database format
@@ -1249,47 +1100,6 @@ Finally, we'll add metadata mappings for the ``User`` entity.
// .. (other code)
}
.. code-block:: annotation
<?php
// src/User.php
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="users")
*/
class User
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @var int
*/
private int|null $id = null;
/**
* @ORM\Column(type="string")
* @var string
*/
private string $name;
/**
* @ORM\OneToMany(targetEntity="Bug", mappedBy="reporter")
* @var Collection<int, Bug> An ArrayCollection of Bug objects.
*/
private Collection $reportedBugs;
/**
* @ORM\OneToMany(targetEntity="Bug", mappedBy="engineer")
* @var Collection<int, Bug> An ArrayCollection of Bug objects.
*/
private Collection $assignedBugs;
// .. (other code)
}
.. code-block:: xml
<!-- config/xml/User.dcm.xml -->
@@ -1310,33 +1120,7 @@ Finally, we'll add metadata mappings for the ``User`` entity.
</entity>
</doctrine-mapping>
.. note::
The YAML driver is deprecated and will be removed in version 3.0.
It is strongly recommended to switch to one of the other mappings.
.. code-block:: yaml
# config/yaml/User.dcm.yml
User:
type: entity
table: users
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
type: string
oneToMany:
reportedBugs:
targetEntity: Bug
mappedBy: reporter
assignedBugs:
targetEntity: Bug
mappedBy: engineer
Here are some new things to mention about the ``OneToMany`` attribute.
Here are some new things to mention about the ``one-to-many`` tags.
Remember that we discussed about the inverse and owning side. Now
both reportedBugs and assignedBugs are inverse relations, which
means the join details have already been defined on the owning
@@ -1504,7 +1288,7 @@ The console output of this script is then:
result set to retrieve entities from the database. DQL boils down to a
Native SQL statement and a ``ResultSetMapping`` instance itself. Using
Native SQL you could even use stored procedures for data retrieval, or
make use of advanced non-portable database queries like PostgreSql's
make use of advanced non-portable database queries like PostgreSQL's
recursive queries.
@@ -1800,21 +1584,6 @@ we have to adjust the metadata slightly.
// ...
}
.. code-block:: annotation
<?php
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="BugRepository")
* @ORM\Table(name="bugs")
*/
class Bug
{
// ...
}
.. code-block:: xml
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
@@ -1827,16 +1596,6 @@ we have to adjust the metadata slightly.
</entity>
</doctrine-mapping>
.. note::
The YAML driver is deprecated and will be removed in version 3.0.
It is strongly recommended to switch to one of the other mappings.
.. code-block:: yaml
Bug:
type: entity
repositoryClass: BugRepository
Now we can remove our query logic in all the places and instead use them through the EntityRepository.
As an example here is the code of the first use case "List of Bugs":

View File

@@ -27,22 +27,6 @@ can specify the ``#[OrderBy]`` in the following way:
private Collection $groups;
}
.. code-block:: annotation
<?php
/** @Entity **/
class User
{
// ...
/**
* @ManyToMany(targetEntity="Group")
* @OrderBy({"name" = "ASC"})
* @var Collection<int, Group>
*/
private Collection $groups;
}
.. code-block:: xml
<doctrine-mapping>
@@ -55,23 +39,6 @@ can specify the ``#[OrderBy]`` in the following way:
</entity>
</doctrine-mapping>
.. code-block:: yaml
User:
type: entity
manyToMany:
groups:
orderBy: { 'name': 'ASC' }
targetEntity: Group
joinTable:
name: users_groups
joinColumns:
user_id:
referencedColumnName: id
inverseJoinColumns:
group_id:
referencedColumnName: id
The DQL Snippet in OrderBy is only allowed to consist of
unqualified, unquoted field names and of an optional ASC/DESC
positional statement. Multiple Fields are separated by a comma (,).

View File

@@ -64,7 +64,7 @@ which has mapping metadata that is overridden by the attribute above:
#[Column(name: 'trait_foo', type: 'integer', length: 100, nullable: true, unique: true)]
protected int $foo;
#[OneToOne(targetEntity: Bar::class, cascade: ['persist', 'merge'])]
#[OneToOne(targetEntity: Bar::class, cascade: ['persist'])]
#[JoinColumn(name: 'example_trait_bar_id', referencedColumnName: 'id')]
protected Bar|null $bar = null;
}
@@ -79,4 +79,4 @@ The case for just extending a class would be just the same but:
// ...
}
Overriding is also supported via XML and YAML (:ref:`examples <inheritence_mapping_overrides>`).
Overriding is also supported via XML (:ref:`examples <inheritence_mapping_overrides>`).

View File

@@ -24,9 +24,7 @@ Mapping Indexed Associations
You can map indexed associations by adding:
* ``indexBy`` argument to any ``#[OneToMany]`` or ``#[ManyToMany]`` attribute.
* ``indexBy`` attribute to any ``@OneToMany`` or ``@ManyToMany`` annotation.
* ``index-by`` attribute to any ``<one-to-many />`` or ``<many-to-many />`` xml element.
* ``indexBy:`` key-value pair to any association defined in ``manyToMany:`` or ``oneToMany:`` YAML mapping files.
The code and mappings for the Market entity looks like this:
@@ -34,16 +32,9 @@ The code and mappings for the Market entity looks like this:
.. literalinclude:: working-with-indexed-associations/Market.php
:language: attribute
.. literalinclude:: working-with-indexed-associations/Market-annotations.php
:language: annotation
.. literalinclude:: working-with-indexed-associations/market.xml
:language: xml
.. literalinclude:: working-with-indexed-associations/market.yaml
:language: yaml
Inside the ``addStock()`` method you can see how we directly set the key of the association to the symbol,
so that we can work with the indexed association directly after invoking ``addStock()``. Inside ``getStock($symbol)``
we pick a stock traded on the particular market by symbol. If this stock doesn't exist an exception is thrown.
@@ -83,47 +74,6 @@ here are the code and mappings for it:
}
}
.. code-block:: annotation
<?php
namespace Doctrine\Tests\Models\StockExchange;
/**
* @Entity
* @Table(name="exchange_stocks")
*/
class Stock
{
/**
* @Id @GeneratedValue @Column(type="integer")
* @var int
*/
private int|null $id = null;
/**
* @Column(type="string", unique=true)
*/
private string $symbol;
/**
* @ManyToOne(targetEntity="Market", inversedBy="stocks")
* @var Market
*/
private Market|null $market = null;
public function __construct($symbol, Market $market)
{
$this->symbol = $symbol;
$this->market = $market;
$market->addStock($this);
}
public function getSymbol(): string
{
return $this->symbol;
}
}
.. code-block:: xml
<?xml version="1.0" encoding="UTF-8"?>
@@ -142,23 +92,6 @@ here are the code and mappings for it:
</entity>
</doctrine-mapping>
.. code-block:: yaml
Doctrine\Tests\Models\StockExchange\Stock:
type: entity
id:
id:
type: integer
generator:
strategy: AUTO
fields:
symbol:
type: string
manyToOne:
market:
targetEntity: Market
inversedBy: stocks
Querying indexed associations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -1,74 +0,0 @@
<?php
namespace Doctrine\Tests\Models\StockExchange;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\GeneratedValue;
use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\OneToMany;
use Doctrine\ORM\Mapping\Table;
use InvalidArgumentException;
/**
* @Entity
* @Table(name="exchange_markets")
*/
class Market
{
/**
* @Id @Column(type="integer") @GeneratedValue
* @var int
*/
private int|null $id = null;
/**
* @Column(type="string")
* @var string
*/
private string $name;
/**
* @OneToMany(targetEntity="Stock", mappedBy="market", indexBy="symbol")
* @var Collection<int, Stock>
*/
private Collection $stocks;
public function __construct($name)
{
$this->name = $name;
$this->stocks = new ArrayCollection();
}
public function getId(): int|null
{
return $this->id;
}
public function getName(): string
{
return $this->name;
}
public function addStock(Stock $stock): void
{
$this->stocks[$stock->getSymbol()] = $stock;
}
public function getStock($symbol): Stock
{
if (!isset($this->stocks[$symbol])) {
throw new InvalidArgumentException("Symbol is not traded on this market.");
}
return $this->stocks[$symbol];
}
/** @return array<string, Stock> */
public function getStocks(): array
{
return $this->stocks->toArray();
}
}

View File

@@ -1,15 +0,0 @@
Doctrine\Tests\Models\StockExchange\Market:
type: entity
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
type:string
oneToMany:
stocks:
targetEntity: Stock
mappedBy: market
indexBy: symbol

View File

@@ -35,7 +35,6 @@
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="cascade-all" type="orm:emptyType" minOccurs="0"/>
<xs:element name="cascade-persist" type="orm:emptyType" minOccurs="0"/>
<xs:element name="cascade-merge" type="orm:emptyType" minOccurs="0"/>
<xs:element name="cascade-remove" type="orm:emptyType" minOccurs="0"/>
<xs:element name="cascade-refresh" type="orm:emptyType" minOccurs="0"/>
<xs:element name="cascade-detach" type="orm:emptyType" minOccurs="0"/>
@@ -82,36 +81,6 @@
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="named-query">
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="query" type="xs:string" use="required" />
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="named-queries">
<xs:sequence>
<xs:element name="named-query" type="orm:named-query" minOccurs="1" maxOccurs="unbounded" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="named-native-query">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="query" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="result-class" type="orm:fqcn" />
<xs:attribute name="result-set-mapping" type="xs:string" />
</xs:complexType>
<xs:complexType name="named-native-queries">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="named-native-query" type="orm:named-native-query" minOccurs="1" maxOccurs="unbounded" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="entity-listener">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="lifecycle-callback" type="orm:lifecycle-callback" minOccurs="0" maxOccurs="unbounded"/>
@@ -143,23 +112,6 @@
<xs:attribute name="discriminator-column" type="xs:string" use="optional" />
</xs:complexType>
<xs:complexType name="sql-result-set-mapping">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="entity-result" type="orm:entity-result"/>
<xs:element name="column-result" type="orm:column-result"/>
</xs:choice>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
<xs:complexType name="sql-result-set-mappings">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="sql-result-set-mapping" type="orm:sql-result-set-mapping" minOccurs="1" maxOccurs="unbounded" />
</xs:choice>
</xs:complexType>
<xs:complexType name="cache">
<xs:attribute name="usage" type="orm:cache-usage-type" />
<xs:attribute name="region" type="xs:string" />
@@ -175,9 +127,6 @@
<xs:element name="discriminator-map" type="orm:discriminator-map" minOccurs="0"/>
<xs:element name="lifecycle-callbacks" type="orm:lifecycle-callbacks" minOccurs="0" maxOccurs="1" />
<xs:element name="entity-listeners" type="orm:entity-listeners" minOccurs="0" maxOccurs="1" />
<xs:element name="named-queries" type="orm:named-queries" minOccurs="0" maxOccurs="1" />
<xs:element name="named-native-queries" type="orm:named-native-queries" minOccurs="0" maxOccurs="1" />
<xs:element name="sql-result-set-mappings" type="orm:sql-result-set-mappings" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="id" type="orm:id" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="field" type="orm:field" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="embedded" type="orm:embedded" minOccurs="0" maxOccurs="unbounded"/>
@@ -239,7 +188,6 @@
<xs:restriction base="xs:token">
<xs:enumeration value="DEFERRED_IMPLICIT"/>
<xs:enumeration value="DEFERRED_EXPLICIT"/>
<xs:enumeration value="NOTIFY"/>
</xs:restriction>
</xs:simpleType>
@@ -247,7 +195,6 @@
<xs:restriction base="xs:token">
<xs:enumeration value="SINGLE_TABLE"/>
<xs:enumeration value="JOINED"/>
<xs:enumeration value="TABLE_PER_CLASS"/>
</xs:restriction>
</xs:simpleType>
@@ -257,7 +204,6 @@
<xs:enumeration value="SEQUENCE"/>
<xs:enumeration value="IDENTITY"/>
<xs:enumeration value="AUTO"/>
<xs:enumeration value="UUID"/>
<xs:enumeration value="CUSTOM" />
</xs:restriction>
</xs:simpleType>
@@ -297,6 +243,7 @@
<xs:attribute name="length" type="xs:NMTOKEN" />
<xs:attribute name="unique" type="xs:boolean" default="false" />
<xs:attribute name="nullable" type="xs:boolean" default="false" />
<xs:attribute name="index" type="xs:boolean" default="false" />
<xs:attribute name="insertable" type="xs:boolean" default="true" />
<xs:attribute name="updatable" type="xs:boolean" default="true" />
<xs:attribute name="generated" type="orm:generated-type" default="NEVER" />

View File

@@ -11,7 +11,7 @@
<!-- Ignore warnings, show progress of the run and show sniff names -->
<arg value="nps"/>
<config name="php_version" value="70100"/>
<config name="php_version" value="80100"/>
<file>src</file>
<file>tests</file>
@@ -20,38 +20,38 @@
<exclude-pattern>*/tests/Tests/ORM/Tools/Export/export/*</exclude-pattern>
<rule ref="Doctrine">
<exclude name="SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingAnyTypeHint" />
<exclude name="SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingReturnTypeHint"/>
<exclude name="SlevomatCodingStandard.TypeHints.PropertyTypeHint.MissingNativeTypeHint" />
<exclude name="SlevomatCodingStandard.Exceptions.ReferenceThrowableOnly.ReferencedGeneralException"/>
<exclude name="SlevomatCodingStandard.ControlStructures.EarlyExit"/>
<exclude name="SlevomatCodingStandard.Classes.SuperfluousAbstractClassNaming"/>
<exclude name="SlevomatCodingStandard.Classes.SuperfluousExceptionNaming"/>
</rule>
<rule ref="SlevomatCodingStandard.Commenting.RequireOneLineDocComment.MultiLineDocComment">
<!-- Remove when dropping PHPUnit 7 -->
<exclude-pattern>*/tests/*</exclude-pattern>
<exclude name="SlevomatCodingStandard.Classes.ModernClassNameReference.ClassNameReferencedViaFunctionCall"/>
</rule>
<rule ref="SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint">
<exclude-pattern>*/src/*</exclude-pattern>
<!--
that class extends another one inside src/ and can therefore not
have more native typehints since its parent cannot have them: that
would break signature compatibility.
-->
<exclude-pattern>tests/Tests/Mocks/HydratorMockStatement.php</exclude-pattern>
<exclude-pattern>tests/Tests/Models/Cache/ComplexAction.php</exclude-pattern>
<exclude-pattern>tests/Tests/Models/DDC117/DDC117ArticleDetails.php</exclude-pattern>
<exclude-pattern>tests/Tests/Models/DDC117/DDC117Translation.php</exclude-pattern>
<exclude-pattern>tests/Tests/ORM/Functional/Ticket/DDC2579Test.php</exclude-pattern>
<exclude-pattern>tests/Tests/ORM/Functional/ValueObjectsTest.php</exclude-pattern>
</rule>
<rule ref="SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint">
<exclude-pattern>*/src/*</exclude-pattern>
<rule ref="SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingAnyTypeHint">
<exclude-pattern>tests/*</exclude-pattern>
</rule>
<rule ref="SlevomatCodingStandard.TypeHints.PropertyTypeHint.MissingNativeTypeHint">
<exclude-pattern>tests/*</exclude-pattern>
</rule>
<rule ref="PSR1.Classes.ClassDeclaration.MultipleClasses">
<exclude-pattern>src/Mapping/Driver/CompatibilityAnnotationDriver.php</exclude-pattern>
<exclude-pattern>src/Tools/Console/CommandCompatibility.php</exclude-pattern>
<exclude-pattern>src/Tools/Console/Helper/EntityManagerHelper.php</exclude-pattern>
<exclude-pattern>src/Mapping/Driver/LoadMappingFileImplementation.php</exclude-pattern>
<exclude-pattern>src/Mapping/GetReflectionClassImplementation.php</exclude-pattern>
<exclude-pattern>tests/*</exclude-pattern>
</rule>
@@ -70,14 +70,6 @@
<exclude-pattern>src/Tools/ToolEvents.php</exclude-pattern>
</rule>
<rule ref="SlevomatCodingStandard.TypeHints.PropertyTypeHint.MissingTraversableTypeHintSpecification">
<!-- https://github.com/doctrine/annotations/issues/129 -->
<exclude-pattern>src/Mapping/Column.php</exclude-pattern>
<exclude-pattern>src/Mapping/Index.php</exclude-pattern>
<exclude-pattern>src/Mapping/Table.php</exclude-pattern>
<exclude-pattern>src/Mapping/UniqueConstraint.php</exclude-pattern>
</rule>
<rule ref="SlevomatCodingStandard.Operators.DisallowEqualOperators.DisallowedNotEqualOperator">
<exclude-pattern>src/Internal/Hydration/AbstractHydrator.php</exclude-pattern>
</rule>
@@ -94,7 +86,6 @@
<exclude-pattern>src/Mapping/Cache.php</exclude-pattern>
<exclude-pattern>src/Mapping/ChangeTrackingPolicy.php</exclude-pattern>
<exclude-pattern>src/Mapping/Column.php</exclude-pattern>
<exclude-pattern>src/Mapping/ColumnResult.php</exclude-pattern>
<exclude-pattern>src/Mapping/CustomIdGenerator.php</exclude-pattern>
<exclude-pattern>src/Mapping/DiscriminatorColumn.php</exclude-pattern>
<exclude-pattern>src/Mapping/DiscriminatorMap.php</exclude-pattern>
@@ -102,8 +93,6 @@
<exclude-pattern>src/Mapping/Embedded.php</exclude-pattern>
<exclude-pattern>src/Mapping/Entity.php</exclude-pattern>
<exclude-pattern>src/Mapping/EntityListeners.php</exclude-pattern>
<exclude-pattern>src/Mapping/EntityResult.php</exclude-pattern>
<exclude-pattern>src/Mapping/FieldResult.php</exclude-pattern>
<exclude-pattern>src/Mapping/GeneratedValue.php</exclude-pattern>
<exclude-pattern>src/Mapping/HasLifecycleCallbacks.php</exclude-pattern>
<exclude-pattern>src/Mapping/Id.php</exclude-pattern>
@@ -115,10 +104,6 @@
<exclude-pattern>src/Mapping/ManyToMany.php</exclude-pattern>
<exclude-pattern>src/Mapping/ManyToOne.php</exclude-pattern>
<exclude-pattern>src/Mapping/MappedSuperclass.php</exclude-pattern>
<exclude-pattern>src/Mapping/NamedNativeQueries.php</exclude-pattern>
<exclude-pattern>src/Mapping/NamedNativeQuery.php</exclude-pattern>
<exclude-pattern>src/Mapping/NamedQueries.php</exclude-pattern>
<exclude-pattern>src/Mapping/NamedQuery.php</exclude-pattern>
<exclude-pattern>src/Mapping/OneToMany.php</exclude-pattern>
<exclude-pattern>src/Mapping/OneToOne.php</exclude-pattern>
<exclude-pattern>src/Mapping/OrderBy.php</exclude-pattern>
@@ -131,8 +116,6 @@
<exclude-pattern>src/Mapping/PreRemove.php</exclude-pattern>
<exclude-pattern>src/Mapping/PreUpdate.php</exclude-pattern>
<exclude-pattern>src/Mapping/SequenceGenerator.php</exclude-pattern>
<exclude-pattern>src/Mapping/SqlResultSetMapping.php</exclude-pattern>
<exclude-pattern>src/Mapping/SqlResultSetMappings.php</exclude-pattern>
<exclude-pattern>src/Mapping/Table.php</exclude-pattern>
<exclude-pattern>src/Mapping/UniqueConstraint.php</exclude-pattern>
<exclude-pattern>src/Mapping/Version.php</exclude-pattern>
@@ -142,6 +125,36 @@
<exclude-pattern>src/Cache/DefaultQueryCache.php</exclude-pattern>
</rule>
<rule ref="SlevomatCodingStandard.Commenting.ForbiddenAnnotations">
<properties>
<property name="forbiddenAnnotations" type="array">
<!--
From Doctrine Coding Standard:
Forbid useless annotations - Git and LICENCE file provide more accurate information
-->
<element value="@api"/>
<element value="@author"/>
<element value="@category"/>
<element value="@copyright"/>
<element value="@created"/>
<element value="@license"/>
<element value="@package"/>
<element value="@since"/>
<element value="@subpackage"/>
<element value="@version"/>
<!-- Additionally forbid oldschool PHPUnit annotations to force the usage of attributes -->
<element value="@covers"/>
<element value="@depends"/>
<element value="@dataProvider"/>
<element value="@group"/>
<element value="@requires"/>
<element value="@test"/>
<element value="@testWith"/>
</property>
</properties>
</rule>
<rule ref="SlevomatCodingStandard.Classes.SuperfluousInterfaceNaming">
<exclude-pattern>src/EntityManagerInterface.php</exclude-pattern>
</rule>
@@ -197,9 +210,6 @@
<exclude-pattern>tests/Tests/Models/DDC1590/DDC1590User.php</exclude-pattern>
</rule>
<rule ref="SlevomatCodingStandard.Commenting.ForbiddenAnnotations.AnnotationForbidden">
<exclude-pattern>tests/Tests/ORM/Functional/Ticket/DDC832Test.php</exclude-pattern>
</rule>
<rule ref="Squiz.Classes.ValidClassName.NotCamelCaps">
<!-- we need to test what happens with an stdClass proxy -->
@@ -224,12 +234,11 @@
<rule ref="PSR2.Methods.MethodDeclaration.Underscore">
<exclude-pattern>src/AbstractQuery.php</exclude-pattern>
<exclude-pattern>src/Mapping/ClassMetadataInfo.php</exclude-pattern>
<exclude-pattern>src/Mapping/ClassMetadata.php</exclude-pattern>
<exclude-pattern>src/NativeQuery.php</exclude-pattern>
<exclude-pattern>src/Query.php</exclude-pattern>
<exclude-pattern>src/Query/TreeWalkerAdapter.php</exclude-pattern>
<exclude-pattern>src/Tools/Export/Driver/AbstractExporter.php</exclude-pattern>
<exclude-pattern>src/Tools/Export/Driver/AnnotationExporter.php</exclude-pattern>
<exclude-pattern>src/Tools/Export/Driver/PhpExporter.php</exclude-pattern>
<!-- extending a class from another package -->
<exclude-pattern>tests/Tests/Mocks/DatabasePlatformMock.php</exclude-pattern>
@@ -239,20 +248,6 @@
</rule>
<rule ref="Squiz.NamingConventions.ValidVariableName.PublicHasUnderscore">
<exclude-pattern>src/AbstractQuery.php</exclude-pattern>
<exclude-pattern>src/Configuration.php</exclude-pattern>
<exclude-pattern>src/EntityRepository.php</exclude-pattern>
<exclude-pattern>src/Internal/Hydration/AbstractHydrator.php</exclude-pattern>
<exclude-pattern>src/Query/Exec/AbstractSqlExecutor.php</exclude-pattern>
<exclude-pattern>src/Query/Exec/AbstractSqlExecutor.php</exclude-pattern>
<exclude-pattern>src/Query/Printer.php</exclude-pattern>
<exclude-pattern>src/Tools/EntityRepositoryGenerator.php</exclude-pattern>
<exclude-pattern>src/Tools/Console/Helper/EntityManagerHelper.php</exclude-pattern>
<exclude-pattern>src/Tools/Export/Driver/AbstractExporter.php</exclude-pattern>
<exclude-pattern>src/Tools/Export/Driver/AnnotationExporter.php</exclude-pattern>
<exclude-pattern>src/Tools/Export/Driver/PhpExporter.php</exclude-pattern>
<exclude-pattern>src/Tools/Export/Driver/XmlExporter.php</exclude-pattern>
<exclude-pattern>src/Tools/Export/Driver/YamlExporter.php</exclude-pattern>
<!-- the impact of changing this would be too big -->
<exclude-pattern>tests/Tests/OrmFunctionalTestCase.php</exclude-pattern>
</rule>
@@ -267,6 +262,7 @@
<!-- Using @group and Group entity in the same file -->
<exclude-pattern>tests/Tests/ORM/Functional/Ticket/DDC1885Test.php</exclude-pattern>
<exclude-pattern>tests/Tests/ORM/Functional/Ticket/DDC1843Test.php</exclude-pattern>
<exclude-pattern>tests/Tests/ORM/Mapping/ClassMetadataFactoryTest.php</exclude-pattern>
</rule>
<rule ref="Generic.CodeAnalysis.EmptyStatement.DetectedElse">
@@ -281,9 +277,4 @@
<!-- https://github.com/doctrine/orm/issues/8537 -->
<exclude-pattern>src/QueryBuilder.php</exclude-pattern>
</rule>
<rule ref="SlevomatCodingStandard.PHP.UselessParentheses">
<!-- We need those parentheses to make enum access seem like valid syntax on PHP 7 -->
<exclude-pattern>src/Mapping/Driver/XmlDriver.php</exclude-pattern>
</rule>
</ruleset>

File diff suppressed because it is too large Load Diff

View File

@@ -1,122 +0,0 @@
includes:
- phpstan-baseline.neon
- phpstan-params.neon
parameters:
reportUnmatchedIgnoredErrors: false
ignoreErrors:
# PHPStan doesn't understand our method_exists() safeguards.
- '/Call to function method_exists.*/'
- '/Call to an undefined method Doctrine\\DBAL\\Connection::createSchemaManager\(\)\./'
# Class name will change in DBAL 3.
- '/^Class Doctrine\\DBAL\\Platforms\\PostgreSQLPlatform not found\.$/'
- '/^Class Doctrine\\DBAL\\Platforms\\AbstractMySQLPlatform not found\.$/'
- '/^Class Doctrine\\DBAL\\Platforms\\MySQLPlatform not found\.$/'
-
message: '/Doctrine\\DBAL\\Platforms\\MyS(ql|QL)Platform/'
path: src/Mapping/ClassMetadataFactory.php
# Forward compatibility for DBAL 3.5
- '/^Call to an undefined method Doctrine\\DBAL\\Platforms\\AbstractPlatform::getAlterSchemaSQL\(\).$/'
# Forward compatibility for DBAL 3.4
- '/^Call to an undefined method Doctrine\\DBAL\\Cache\\QueryCacheProfile::[gs]etResultCache\(\)\.$/'
-
message: '/^Call to an undefined static method Doctrine\\DBAL\\Configuration::[gs]etResultCache\(\)\.$/'
path: src/Configuration.php
-
message: '/^Parameter #3 \$resultCache of class Doctrine\\DBAL\\Cache\\QueryCacheProfile constructor/'
path: src/AbstractQuery.php
-
message: '/^Parameter #2 \$\w+ of method Doctrine\\DBAL\\Platforms\\AbstractPlatform::getDateAdd\w+Expression\(\) expects int, string given\.$/'
path: src/Query/AST/Functions/DateAddFunction.php
-
message: '/^Parameter #2 \$\w+ of method Doctrine\\DBAL\\Platforms\\AbstractPlatform::getDateSub\w+Expression\(\) expects int, string given\.$/'
path: src/Query/AST/Functions/DateSubFunction.php
# False positive
-
message: '/^Call to an undefined method Doctrine\\Common\\Cache\\Cache::deleteAll\(\)\.$/'
count: 1
path: src/Tools/Console/Command/ClearCache/ResultCommand.php
# See https://github.com/doctrine/dbal/pull/5129
-
message: '/^Parameter #3 \$startPos of method Doctrine\\DBAL\\Platforms\\AbstractPlatform::getLocateExpression\(\) expects int\|false, string given\.$/'
count: 1
path: src/Query/AST/Functions/LocateFunction.php
# Won't get fixed in DBAL 2
-
message: '#.*deleteItem.*expects string.*#'
count: 1
path: src/Query.php
-
message: '#.*get(Drop|Create)SchemaS(ql|QL).*should return list.*but returns array.*#'
count: 2
path: src/Tools/SchemaTool.php
-
message: '#introspectSchema#'
count: 2
identifier: 'method.notFound'
path: src/Tools/SchemaTool.php
-
message: '#getMaxIdentifierLength#'
identifier: 'method.deprecatedClass'
path: src/Mapping/ClassMetadataFactory.php
-
message: "#^Parameter \\#2 \\$start of method Doctrine\\\\DBAL\\\\Platforms\\\\AbstractPlatform\\:\\:getSubstringExpression\\(\\) expects int, string given\\.$#"
count: 1
path: src/Query/AST/Functions/SubstringFunction.php
-
message: "#^Parameter \\#3 \\$length of method Doctrine\\\\DBAL\\\\Platforms\\\\AbstractPlatform\\:\\:getSubstringExpression\\(\\) expects int\\|null, string\\|null given\\.$#"
count: 1
path: src/Query/AST/Functions/SubstringFunction.php
-
message: '#^Class Doctrine\\DBAL\\Platforms\\MySQLPlatform not found\.$#'
count: 2
path: src/Mapping/ClassMetadataFactory.php
- '~^Call to deprecated method getSQLResultCasing\(\) of class Doctrine\\DBAL\\Platforms\\AbstractPlatform\.$~'
-
message: '~deprecated class Doctrine\\DBAL\\Tools\\Console\\Command\\ImportCommand\:~'
path: src/Tools/Console/ConsoleRunner.php
-
message: '#^Method Doctrine\\ORM\\AbstractQuery\:\:getHydrationCacheId\(\) should return array\{string, string\} but returns array\<string\>\.$#'
path: src/AbstractQuery.php
-
message: '#^Method Doctrine\\ORM\\Internal\\Hydration\\AbstractHydrator\:\:\w+\(\) has parameter \$stmt with no value type specified in iterable type Doctrine\\DBAL\\Driver\\ResultStatement\.$#'
path: src/Internal/Hydration/AbstractHydrator.php
-
message: '#^Parameter \#1 \$key of method Psr\\Cache\\CacheItemPoolInterface\:\:deleteItem\(\) expects string, string\|false given\.$#'
path: src/Query
# Symfony cache supports passing a key prefix to the clear method.
- '/^Method Psr\\Cache\\CacheItemPoolInterface\:\:clear\(\) invoked with 1 parameter, 0 required\.$/'
# Persistence 2 support
-
message: '/clear.*invoked with 1 parameter/'
path: src/EntityRepository.php
-
message: '#^Class Doctrine\\Persistence\\ObjectManagerAware not found\.$#'
path: src/UnitOfWork.php
-
message: '#^Call to method injectObjectManager\(\) on an unknown class Doctrine\\Persistence\\ObjectManagerAware\.$#'
path: src/UnitOfWork.php
-
message: '#contains generic type.*but class.*is not generic#'
paths:
- src/Mapping/Driver/XmlDriver.php
- src/Mapping/Driver/YamlDriver.php

151
phpstan-dbal3.neon Normal file
View File

@@ -0,0 +1,151 @@
includes:
- phpstan-baseline.neon
- phpstan-params.neon
parameters:
reportUnmatchedIgnoredErrors: false # Some errors in the baseline only apply to DBAL 4
ignoreErrors:
# Symfony cache supports passing a key prefix to the clear method.
- '/^Method Psr\\Cache\\CacheItemPoolInterface\:\:clear\(\) invoked with 1 parameter, 0 required\.$/'
# We can be certain that those values are not matched.
-
message: '~^Match expression does not handle remaining values:~'
path: src/Utility/PersisterHelper.php
# DBAL 4 compatibility
-
message: '~^Method Doctrine\\ORM\\Query\\AST\\Functions\\TrimFunction::getTrimMode\(\) never returns .* so it can be removed from the return type\.$~'
path: src/Query/AST/Functions/TrimFunction.php
-
message: '~.*getTrimExpression.*expects int.*~'
path: src/Query/AST/Functions/TrimFunction.php
-
message: '~^Call to static method unquoted\(\) on an unknown class Doctrine\\DBAL\\Schema\\Name\\Identifier\.$~'
path: src/Tools/SchemaTool.php
-
message: '~^Instantiated class Doctrine\\DBAL\\Schema\\Name\\UnqualifiedName not found\.$~'
path: src/Tools/SchemaTool.php
-
message: '~^Call to an undefined method Doctrine\\DBAL\\Schema\\Table::addPrimaryKeyConstraint\(\)\.$~'
path: src/Tools/SchemaTool.php
-
message: '~^Call to static method quoted\(\) on an unknown class Doctrine\\DBAL\\Schema\\Name\\Identifier\.$~'
path: src/Tools/SchemaTool.php
-
message: '~^Call to an undefined method Doctrine\\DBAL\\Schema\\Table\:\:getObjectName\(\)\.$~'
path: src/Mapping/Driver/DatabaseDriver.php
-
message: '~^Call to an undefined method Doctrine\\DBAL\\Schema\\ForeignKeyConstraint::get.*\.$~'
identifier: method.notFound
-
message: '~createComparator~'
identifier: arguments.count
-
message: '~UnqualifiedName~'
identifier: class.notFound
-
message: '~IndexedColumn~'
identifier: class.notFound
-
message: '~PrimaryKeyConstraint~'
identifier: class.notFound
-
message: '~IndexType~'
identifier: class.notFound
-
message: '~dropForeignKey~'
identifier: method.notFound
-
message: '~getIndexedColumns~'
identifier: method.notFound
-
message: '~getPrimaryKeyConstraint~'
identifier: method.notFound
-
message: '~PrimaryKeyConstraint~'
identifier: class.notFound
path: src/Tools/SchemaTool.php
-
message: '~^Call to method toString.*UnqualifiedName\.$~'
path: src/Tools/SchemaTool.php
- '~^Call to method getObjectName\(\) on an unknown class Doctrine\\DBAL\\Schema\\NamedObject\.$~'
- '~^Class Doctrine\\DBAL\\Platforms\\SQLitePlatform not found\.$~'
- '~^Class Doctrine\\DBAL\\Schema\\NamedObject not found\.$~'
-
message: '~sort~'
identifier: argument.unresolvableType
path: src/Mapping/Driver/DatabaseDriver.php
# To be removed in 4.0
-
message: '#Negated boolean expression is always false\.#'
paths:
- src/Mapping/Driver/AttributeDriver.php
-
message: '~^Call to deprecated method getEventManager\(\) of class Doctrine\\DBAL\\Connection\.$~'
path: src/EntityManager.php
-
message: '~deprecated class Doctrine\\DBAL\\Tools\\Console\\Command\\ReservedWordsCommand\:~'
path: src/Tools/Console/ConsoleRunner.php
# Compatibility with Persistence 3
-
message: '#Expression on left side of \?\? is not nullable.#'
path: src/Mapping/Driver/AttributeDriver.php
-
message: '~^Method Doctrine\\ORM\\Utility\\PersisterHelper\:\:getArrayBindingType\(\) never returns .* so it can be removed from the return type\.$~'
path: src/Utility/PersisterHelper.php
-
message: '~inferParameterTypes.*should return~'
path: src/Utility/PersisterHelper.php
-
message: '~.*appendLockHint.*expects.*LockMode given~'
paths:
- src/Persisters/Entity/BasicEntityPersister.php
- src/Persisters/Entity/JoinedSubclassPersister.php
-
message: '~.*executeStatement.*expects~'
path: src/Query/Exec/MultiTableUpdateExecutor.php
-
message: '~method_exists.*getEventManager~'
path: src/EntityManager.php
-
message: '~method_exists.*getIdentitySequence~'
path: src/Mapping/ClassMetadataFactory.php
-
message: '~expand(Criteria)?Parameters.*should return array~'
path: src/Persisters/Entity/BasicEntityPersister.php
-
message: '~inferType.*never returns~'
path: src/Query/ParameterTypeInferer.php

View File

@@ -1,118 +0,0 @@
includes:
- phpstan-baseline.neon
- phpstan-params.neon
parameters:
reportUnmatchedIgnoredErrors: false
ignoreErrors:
# deprecations from doctrine/dbal:3.x
- '/^Call to an undefined method Doctrine\\DBAL\\Platforms\\AbstractPlatform::getGuidExpression\(\).$/'
# Fallback logic for DBAL 2
-
message: '/Parameter #2 \$command of static method Doctrine\\ORM\\Tools\\Console\\ConsoleRunner\:\:addCommandToApplication\(\) expects Symfony\\Component\\Console\\Command\\Command/'
path: src/Tools/Console/ConsoleRunner.php
- '/^Class Doctrine\\DBAL\\Platforms\\SQLAnywherePlatform not found\.$/'
- '/^Call to method \w+\(\) on an unknown class Doctrine\\DBAL\\Platforms\\SQLAnywherePlatform\.$/'
-
message: '/^Call to an undefined method Doctrine\\DBAL\\Platforms\\AbstractPlatform::getSQLResultCasing\(\)\.$/'
path: src/Internal/SQLResultCasing.php
-
message: '/^Parameter \$stmt of method .* has invalid type Doctrine\\DBAL\\Driver\\ResultStatement\.$/'
path: src/Internal/Hydration/AbstractHydrator.php
-
message: '/^Class Doctrine\\DBAL\\Driver\\ResultStatement not found\.$/'
path: src/Internal/Hydration/AbstractHydrator.php
-
message: '/^Call to static method ensure\(\) on an unknown class Doctrine\\DBAL\\ForwardCompatibility\\Result\.$/'
path: src/Internal/Hydration/AbstractHydrator.php
-
message: '/^Instanceof between Doctrine\\DBAL\\Platforms\\AbstractPlatform and Doctrine\\DBAL\\Platforms\\MySQLPlatform will always evaluate to false\.$/'
path: src/Utility/LockSqlHelper.php
# Forward compatibility with Collections 3
-
message: '#^Parameter \$order of anonymous function has invalid type Doctrine\\Common\\Collections\\Order\.$#'
path: src/Internal/CriteriaOrderings.php
-
message: '#^Anonymous function has invalid return type Doctrine\\Common\\Collections\\Order\.$#'
path: src/Internal/CriteriaOrderings.php
-
message: '#^Access to property \$value on an unknown class Doctrine\\Common\\Collections\\Order\.$#'
path: src/Internal/CriteriaOrderings.php
-
message: '#^Call to static method from\(\) on an unknown class Doctrine\\Common\\Collections\\Order\.$#'
path: src/Internal/CriteriaOrderings.php
-
message: '#^Call to an undefined method Doctrine\\Common\\Collections\\Criteria\:\:orderings\(\)\.$#'
path: src/Internal/CriteriaOrderings.php
-
message: '#^Method .+\:\:mapToOrderEnumIfAvailable\(\) has invalid return type Doctrine\\Common\\Collections\\Order\.$#'
path: src/Internal/CriteriaOrderings.php
# False positive
-
message: '/^Call to an undefined method Doctrine\\Common\\Cache\\Cache::deleteAll\(\)\.$/'
count: 1
path: src/Tools/Console/Command/ClearCache/ResultCommand.php
# Symfony cache supports passing a key prefix to the clear method.
- '/^Method Psr\\Cache\\CacheItemPoolInterface\:\:clear\(\) invoked with 1 parameter, 0 required\.$/'
-
message: '#contains generic type.*but class.*is not generic#'
paths:
- src/Mapping/Driver/XmlDriver.php
- src/Mapping/Driver/YamlDriver.php
# Extending a deprecated class conditionally to maintain BC
-
message: '~deprecated class Doctrine\\Persistence\\Mapping\\Driver\\AnnotationDriver\:~'
path: src/Mapping/Driver/CompatibilityAnnotationDriver.php
# We're sniffing for this deprecated class in order to detect Persistence 2
-
message: '~deprecated class Doctrine\\Common\\Persistence\\PersistentObject\:~'
path: src/EntityManager.php
-
message: '#Cannot access offset \S+ on .*ClassMetadata.*#'
paths:
- src/Mapping/Driver/XmlDriver.php
- src/Mapping/Driver/YamlDriver.php
-
message: '#^Parameter \#1 \$orderings of method Doctrine\\Common\\Collections\\Criteria\:\:orderBy\(\) expects array\<string\>, array\<string, Doctrine\\Common\\Collections\\Order\|string\> given\.$#'
path: src/PersistentCollection.php
-
message: '#^Parameter \#5 \.\.\.\$args of static method Doctrine\\Deprecations\\Deprecation\:\:trigger\(\) expects float\|int\|string, string\|false given\.$#'
path: src/Mapping/ClassMetadataFactory.php
-
message: '#^Parameter \#1 \$classNames of method Doctrine\\ORM\\Mapping\\ClassMetadataInfo\<object\>\:\:setParentClasses\(\) expects list\<class\-string\>, array\<string\> given\.$#'
path: src/Mapping/ClassMetadataFactory.php
-
message: '#loadMappingFile#'
identifier: 'return.type'
path: src/Mapping/Driver/XmlDriver.php
-
message: '#injectObjectManager#'
identifier: 'method.deprecatedInterface'
path: src/UnitOfWork.php
-
message: '#^Static method Doctrine\\Common\\Collections\\Criteria\:\:create\(\) invoked with 1 parameter, 0 required\.$#'
identifier: arguments.count
count: 3
path: src/Persisters/Collection/OneToManyPersister.php

View File

@@ -4,49 +4,49 @@ includes:
parameters:
ignoreErrors:
# deprecations from doctrine/dbal:3.x
- '/^Call to an undefined method Doctrine\\DBAL\\Platforms\\AbstractPlatform::getGuidExpression\(\).$/'
# Fallback logic for DBAL 2
-
message: '/Parameter #2 \$command of static method Doctrine\\ORM\\Tools\\Console\\ConsoleRunner\:\:addCommandToApplication\(\) expects Symfony\\Component\\Console\\Command\\Command/'
path: src/Tools/Console/ConsoleRunner.php
- '/^Class Doctrine\\DBAL\\Platforms\\SQLAnywherePlatform not found\.$/'
- '/^Call to method \w+\(\) on an unknown class Doctrine\\DBAL\\Platforms\\SQLAnywherePlatform\.$/'
-
message: '/^Call to an undefined method Doctrine\\DBAL\\Platforms\\AbstractPlatform::getSQLResultCasing\(\)\.$/'
path: src/Internal/SQLResultCasing.php
-
message: '/^Parameter \$stmt of method .* has invalid type Doctrine\\DBAL\\Driver\\ResultStatement\.$/'
path: src/Internal/Hydration/AbstractHydrator.php
-
message: '/^Class Doctrine\\DBAL\\Driver\\ResultStatement not found\.$/'
path: src/Internal/Hydration/AbstractHydrator.php
-
message: '/^Call to static method ensure\(\) on an unknown class Doctrine\\DBAL\\ForwardCompatibility\\Result\.$/'
path: src/Internal/Hydration/AbstractHydrator.php
-
message: '/^Instanceof between Doctrine\\DBAL\\Platforms\\AbstractPlatform and Doctrine\\DBAL\\Platforms\\MySQLPlatform will always evaluate to false\.$/'
path: src/Utility/LockSqlHelper.php
# False positive
-
message: '/^Call to an undefined method Doctrine\\Common\\Cache\\Cache::deleteAll\(\)\.$/'
count: 1
path: src/Tools/Console/Command/ClearCache/ResultCommand.php
# Symfony cache supports passing a key prefix to the clear method.
- '/^Method Psr\\Cache\\CacheItemPoolInterface\:\:clear\(\) invoked with 1 parameter, 0 required\.$/'
# Persistence 2 support
# We can be certain that those values are not matched.
-
message: '/clear.*invoked with 1 parameter/'
path: src/EntityRepository.php
message: '~^Match expression does not handle remaining values:~'
path: src/Utility/PersisterHelper.php
# DBAL 4 compatibility
-
message: '#^Class Doctrine\\Persistence\\ObjectManagerAware not found\.$#'
message: '~^Method Doctrine\\ORM\\Query\\AST\\Functions\\TrimFunction::getTrimMode\(\) never returns .* so it can be removed from the return type\.$~'
path: src/Query/AST/Functions/TrimFunction.php
-
message: '~^Method Doctrine\\ORM\\Utility\\PersisterHelper\:\:getArrayBindingType\(\) never returns .* so it can be removed from the return type\.$~'
path: src/Utility/PersisterHelper.php
# Compatibility with DBAL 3
# See https://github.com/doctrine/dbal/pull/3480
-
message: '~^Result of method Doctrine\\DBAL\\Connection::commit\(\) \(void\) is used\.$~'
path: src/UnitOfWork.php
-
message: '#^Call to method injectObjectManager\(\) on an unknown class Doctrine\\Persistence\\ObjectManagerAware\.$#'
message: '~^Strict comparison using === between null and false will always evaluate to false\.$~'
path: src/UnitOfWork.php
-
message: '~^Variable \$e on left side of \?\? always exists and is not nullable\.$~'
path: src/UnitOfWork.php
-
message: '~^Parameter #2 \$command of static method Doctrine\\ORM\\Tools\\Console\\ConsoleRunner::addCommandToApplication\(\) expects Symfony\\Component\\Console\\Command\\Command, Doctrine\\DBAL\\Tools\\Console\\Command\\ReservedWordsCommand given\.$~'
path: src/Tools/Console/ConsoleRunner.php
-
message: '~Strict comparison using \=\=\= between callable\(\)\: mixed and null will always evaluate to false\.~'
path: src/Tools/SchemaTool.php
# To be removed in 4.0
-
message: '#Negated boolean expression is always false\.#'
paths:
- src/Mapping/Driver/AttributeDriver.php
# Compatibility with Persistence 3
-
message: '#Expression on left side of \?\? is not nullable.#'
path: src/Mapping/Driver/AttributeDriver.php

View File

@@ -14,10 +14,15 @@
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
colors="true"
verbose="false"
beStrictAboutOutputDuringTests="true"
displayDetailsOnTestsThatTriggerDeprecations="true"
displayDetailsOnTestsThatTriggerNotices="true"
displayDetailsOnTestsThatTriggerWarnings="true"
failOnNotice="true"
failOnWarning="true"
failOnRisky="true"
convertDeprecationsToExceptions="true"
bootstrap="./tests/Tests/TestInit.php"
cacheDirectory=".phpunit.cache"
>
<testsuites>
<testsuite name="Doctrine ORM Test Suite">
@@ -31,42 +36,45 @@
<group>locking_functional</group>
</exclude>
</groups>
<php>
<ini name="error_reporting" value="-1"/>
<!-- "Real" test database -->
<var name="db_driver" value="pdo_sqlite"/>
<var name="db_memory" value="true"/>
<!-- to use another database driver / credentials, provide them like so:
<var name="db_driver" value="pdo_mysql"/>
<var name="db_host" value="localhost" />
<var name="db_user" value="root" />
<var name="db_password" value="" />
<var name="db_dbname" value="doctrine_tests" />
<var name="db_port" value="3306"/>-->
<!--<var name="db_event_subscribers" value="Doctrine\DBAL\Event\Listeners\OracleSessionInit">-->
<!--
At the start of each test run, we will drop and recreate the test database.
<php>
<ini name="error_reporting" value="-1" />
<!-- "Real" test database -->
<var name="db_driver" value="pdo_sqlite"/>
<var name="db_memory" value="true"/>
<!-- to use another database driver / credentials, provide them like so:
<var name="db_driver" value="pdo_mysql"/>
<var name="db_host" value="localhost" />
<var name="db_user" value="root" />
<var name="db_password" value="" />
<var name="db_dbname" value="doctrine_tests" />
<var name="db_port" value="3306"/>-->
<!--<var name="db_event_subscribers" value="Doctrine\DBAL\Event\Listeners\OracleSessionInit">-->
By default we assume that the `db_` config above has unrestricted access to the provided database
platform.
<!--
At the start of each test run, we will drop and recreate the test database.
If you prefer, you can provide a restricted user above and a separate `privileged_db` config
block to provide details of a privileged connection to use for the setup / teardown actions.
By default we assume that the `db_` config above has unrestricted access to the provided database
platform.
Note that these configurations are not merged - if you specify a `privileged_db_driver` then
you must also specify all the other options that your driver requires.
If you prefer, you can provide a restricted user above and a separate `privileged_db` config
block to provide details of a privileged connection to use for the setup / teardown actions.
Note that these configurations are not merged - if you specify a `privileged_db_driver` then
you must also specify all the other options that your driver requires.
<var name="privileged_db_driver" value="pdo_mysql"/>
<var name="privileged_db_host" value="localhost" />
<var name="privileged_db_user" value="root" />
<var name="privileged_db_password" value="" />
<var name="privileged_db_dbname" value="doctrine_tests_tmp" />
<var name="privileged_db_port" value="3306"/>
-->
<env name="COLUMNS" value="120"/>
</php>
<var name="privileged_db_driver" value="pdo_mysql"/>
<var name="privileged_db_host" value="localhost" />
<var name="privileged_db_user" value="root" />
<var name="privileged_db_password" value="" />
<var name="privileged_db_dbname" value="doctrine_tests_tmp" />
<var name="privileged_db_port" value="3306"/>
-->
<env name="COLUMNS" value="120"/>
<env name="DOCTRINE_DEPRECATIONS" value="trigger"/>
</php>
<source ignoreSuppressionOfDeprecations="true">
<include>
<directory>src</directory>
</include>
</source>
</phpunit>

File diff suppressed because it is too large Load Diff

View File

@@ -38,127 +38,69 @@ interface Cache
*/
public const MODE_REFRESH = 4;
/**
* @param string $className The entity class.
*
* @return Region|null
*/
public function getEntityCacheRegion($className);
public function getEntityCacheRegion(string $className): Region|null;
/**
* @param string $className The entity class.
* @param string $association The field name that represents the association.
*
* @return Region|null
*/
public function getCollectionCacheRegion($className, $association);
public function getCollectionCacheRegion(string $className, string $association): Region|null;
/**
* Determine whether the cache contains data for the given entity "instance".
*
* @param string $className The entity class.
* @param mixed $identifier The entity identifier
*
* @return bool true if the underlying cache contains corresponding data; false otherwise.
*/
public function containsEntity($className, $identifier);
public function containsEntity(string $className, mixed $identifier): bool;
/**
* Evicts the entity data for a particular entity "instance".
*
* @param string $className The entity class.
* @param mixed $identifier The entity identifier.
*
* @return void
*/
public function evictEntity($className, $identifier);
public function evictEntity(string $className, mixed $identifier): void;
/**
* Evicts all entity data from the given region.
*
* @param string $className The entity metadata.
*
* @return void
*/
public function evictEntityRegion($className);
public function evictEntityRegion(string $className): void;
/**
* Evict data from all entity regions.
*
* @return void
*/
public function evictEntityRegions();
public function evictEntityRegions(): void;
/**
* Determine whether the cache contains data for the given collection.
*
* @param string $className The entity class.
* @param string $association The field name that represents the association.
* @param mixed $ownerIdentifier The identifier of the owning entity.
*
* @return bool true if the underlying cache contains corresponding data; false otherwise.
*/
public function containsCollection($className, $association, $ownerIdentifier);
public function containsCollection(string $className, string $association, mixed $ownerIdentifier): bool;
/**
* Evicts the cache data for the given identified collection instance.
*
* @param string $className The entity class.
* @param string $association The field name that represents the association.
* @param mixed $ownerIdentifier The identifier of the owning entity.
*
* @return void
*/
public function evictCollection($className, $association, $ownerIdentifier);
public function evictCollection(string $className, string $association, mixed $ownerIdentifier): void;
/**
* Evicts all entity data from the given region.
*
* @param string $className The entity class.
* @param string $association The field name that represents the association.
*
* @return void
*/
public function evictCollectionRegion($className, $association);
public function evictCollectionRegion(string $className, string $association): void;
/**
* Evict data from all collection regions.
*
* @return void
*/
public function evictCollectionRegions();
public function evictCollectionRegions(): void;
/**
* Determine whether the cache contains data for the given query.
*
* @param string $regionName The cache name given to the query.
*
* @return bool true if the underlying cache contains corresponding data; false otherwise.
*/
public function containsQuery($regionName);
public function containsQuery(string $regionName): bool;
/**
* Evicts all cached query results under the given name, or default query cache if the region name is NULL.
*
* @param string|null $regionName The cache name associated to the queries being cached.
*
* @return void
*/
public function evictQueryRegion($regionName = null);
public function evictQueryRegion(string|null $regionName = null): void;
/**
* Evict data from all query regions.
*
* @return void
*/
public function evictQueryRegions();
public function evictQueryRegions(): void;
/**
* Get query cache by region name or create a new one if none exist.
*
* @param string|null $regionName Query cache region name, or default query cache if the region name is NULL.
*
* @return QueryCache The Query Cache associated with the region name.
*/
public function getQueryCache($regionName = null);
public function getQueryCache(string|null $regionName = null): QueryCache;
}

View File

@@ -4,35 +4,16 @@ declare(strict_types=1);
namespace Doctrine\ORM\Cache;
/**
* Association cache entry
*/
class AssociationCacheEntry implements CacheEntry
{
/**
* The entity identifier
*
* @readonly Public only for performance reasons, it should be considered immutable.
* @var array<string, mixed>
*/
public $identifier;
/**
* The entity class name
*
* @readonly Public only for performance reasons, it should be considered immutable.
* @var class-string
*/
public $class;
/**
* @param class-string $class The entity class.
* @param array<string, mixed> $identifier The entity identifier.
* @param class-string $class The entity class name
*/
public function __construct($class, array $identifier)
{
$this->class = $class;
$this->identifier = $identifier;
public function __construct(
public readonly string $class,
public readonly array $identifier,
) {
}
/**
@@ -41,10 +22,8 @@ class AssociationCacheEntry implements CacheEntry
* This method allow Doctrine\Common\Cache\PhpFileCache compatibility
*
* @param array<string, mixed> $values array containing property values
*
* @return AssociationCacheEntry
*/
public static function __set_state(array $values)
public static function __set_state(array $values): self
{
return new self($values['class'], $values['identifier']);
}

View File

@@ -11,72 +11,49 @@ use Doctrine\ORM\Cache\Logging\CacheLogger;
*/
class CacheConfiguration
{
/** @var CacheFactory|null */
private $cacheFactory;
private CacheFactory|null $cacheFactory = null;
private RegionsConfiguration|null $regionsConfig = null;
private CacheLogger|null $cacheLogger = null;
private QueryCacheValidator|null $queryValidator = null;
/** @var RegionsConfiguration|null */
private $regionsConfig;
/** @var CacheLogger|null */
private $cacheLogger;
/** @var QueryCacheValidator|null */
private $queryValidator;
/** @return CacheFactory|null */
public function getCacheFactory()
public function getCacheFactory(): CacheFactory|null
{
return $this->cacheFactory;
}
/** @return void */
public function setCacheFactory(CacheFactory $factory)
public function setCacheFactory(CacheFactory $factory): void
{
$this->cacheFactory = $factory;
}
/** @return CacheLogger|null */
public function getCacheLogger()
public function getCacheLogger(): CacheLogger|null
{
return $this->cacheLogger;
}
/** @return void */
public function setCacheLogger(CacheLogger $logger)
public function setCacheLogger(CacheLogger $logger): void
{
$this->cacheLogger = $logger;
}
/** @return RegionsConfiguration */
public function getRegionsConfiguration()
public function getRegionsConfiguration(): RegionsConfiguration
{
if ($this->regionsConfig === null) {
$this->regionsConfig = new RegionsConfiguration();
}
return $this->regionsConfig;
return $this->regionsConfig ??= new RegionsConfiguration();
}
/** @return void */
public function setRegionsConfiguration(RegionsConfiguration $regionsConfig)
public function setRegionsConfiguration(RegionsConfiguration $regionsConfig): void
{
$this->regionsConfig = $regionsConfig;
}
/** @return QueryCacheValidator */
public function getQueryValidator()
public function getQueryValidator(): QueryCacheValidator
{
if ($this->queryValidator === null) {
$this->queryValidator = new TimestampQueryCacheValidator(
$this->cacheFactory->getTimestampRegion()
);
}
return $this->queryValidator;
return $this->queryValidator ??= new TimestampQueryCacheValidator(
$this->cacheFactory->getTimestampRegion(),
);
}
/** @return void */
public function setQueryValidator(QueryCacheValidator $validator)
public function setQueryValidator(QueryCacheValidator $validator): void
{
$this->queryValidator = $validator;
}

View File

@@ -5,57 +5,22 @@ declare(strict_types=1);
namespace Doctrine\ORM\Cache;
use Doctrine\ORM\Exception\ORMException;
use LogicException;
use function sprintf;
/**
* Exception for cache.
*/
class CacheException extends ORMException
class CacheException extends LogicException implements ORMException
{
/**
* @param string $sourceEntity
* @param string $fieldName
*
* @return CacheException
*/
public static function updateReadOnlyCollection($sourceEntity, $fieldName)
public static function updateReadOnlyCollection(string $sourceEntity, string $fieldName): self
{
return new self(sprintf('Cannot update a readonly collection "%s#%s"', $sourceEntity, $fieldName));
}
/**
* @deprecated This method is not used anymore.
*
* @param string $entityName
*
* @return CacheException
*/
public static function updateReadOnlyEntity($entityName)
{
return new self(sprintf('Cannot update a readonly entity "%s"', $entityName));
}
/**
* @param string $entityName
*
* @return CacheException
*/
public static function nonCacheableEntity($entityName)
public static function nonCacheableEntity(string $entityName): self
{
return new self(sprintf('Entity "%s" not configured as part of the second-level cache.', $entityName));
}
/**
* @deprecated This method is not used anymore.
*
* @param string $entityName
* @param string $field
*
* @return CacheException
*/
public static function nonCacheableEntityAssociation($entityName, $field)
{
return new self(sprintf('Entity association field "%s#%s" not configured as part of the second-level cache.', $entityName, $field));
}
}

View File

@@ -8,82 +8,57 @@ use Doctrine\ORM\Cache;
use Doctrine\ORM\Cache\Persister\Collection\CachedCollectionPersister;
use Doctrine\ORM\Cache\Persister\Entity\CachedEntityPersister;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Mapping\AssociationMapping;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Persisters\Collection\CollectionPersister;
use Doctrine\ORM\Persisters\Entity\EntityPersister;
/**
* Contract for building second level cache regions components.
*
* @phpstan-import-type AssociationMapping from ClassMetadata
*/
interface CacheFactory
{
/**
* Build an entity persister for the given entity metadata.
*
* @param EntityManagerInterface $em The entity manager.
* @param EntityPersister $persister The entity persister that will be cached.
* @param ClassMetadata $metadata The entity metadata.
*
* @return CachedEntityPersister
*/
public function buildCachedEntityPersister(EntityManagerInterface $em, EntityPersister $persister, ClassMetadata $metadata);
public function buildCachedEntityPersister(EntityManagerInterface $em, EntityPersister $persister, ClassMetadata $metadata): CachedEntityPersister;
/**
* Build a collection persister for the given relation mapping.
*
* @param AssociationMapping $mapping The association mapping.
*
* @return CachedCollectionPersister
*/
public function buildCachedCollectionPersister(EntityManagerInterface $em, CollectionPersister $persister, array $mapping);
/** Build a collection persister for the given relation mapping. */
public function buildCachedCollectionPersister(
EntityManagerInterface $em,
CollectionPersister $persister,
AssociationMapping $mapping,
): CachedCollectionPersister;
/**
* Build a query cache based on the given region name
*
* @param string|null $regionName The region name.
*
* @return QueryCache The built query cache.
*/
public function buildQueryCache(EntityManagerInterface $em, $regionName = null);
public function buildQueryCache(EntityManagerInterface $em, string|null $regionName = null): QueryCache;
/**
* Build an entity hydrator
*
* @return EntityHydrator The built entity hydrator.
*/
public function buildEntityHydrator(EntityManagerInterface $em, ClassMetadata $metadata);
public function buildEntityHydrator(EntityManagerInterface $em, ClassMetadata $metadata): EntityHydrator;
/**
* Build a collection hydrator
*
* @param mixed[] $mapping The association mapping.
*
* @return CollectionHydrator The built collection hydrator.
*/
public function buildCollectionHydrator(EntityManagerInterface $em, array $mapping);
public function buildCollectionHydrator(EntityManagerInterface $em, AssociationMapping $mapping): CollectionHydrator;
/**
* Build a cache region
*
* @param array<string,mixed> $cache The cache configuration.
*
* @return Region The cache region.
*/
public function getRegion(array $cache);
public function getRegion(array $cache): Region;
/**
* Build timestamp cache region
*
* @return TimestampRegion The timestamp region.
*/
public function getTimestampRegion();
public function getTimestampRegion(): TimestampRegion;
/**
* Build \Doctrine\ORM\Cache
*
* @return Cache
*/
public function createCache(EntityManagerInterface $entityManager);
public function createCache(EntityManagerInterface $entityManager): Cache;
}

View File

@@ -4,33 +4,13 @@ declare(strict_types=1);
namespace Doctrine\ORM\Cache;
use Doctrine\Deprecations\Deprecation;
/**
* Defines entity / collection / query key to be stored in the cache region.
* Allows multiple roles to be stored in the same cache region.
*/
abstract class CacheKey
{
/**
* Unique identifier
*
* @readonly Public only for performance reasons, it should be considered immutable.
* @var string
*/
public $hash;
public function __construct(?string $hash = null)
public function __construct(public readonly string $hash)
{
if ($hash === null) {
Deprecation::trigger(
'doctrine/orm',
'https://github.com/doctrine/orm/pull/10212',
'Calling %s() without providing a value for the $hash parameter is deprecated.',
__METHOD__
);
} else {
$this->hash = $hash;
}
}
}

View File

@@ -4,23 +4,11 @@ declare(strict_types=1);
namespace Doctrine\ORM\Cache;
/**
* Collection cache entry
*/
class CollectionCacheEntry implements CacheEntry
{
/**
* The list of entity identifiers hold by the collection
*
* @readonly Public only for performance reasons, it should be considered immutable.
* @var CacheKey[]
*/
public $identifiers;
/** @param CacheKey[] $identifiers List of entity identifiers hold by the collection */
public function __construct(array $identifiers)
public function __construct(public readonly array $identifiers)
{
$this->identifiers = $identifiers;
}
/**
@@ -29,10 +17,8 @@ class CollectionCacheEntry implements CacheEntry
* This method allows for Doctrine\Common\Cache\PhpFileCache compatibility
*
* @param array<string, mixed> $values array containing property values
*
* @return CollectionCacheEntry
*/
public static function __set_state(array $values)
public static function __set_state(array $values): CollectionCacheEntry
{
return new self($values['identifiers']);
}

View File

@@ -17,39 +17,23 @@ class CollectionCacheKey extends CacheKey
/**
* The owner entity identifier
*
* @readonly Public only for performance reasons, it should be considered immutable.
* @var array<string, mixed>
*/
public $ownerIdentifier;
public readonly array $ownerIdentifier;
/**
* The owner entity class
*
* @readonly Public only for performance reasons, it should be considered immutable.
* @var class-string
*/
public $entityClass;
/**
* The association name
*
* @readonly Public only for performance reasons, it should be considered immutable.
* @var string
*/
public $association;
/**
* @param class-string $entityClass The entity class.
* @param string $association The field name that represents the association.
* @param class-string $entityClass The owner entity class.
* @param array<string, mixed> $ownerIdentifier The identifier of the owning entity.
*/
public function __construct($entityClass, $association, array $ownerIdentifier, string $filterHash = '')
{
public function __construct(
public readonly string $entityClass,
public readonly string $association,
array $ownerIdentifier,
string $filterHash = '',
) {
ksort($ownerIdentifier);
$this->ownerIdentifier = $ownerIdentifier;
$this->entityClass = (string) $entityClass;
$this->association = (string) $association;
$filterHash = $filterHash === '' ? '' : '_' . $filterHash;

View File

@@ -13,13 +13,9 @@ use Doctrine\ORM\PersistentCollection;
*/
interface CollectionHydrator
{
/**
* @param array|mixed[]|Collection $collection The collection.
*
* @return CollectionCacheEntry
*/
public function buildCacheEntry(ClassMetadata $metadata, CollectionCacheKey $key, $collection);
/** @param mixed[]|Collection $collection The collection. */
public function buildCacheEntry(ClassMetadata $metadata, CollectionCacheKey $key, array|Collection $collection): CollectionCacheEntry;
/** @return mixed[]|null */
public function loadCacheEntry(ClassMetadata $metadata, CollectionCacheKey $key, CollectionCacheEntry $entry, PersistentCollection $collection);
public function loadCacheEntry(ClassMetadata $metadata, CollectionCacheKey $key, CollectionCacheEntry $entry, PersistentCollection $collection): array|null;
}

View File

@@ -22,7 +22,7 @@ interface ConcurrentRegion extends Region
*
* @throws LockException Indicates a problem accessing the region.
*/
public function lock(CacheKey $key);
public function lock(CacheKey $key): Lock|null;
/**
* Attempts to read unlock the mapping for the given key.
@@ -30,9 +30,7 @@ interface ConcurrentRegion extends Region
* @param CacheKey $key The key of the item to unlock.
* @param Lock $lock The lock previously obtained from {@link readLock}
*
* @return bool
*
* @throws LockException Indicates a problem accessing the region.
*/
public function unlock(CacheKey $key, Lock $lock);
public function unlock(CacheKey $key, Lock $lock): bool;
}

View File

@@ -20,37 +20,27 @@ use function is_object;
*/
class DefaultCache implements Cache
{
/** @var EntityManagerInterface */
private $em;
/** @var UnitOfWork */
private $uow;
/** @var CacheFactory */
private $cacheFactory;
private readonly UnitOfWork $uow;
private readonly CacheFactory $cacheFactory;
/**
* @var QueryCache[]
* @phpstan-var array<string, QueryCache>
*/
private $queryCaches = [];
private array $queryCaches = [];
/** @var QueryCache|null */
private $defaultQueryCache;
private QueryCache|null $defaultQueryCache = null;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
public function __construct(
private readonly EntityManagerInterface $em,
) {
$this->uow = $em->getUnitOfWork();
$this->cacheFactory = $em->getConfiguration()
->getSecondLevelCacheConfiguration()
->getCacheFactory();
}
/**
* {@inheritDoc}
*/
public function getEntityCacheRegion($className)
public function getEntityCacheRegion(string $className): Region|null
{
$metadata = $this->em->getClassMetadata($className);
$persister = $this->uow->getEntityPersister($metadata->rootEntityName);
@@ -62,10 +52,7 @@ class DefaultCache implements Cache
return $persister->getCacheRegion();
}
/**
* {@inheritDoc}
*/
public function getCollectionCacheRegion($className, $association)
public function getCollectionCacheRegion(string $className, string $association): Region|null
{
$metadata = $this->em->getClassMetadata($className);
$persister = $this->uow->getCollectionPersister($metadata->getAssociationMapping($association));
@@ -77,10 +64,7 @@ class DefaultCache implements Cache
return $persister->getCacheRegion();
}
/**
* {@inheritDoc}
*/
public function containsEntity($className, $identifier)
public function containsEntity(string $className, mixed $identifier): bool
{
$metadata = $this->em->getClassMetadata($className);
$persister = $this->uow->getEntityPersister($metadata->rootEntityName);
@@ -92,10 +76,7 @@ class DefaultCache implements Cache
return $persister->getCacheRegion()->contains($this->buildEntityCacheKey($metadata, $identifier));
}
/**
* {@inheritDoc}
*/
public function evictEntity($className, $identifier)
public function evictEntity(string $className, mixed $identifier): void
{
$metadata = $this->em->getClassMetadata($className);
$persister = $this->uow->getEntityPersister($metadata->rootEntityName);
@@ -107,10 +88,7 @@ class DefaultCache implements Cache
$persister->getCacheRegion()->evict($this->buildEntityCacheKey($metadata, $identifier));
}
/**
* {@inheritDoc}
*/
public function evictEntityRegion($className)
public function evictEntityRegion(string $className): void
{
$metadata = $this->em->getClassMetadata($className);
$persister = $this->uow->getEntityPersister($metadata->rootEntityName);
@@ -122,10 +100,7 @@ class DefaultCache implements Cache
$persister->getCacheRegion()->evictAll();
}
/**
* {@inheritDoc}
*/
public function evictEntityRegions()
public function evictEntityRegions(): void
{
$metadatas = $this->em->getMetadataFactory()->getAllMetadata();
@@ -140,10 +115,7 @@ class DefaultCache implements Cache
}
}
/**
* {@inheritDoc}
*/
public function containsCollection($className, $association, $ownerIdentifier)
public function containsCollection(string $className, string $association, mixed $ownerIdentifier): bool
{
$metadata = $this->em->getClassMetadata($className);
$persister = $this->uow->getCollectionPersister($metadata->getAssociationMapping($association));
@@ -155,10 +127,7 @@ class DefaultCache implements Cache
return $persister->getCacheRegion()->contains($this->buildCollectionCacheKey($metadata, $association, $ownerIdentifier));
}
/**
* {@inheritDoc}
*/
public function evictCollection($className, $association, $ownerIdentifier)
public function evictCollection(string $className, string $association, mixed $ownerIdentifier): void
{
$metadata = $this->em->getClassMetadata($className);
$persister = $this->uow->getCollectionPersister($metadata->getAssociationMapping($association));
@@ -170,10 +139,7 @@ class DefaultCache implements Cache
$persister->getCacheRegion()->evict($this->buildCollectionCacheKey($metadata, $association, $ownerIdentifier));
}
/**
* {@inheritDoc}
*/
public function evictCollectionRegion($className, $association)
public function evictCollectionRegion(string $className, string $association): void
{
$metadata = $this->em->getClassMetadata($className);
$persister = $this->uow->getCollectionPersister($metadata->getAssociationMapping($association));
@@ -185,16 +151,13 @@ class DefaultCache implements Cache
$persister->getCacheRegion()->evictAll();
}
/**
* {@inheritDoc}
*/
public function evictCollectionRegions()
public function evictCollectionRegions(): void
{
$metadatas = $this->em->getMetadataFactory()->getAllMetadata();
foreach ($metadatas as $metadata) {
foreach ($metadata->associationMappings as $association) {
if (! $association['type'] & ClassMetadata::TO_MANY) {
if (! $association->isToMany()) {
continue;
}
@@ -209,18 +172,12 @@ class DefaultCache implements Cache
}
}
/**
* {@inheritDoc}
*/
public function containsQuery($regionName)
public function containsQuery(string $regionName): bool
{
return isset($this->queryCaches[$regionName]);
}
/**
* {@inheritDoc}
*/
public function evictQueryRegion($regionName = null)
public function evictQueryRegion(string|null $regionName = null): void
{
if ($regionName === null && $this->defaultQueryCache !== null) {
$this->defaultQueryCache->clear();
@@ -233,10 +190,7 @@ class DefaultCache implements Cache
}
}
/**
* {@inheritDoc}
*/
public function evictQueryRegions()
public function evictQueryRegions(): void
{
$this->getQueryCache()->clear();
@@ -245,25 +199,16 @@ class DefaultCache implements Cache
}
}
/**
* {@inheritDoc}
*/
public function getQueryCache($regionName = null)
public function getQueryCache(string|null $regionName = null): QueryCache
{
if ($regionName === null) {
return $this->defaultQueryCache ?:
$this->defaultQueryCache = $this->cacheFactory->buildQueryCache($this->em);
return $this->defaultQueryCache ??= $this->cacheFactory->buildQueryCache($this->em);
}
if (! isset($this->queryCaches[$regionName])) {
$this->queryCaches[$regionName] = $this->cacheFactory->buildQueryCache($this->em, $regionName);
}
return $this->queryCaches[$regionName];
return $this->queryCaches[$regionName] ??= $this->cacheFactory->buildQueryCache($this->em, $regionName);
}
/** @param mixed $identifier The entity identifier. */
private function buildEntityCacheKey(ClassMetadata $metadata, $identifier): EntityCacheKey
private function buildEntityCacheKey(ClassMetadata $metadata, mixed $identifier): EntityCacheKey
{
if (! is_array($identifier)) {
$identifier = $this->toIdentifierArray($metadata, $identifier);
@@ -272,11 +217,10 @@ class DefaultCache implements Cache
return new EntityCacheKey($metadata->rootEntityName, $identifier);
}
/** @param mixed $ownerIdentifier The identifier of the owning entity. */
private function buildCollectionCacheKey(
ClassMetadata $metadata,
string $association,
$ownerIdentifier
mixed $ownerIdentifier,
): CollectionCacheKey {
if (! is_array($ownerIdentifier)) {
$ownerIdentifier = $this->toIdentifierArray($metadata, $ownerIdentifier);
@@ -285,21 +229,14 @@ class DefaultCache implements Cache
return new CollectionCacheKey($metadata->rootEntityName, $association, $ownerIdentifier);
}
/**
* @param mixed $identifier The entity identifier.
*
* @return array<string, mixed>
*/
private function toIdentifierArray(ClassMetadata $metadata, $identifier): array
/** @return array<string, mixed> */
private function toIdentifierArray(ClassMetadata $metadata, mixed $identifier): array
{
if (is_object($identifier)) {
$class = DefaultProxyClassNameResolver::getClass($identifier);
if ($this->em->getMetadataFactory()->hasMetadataFor($class)) {
$identifier = $this->uow->getSingleIdentifierValue($identifier);
if ($identifier === null) {
throw ORMInvalidArgumentException::invalidIdentifierBindingEntity($class);
}
$identifier = $this->uow->getSingleIdentifierValue($identifier)
?? throw ORMInvalidArgumentException::invalidIdentifierBindingEntity($class);
}
}

Some files were not shown because too many files have changed in this diff Show More