Compare commits

...

4000 Commits

Author SHA1 Message Date
Luís Cobucci
93103f44a3 Preparing v2.5.13 release 2017-11-28 00:25:55 +01:00
Luís Cobucci
ffdb769564 Merge pull request #6818 from vkurdin/patch-1
BasicEntityPersister::count() return type fix
2017-11-27 23:08:51 +01:00
Vasiliy Kurdin
95344d019f BasicEntityPersister::count() return type fix
Resolve #6810 by casting return value to integer
2017-11-27 22:21:04 +01:00
Luís Cobucci
640d9af50f Merge pull request #6852 from gigi/2.5
Backport #6167 from 2.6 to 2.5.x branch
2017-11-27 22:12:53 +01:00
Alexey Snigirev
a23e909158 #6167 - code cleanup for 2.5.x version 2017-11-27 14:58:44 +02:00
Marco Pivetta
a857a610db #6167 #6168 rewrote SequenceGeneratorTest for better readability and error messages
(cherry picked from commit a97c265)
2017-11-27 12:28:35 +02:00
Marco Pivetta
f0006eb42d #6167 #6168 - better connection mock documentation/docblocks/return-types
(cherry picked from commit 462481e)
2017-11-27 12:26:27 +02:00
Marco Pivetta
7ea97e69ca #6167 #6168 - clarifying on the reasoning why query is used instead of fetchColumn
(cherry picked from commit d2be4a2)
2017-11-27 12:24:31 +02:00
Michał Kurzeja
de4b40b29f #6167 Code review updates, better readability
(cherry picked from commit 571115c)
2017-11-27 12:24:28 +02:00
Michał Kurzeja
e21217dd0e #6167 - tests - throw exception if wrong method used to get sequence nextval
(cherry picked from commit 71b040c)
2017-11-27 12:24:23 +02:00
Michał Kurzeja
b82aef2748 #6167 - fixed tests and added info why query is used in SequenceGenerator
(cherry picked from commit edffb4d)
2017-11-27 12:24:17 +02:00
Michał Kurzeja
44b3405714 Fixes #6167 - nextval issue on master-slave PostgreSQL setup
(cherry picked from commit 60b6073)
2017-11-27 12:22:54 +02:00
Luís Cobucci
e874d93f61 Merge branch 'backport/bugfix/xml_sequence_params' into 2.5
Backporting: https://github.com/doctrine/doctrine2/pull/6683
2017-11-26 16:46:56 +01:00
Sasha Alex Romanenko
bb31472727 Enforce sequence XSD requirement
Supply default values for allocationSize and initialValue optional parameters.

Related to: https://github.com/doctrine/doctrine2/issues/6682
2017-11-26 16:36:51 +01:00
Luís Cobucci
fd72aa08d2 Merge branch 'backport/DDC288' into 2.5
Backporting: https://github.com/doctrine/doctrine2/pull/6740
2017-11-26 14:15:46 +01:00
Mathieu Duplouy
21f73cf923 Add operator to walkComparison output 2017-11-26 14:08:23 +01:00
Mathieu Duplouy
2701f5058e Add failing test for DCOM-288
Reported on: https://github.com/doctrine/common/issues/600
2017-11-26 14:07:58 +01:00
Luís Cobucci
4bd2f68483 Merge branch 'backport/cache-namespace-fix' into 2.5
Backporting: https://github.com/doctrine/doctrine2/pull/6848
Backporting: https://github.com/doctrine/doctrine2/pull/5904
2017-11-26 13:22:59 +01:00
Jan Jakes
823da6d839 Fix overwriting explicit cache namespace 2017-11-26 12:59:53 +01:00
Luís Cobucci
6318796965 Fix incorrect arguments on SetupTest
Which was only caught by adding proper type declaration on private
methods.
2017-11-26 12:38:01 +01:00
Luís Cobucci
c811c3ac84 Merge branch 'backport/ticket/6699' into 2.5
Backporting: https://github.com/doctrine/doctrine2/pull/6705
2017-11-24 02:43:33 +01:00
Luís Cobucci
aba62edcc8 Fix parameter name comparison in QueryBuilder#setParameter() with different types 2017-11-24 02:37:13 +01:00
Michael Moravec
0b4e5b42e1 Fix parameter name comparison in AbstractQuery#setParameter() with different types 2017-11-24 02:35:10 +01:00
Michael Moravec
3d4f236052 Add failing test for #6699 2017-11-24 02:31:48 +01:00
Luís Cobucci
049470c787 Merge pull request #6821 from remicollet/issue-count
For PHP 7.2
2017-11-12 12:25:46 +01:00
Remi Collet
cfaad4fedc fix skip condition for APC 2017-11-10 15:54:09 +01:00
Remi Collet
e8a89c3bc3 Fix ReflectionException: Given object is not an instance of the class this property was declared in 2017-11-10 15:54:04 +01:00
Remi Collet
497be59f5c fix for 7.2, ensure mocked ParserResult::getParameterMappings returns an array 2017-11-10 15:53:18 +01:00
Jonathan H. Wage
e1b851f2e9 Bumping development version to v2.5.13-DEV 2017-10-23 13:26:03 -05:00
Jonathan H. Wage
984535cadc Preparing v2.5.12 release 2017-10-23 13:21:04 -05:00
Jonathan H. Wage
35a579efdc Merge pull request #6733 from fabpot/patch-2
Allow Symfony 4
2017-10-23 12:50:36 -05:00
Fabien Potencier
a2b4e5b293 Allow Symfony 4 2017-09-27 15:33:54 -07:00
Marco Pivetta
24d95796bb Bumping development version to v2.5.12-DEV 2017-09-18 08:52:10 +02:00
Marco Pivetta
249b737094 Preparing v2.5.11 release 2017-09-18 08:50:20 +02:00
Marco Pivetta
36dc28d43e Merge pull request #6635 from davidbarratt/instantiator
Allow installation of `doctrine/instantiator:^1.0.1`
2017-08-19 18:47:32 +02:00
David Barratt
0ec9e53c8d Fix doctrine/instantiator constraint
The current constraint prevents doctrine from being installed on PHP 7.1
2017-08-19 11:51:46 -04:00
Marco Pivetta
aa80f6c0b5 Removed PHPUnit 5.6+ API usage 2017-08-18 21:24:47 +02:00
Marco Pivetta
fd6d4890c4 Bumping development release to 2.5.11-DEV 2017-08-18 21:23:23 +02:00
Marco Pivetta
c78afd5172 Preparing v2.5.10 release 2017-08-18 21:17:35 +02:00
Marco Pivetta
fb7b78c004 Merge branch 'fix/#6633-#3788-avoid-xml-external-entity-loading-errors-in-xml-mapping-driver-2.5' into 2.5
Backport #6633
Backport #3788
2017-08-18 21:12:12 +02:00
Marco Pivetta
0de69e5a80 #6633 #3788 documenting why simplexml_load_file() was not used 2017-08-18 21:10:45 +02:00
Aljosha Papsch
d7e1f883d8 XmlDriver: Avoid PHP bug #62577 by avoiding simplexml_load_file.
Doctrine is affected by PHP bug #62577. simplexml_load_file is not
able to load files if libxml_disable_entity_loader(true) has been
called. simplexml_load_file fails with the message:

I/O warning : failed to load external entity "/my/mappings/my_entity.dcm.xml"
in /path-to/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php on line 711

This error occurs even if there are no external entities in the XML file.

Waiting for the PHP bug to be resolved is infeasible, because it is
unresolved since years. Therefore Doctrine needs to circumvent the bug
by replacing simplexml_load_file with simplexml_load_string while getting
the file contents itself. simplexml_load_string is not affected by the
PHP bug.
2017-08-18 21:10:11 +02:00
Marco Pivetta
82e0d7e21a Removing ::class meta-constant for tests that need to run against my grandparents' PHP 2017-08-16 20:06:14 +02:00
Marco Pivetta
26880983fc Removing ::class meta-constant for tests that need to run against my grandparents' PHP 2017-08-16 19:24:39 +02:00
Marco Pivetta
d9899732ca Bumping development release to v2.5.10DEV 2017-08-16 15:30:59 +02:00
Marco Pivetta
4f96fc62ce Preparing v2.5.9 release 2017-08-16 15:30:32 +02:00
Marco Pivetta
6184343fd5 Merge branch 'fix/#6626-skip-proxy-generation-for-embeddable-classes-2.5' into 2.5
Backport #6626
Backport #6625
2017-08-16 15:21:29 +02:00
Marco Pivetta
ee22be27a5 #6625 #6626 removing PHP 5.3 incompatibilities (required for backport) 2017-08-16 15:21:14 +02:00
Marco Pivetta
8f77210955 #6626 #6625 minor CS fixes (removed useless assignments) 2017-08-16 15:20:10 +02:00
Issei.M
f736acc8f5 Replace double quote with single quote 2017-08-16 15:20:01 +02:00
Issei.M
f1534610e1 Fix CS / Add annotation 2017-08-16 15:18:15 +02:00
Issei.M
6622bbbbf3 Skip embeddable classes proxy generation 2017-08-16 15:18:04 +02:00
Marco Pivetta
1554af0c07 Merge branch 'fix/#6623-#1515-ensure-abstracthydrator-hydrateall-cleans-up-on-unit-of-work-clear-2.5' into 2.5
Close #6623
2017-08-16 14:50:13 +02:00
Nikolas Tsiongas
814aa9f322 fix AbstractHydrator addEventListener on hydrateAll() 2017-08-16 14:49:22 +02:00
Marco Pivetta
f311dd1dd1 Bumping development version to v2.5.9-DEV 2017-08-13 20:47:26 +02:00
Marco Pivetta
e3aa3f2d1d Preparing v2.5.8 release 2017-08-13 20:46:56 +02:00
Marco Pivetta
c83f479633 Merge pull request #6621 from Powerhamster/patch-1
fixed undefined variable
2017-08-13 20:27:18 +02:00
Thomas Rothe
741f1db198 fixed undefined variable
changed $conditions to $condition so $isConditionalJoin is working
2017-08-12 11:33:11 +02:00
Marco Pivetta
22546a3811 Correcting connection existence in tearDown operations 2017-08-11 23:28:20 +02:00
Marco Pivetta
efa058bd8f If no connection was enstablished, skip the tearDown operations 2017-08-11 22:56:02 +02:00
Marco Pivetta
767577cec6 Removing ::class pseudo-constant usage 2017-08-11 22:49:46 +02:00
Marco Pivetta
c0f593e422 Removing ::class syntax to make dinosaurs run against this codebase too 2017-08-11 22:22:50 +02:00
Marco Pivetta
d89d238594 Merge branch 'fix/#6464-#6475-correct-SQL-generated-with-JTI-and-WITH-condition-2.5' into 2.5
Backport #6464
Backport #6475
2017-08-11 21:43:05 +02:00
Marco Pivetta
2337b7aedd #6464 #6475 cleaning up test - removed invalid fetch join, CS 2017-08-11 21:41:05 +02:00
Stefan Siegl
9e6f061bfb #6464 code review updates 2017-08-11 21:40:53 +02:00
Stefan Siegl
bf1188127e generate nested join sql for CTIs, closes #6464 2017-08-11 21:40:16 +02:00
Stefan Siegl
c73ec2aa76 #6464 add test 2017-08-11 21:39:45 +02:00
Marco Pivetta
095611c4b6 Merge branch 'fix/#6614-clean-modified-collection-causing-double-dirty-object-persistence-2.5' into 2.5
Backport #6613
Backport #6614
Backport #6616
2017-08-11 21:25:27 +02:00
Marco Pivetta
96c6f4cf1d #6613 #6614 #6616 removed unused import 2017-08-11 21:25:10 +02:00
Marco Pivetta
5cacb6e14f #6613 #6614 #6616 minor performance optimisations around the new restoreNewObjectsInDirtyCollection implementation 2017-08-11 21:23:58 +02:00
Marco Pivetta
ab63628960 #6613 #6614 #6616 removing DDC6613 test, which was fully ported to unit tests 2017-08-11 21:23:55 +02:00
Marco Pivetta
15731c7bde #6613 #6614 #6616 ensuring that the collection is marked as non-dirty if all new items are contained in the initialized ones 2017-08-11 21:23:51 +02:00
Andreas Braun
abb429a0c9 Add failing test for dirty flag 2017-08-11 21:23:47 +02:00
Marco Pivetta
61cb03bf30 #6613 #6614 #6616 removing repeated PersistentCollectionTest chunks of code 2017-08-11 21:23:40 +02:00
Marco Pivetta
d6bcb5b1f8 #6613 #6614 #6616 initializing a dirty collection that has new items that are also coming from initialization data de-duplicates new and persisted items 2017-08-11 21:22:59 +02:00
Marco Pivetta
bdae362777 #6613 #6614 #6616 moved integration test basics to a unit test that verifies basic dirty collection initialization semantics 2017-08-11 21:22:54 +02:00
Marco Pivetta
59c5574554 #6613 #6614 correcting broken test that isn't using objects against a PersistentCollection 2017-08-11 21:22:43 +02:00
Marco Pivetta
9545bf9d8c #6613 #6614 correcting broken test that isn't using objects against a PersistentCollection 2017-08-11 21:22:40 +02:00
Marco Pivetta
5521d1f325 #6613 #6614 ensuring that only newly added items that weren't loaded are restored in the dirty state of the collection 2017-08-11 21:22:34 +02:00
Marco Pivetta
49694dc335 #6613 #6614 after initialization, the collection should be dirty anyway 2017-08-11 21:21:43 +02:00
Marco Pivetta
3155d970d3 #6613 #6614 adding assertions about collection initialization and dirty status 2017-08-11 21:21:40 +02:00
Marco Pivetta
09189fc021 #6613 #6614 removing IDE-generated header 2017-08-11 21:21:36 +02:00
Marco Pivetta
5a0d3e5fb8 #6613 #6614 removing phone/user specifics, using ORM naming for associations 2017-08-11 21:21:27 +02:00
Marco Pivetta
b9ba4e3207 #6613 #6614 correcting column mapping (was integer, should be string), segregating phone creation away 2017-08-11 21:21:24 +02:00
Marco Pivetta
d7919678e5 #6613 #6614 remove superfluous mappings 2017-08-11 21:21:21 +02:00
Marco Pivetta
8b185eb822 #6613 #6614 rewrote test logic to be less magic-constant-dependent 2017-08-11 21:21:17 +02:00
Marco Pivetta
693a0546d3 #6613 #6614 CS - applying @group annotation to the test 2017-08-11 21:21:14 +02:00
Marco Pivetta
5c5c8fc487 #6613 #6614 removing dedicated DDC6613 model directory 2017-08-11 21:21:10 +02:00
Marco Pivetta
85dc707cc8 #6613 #6614 smashing entity definitions into the test 2017-08-11 21:21:03 +02:00
Marco Pivetta
64a1251b61 #6613 #6614 better test specification - removing useless assertions 2017-08-11 21:20:42 +02:00
Marco Pivetta
65ed6a2c2f #6613 #6614 simplifying entity definition - using auto-assigned string identifiers to reduce moving parts 2017-08-11 21:20:34 +02:00
Marco Pivetta
d27a9fce7a Merge pull request #6580 from Tobion/patch-1
Allow DBAL 2.6 and common 2.8 to be installed
2017-07-25 05:02:26 +02:00
Tobias Schultze
11659f5cfe Allow common 2.8 to be installed 2017-07-24 16:38:01 +02:00
Tobias Schultze
68dad26482 Allow DBAL 2.6 to be installed
DBAL 2.6 is released but currently dependencies can't be resolved as ORM 2.5 does not allow DBAL 2.6 and ORM 2.6 is not relased yet.
2017-07-24 16:27:53 +02:00
Marco Pivetta
b3ceef0fb6 Merge branch 'fix/#6550-correct-return-value-of-extra-lazy-removeElement-calls' into 2.5
Backport #6550 to 2.5
2017-07-22 09:27:30 +02:00
Andreas Braun
095b365146 Add test for removing element not in collection 2017-07-22 09:27:13 +02:00
Andreas Braun
7c1ebd99bc Fix return of removeElement on collections
Fixes #5745
2017-07-22 09:27:01 +02:00
Marco Pivetta
c06f19db8d Merge branch 'fix/#1515-clean-hydrator-listeners-on-hydration-end-2.5' into 2.5
Close #1515

This is a backport of the original PR - the same patch should land in `master` too, after a cleanup
2017-06-24 03:23:19 +02:00
Emiel Nijpels
0be9be4e24 DDC-3146 remove event listener from event listener in abstract hydrator in cleanup function 2017-06-24 03:23:01 +02:00
Luís Cobucci
b2bf5ee92e Leave PHP 7.1 and nightly to master 2017-06-22 07:57:54 +02:00
Luís Cobucci
698bd813a2 Remove HHVM from build 2017-06-22 07:46:45 +02:00
Jáchym Toušek
b2ac8fdfd7 Fix CountOutputWalker for queries with GROUP BY 2017-06-22 07:15:35 +02:00
Marco Pivetta
9c2b54b748 Adding classes required by the SchemaToolTest that exist in 'master', but not in '2.5' 2017-06-21 07:27:41 +02:00
Marco Pivetta
910784213f Corrected duplicate import statements due to cherry picking 2017-06-21 06:49:45 +02:00
Marco Pivetta
1d1de7de80 Merge branch 'fix/#5798-undefined-schema-tool-index-2.5' into 2.5
Close #5798
2017-06-21 06:32:00 +02:00
Sergey Fedotov
741da6eed7 Fix undefined index for discriminator column in SchemaTool 2017-06-21 06:31:23 +02:00
Marco Pivetta
ad5397b581 Merge branch 'fix/#5715-fix-metadata-filtering-in-cli-tools-2.5' into 2.5
Close #5715
2017-06-21 06:15:42 +02:00
Guilliam Xavier
57bb46ca9d Add regex tests for MetadataFilter (PR #507) 2017-06-21 06:15:25 +02:00
Guilliam Xavier
0416d5e036 Add more basic tests for MetadataFilter 2017-06-21 06:15:14 +02:00
Guilliam Xavier
a14432117a Fix MetadataFilter not testing filters after first 2017-06-21 06:15:01 +02:00
Guilliam Xavier
824f62d3bb Add failing test for #5715 (unit test for MetadataFilter) 2017-06-21 06:14:48 +02:00
Marco Pivetta
c0f0fe060f Merge branch 'fix/#1541-minor-docblock-correction-in-resultset-mapping-builder' into 2.5
Backport #1541 to 2.5
2017-05-20 16:45:59 +02:00
aleeeftw
caffbe04a2 Minor docblock correction
The documentation for the method ‘addJoinedEntityFromClassMetadata’ is
wrong. As we can see currently says you need to pass an object and that
is wrong. The $relation variable is passed to ‘addJoinedEntityResult’
which is using it as a ‘string’.
2017-05-20 16:45:25 +02:00
Marco Pivetta
d2c805b071 Correcting PHP 5.4 compliance by removing ::class usage (moving to real constants) 2017-05-02 09:33:48 +02:00
Marco Pivetta
04fc7a9a1c Merge branch 'fix/#6367-#6362-inheritance-alias-hydration' into 2.5
Close #6367
Close #6362
2017-05-02 09:26:54 +02:00
Timothy Clissold
149b8f4e09 Fix inheritance join alias 2017-05-02 09:26:44 +02:00
Marco Pivetta
48e8c02cb8 Merge pull request #6381 from ElisDN/ElisDN-phpdoc
Fixed PHPDoc
2017-04-03 09:04:13 +02:00
Елисеев Дмитрий
e218866a69 Fixed PHPDoc 2017-04-02 20:29:46 +03:00
Marco Pivetta
e6c434196c Merge pull request #6178 from doctrine/fix/#6174-#5570-merging-new-entities-should-also-trigger-prepersist-lifecycle-callbacks-2.5
Backport #6177 - fix #6174 #5570: merging new entities should also trigger prepersist lifecycle callbacks with the merged data
2016-12-18 16:42:34 +01:00
Marco Pivetta
d52dbe62ac #6174 #5570 switching ::class to string constants for PHP 5.4 compat (still supported in ORM 2.5.x) 2016-12-18 16:24:42 +01:00
Marco Pivetta
b0ede40f47 #6174 #5570 removed modifications applied to the CompanyContractListener, since UnitOfWorkTest now completely encapsulates the scenarios being covered 2016-12-18 16:13:11 +01:00
Marco Pivetta
3645a9c44d #6174 #5570 removed unused imports 2016-12-18 16:13:04 +01:00
Marco Pivetta
39ce6f96a0 #6174 #5570 renamed entity for better fitting the use-cases it's in 2016-12-18 16:12:57 +01:00
Marco Pivetta
e43f5304ef #6174 #5570 removed unused test class 2016-12-18 16:12:46 +01:00
Marco Pivetta
67724eb7ae #6174 #5570 adding group annotations to newly introduced test 2016-12-18 16:12:36 +01:00
Marco Pivetta
8d4bc0638d #6174 #5570 prePersist listeners should never be called when entities are merged, but are already in the UoW 2016-12-18 16:12:29 +01:00
Marco Pivetta
81186105b6 #6174 #5570 started moving tests around prePersist event subscriber triggering on UnitOfWork into the UnitOfWorkTest 2016-12-18 16:12:03 +01:00
Marco Pivetta
beef8acdf5 #6174 #5570 CS fixes around the EntityListenersOnMergeTest 2016-12-18 16:10:17 +01:00
Marco Pivetta
26fc8d60e6 #6174 #5570 adding group annotation to newly introduced tests 2016-12-18 16:10:08 +01:00
Marco Pivetta
12e8ab216a #6174 #5570 CS - spacing/variable naming 2016-12-18 16:09:59 +01:00
Marco Pivetta
dac1a16964 #6174 #5570 removed unused/dead code 2016-12-18 16:09:52 +01:00
Marco Pivetta
d9821d3fda #6174 #5570 CS - spacing 2016-12-18 16:09:45 +01:00
Marco Pivetta
576a4d7e31 #6174 #5570 CS - spacing 2016-12-18 16:09:38 +01:00
Marco Pivetta
eaee924180 #6174 #5570 flattened nested conditionals 2016-12-18 16:09:32 +01:00
Marco Pivetta
cf941ce54f #6174 #5570 documenting thrown exception types 2016-12-18 16:09:25 +01:00
Marco Pivetta
cfb7461f51 #6174 #5570 CS - alignment 2016-12-18 16:09:18 +01:00
bilouwan
569c08ce55 Rename test 2016-12-18 16:09:11 +01:00
bilouwan
295523cdca Cherry pick unit test from PR #5570 (Fix PrePersist EventListener when using merge instead of persist) 2016-12-18 16:09:00 +01:00
bilouwan
25efabdb74 doMerge will mergeEntityStateIntoManagedCopy BEFORE persistNew to let lifecyle events changes be persisted 2016-12-18 16:08:15 +01:00
bilouwan
1d96178097 Create failing test to reveal the issue 2016-12-18 16:08:05 +01:00
Marco Pivetta
20cb50451d Merge pull request #6159 from nicolas-cajelli/backport-fix-relation-cache-#1551-to-2.5
#5821 Backport #1551 - Fixed support for inverse side second level cache
2016-12-12 08:34:27 +01:00
Guilherme Blanco
0ff512ba8f Fixed support for inverse side second level cache 2016-12-05 14:36:33 -03:00
Marco Pivetta
5e9014fd99 Merge pull request #6156 from Slamdunk/patch-2
Allow doctrine/common 2.7
2016-12-04 06:53:07 +01:00
Filippo Tessarotto
a90cd9dfe8 Allow doctrine/common 2.7 2016-12-02 09:00:50 +01:00
Marco Pivetta
4d699789a2 Merge branch 'fix/#6110-collection-clear-should-also-clear-keys-2.5' into 2.5
Close #6110
2016-11-26 06:06:11 +01:00
Marco Pivetta
1486c8f8e2 split test into multiple sub-scenarios involving PersistentCollection key checking #6110 2016-11-26 06:05:31 +01:00
Steevan BARBOYON
3dadfa49d5 Clear $this->collection even when empty, to reset indexes 2016-11-26 06:04:35 +01:00
Marco Pivetta
9b36947a48 Merge branch 'fix/#6028-l2c-inheritance-query-cache-use-parent-entity-name-2.5' into 2.5
Backport #6028 to 2.5.x
2016-11-23 18:06:28 +01:00
Marco Pivetta
2122297fdb #6028 removed specific ::class usage, since 2.5.x still supports PHP 5.4.x 2016-11-23 18:06:14 +01:00
Marco Pivetta
af99cba28c #6028 removed specific ::class usage, since 2.5.x still supports PHP 5.4.x 2016-11-23 18:02:15 +01:00
Luís Cobucci
9bcee455ca Make child entity share the timestamp region with parent class 2016-11-23 17:58:05 +01:00
Marco Pivetta
73e4be7c7b Merge branch 'fix/#5768-#5755-clone-proxy-private-properties-in-multi-level-inheritances-2.5' into 2.5
Close #5768
Close #5755
2016-09-10 20:51:13 +02:00
Ed Hartwell Goose
d7026c46ec Fixes #5755, uses '->getReflectionProperties()' instead of '->getReflectionClass()->getProperties()' to ensure all fields are copied, and adds test to confirm behaviour 2016-09-10 20:48:12 +02:00
Marco Pivetta
b7bfbb6adb Merge branch 'fix/#5689-avoid-object-hash-conflicts-due-to-merge-operations-2.5' into 2.5
Close #5689
2016-09-10 20:22:23 +02:00
Marco Pivetta
c9161fcd6f #5689 removed unused reflection access 2016-09-10 20:19:29 +02:00
Marco Pivetta
147f8fffff #5689 removed OidReuseTest, which was moved to UnitOfWork tests 2016-09-10 20:18:10 +02:00
Marco Pivetta
e73428a051 #5689 moved OidReuseTest contents into the UnitOfWork tests 2016-09-10 20:17:59 +02:00
Mathieu De Zutter
a3d93afc4f Additional assertion to check that unreferenced objects are not in UOW. 2016-09-10 20:16:38 +02:00
Mathieu De Zutter
b0e4e3eda4 Remove old code in comments. 2016-09-10 20:16:33 +02:00
Mathieu De Zutter
95dcf51ad5 Avoid conflicts due to spl_object_hash().
When merging an entity with a to-many association, it will store the
original entity data using the object hash of the to-be-merged entity
instead of the managed entity. Since this to-be-merged entity is not
managed by Doctrine, it can disappear from the memory. A new object
can reuse the same memory location and thus have the same object hash.
When one tries to persist this object as new, Doctrine will refuse it
because it thinks that the entity is managed+dirty.

This patch is a very naive fix: it just disables storing the original
entity data in case of to-many associations. It may not be the ideal
or even a good solution at all, but it solves the problem of object
hash reuse.

The test case relies on the immediate reusing of memory locations by
PHP. The variable $user has twice the same object hash, though referring
a different object. Tested on PHP 5.6.17

Without the fix, the test fails on the last line with:
A managed+dirty entity Doctrine\Tests\Models\CMS\CmsUser@[...] can not
be scheduled for insertion.
2016-09-10 20:16:28 +02:00
Marco Pivetta
5365a418e9 Removed non-existing CLASSNAME reference 2016-09-09 23:25:54 +02:00
Marco Pivetta
47ce079b64 Removing ::class usage (PHP 5.5 is not yet required on ORM 2.5) 2016-09-09 22:52:54 +02:00
Marco Pivetta
8e95672f49 Removing ::class usage (PHP 5.5 is not yet required on ORM 2.5) 2016-09-09 22:51:42 +02:00
Marco Pivetta
e16de704a1 Merge branch 'fix/#6001-second-level-cache-query-cache-timestamp-from-region-2.5' into 2.5
Close #6001
2016-09-08 14:02:07 +02:00
Marco Pivetta
3e57c46afd #6001 adding orderBy, limit and offset variables (defined in master, not in 2.5) 2016-09-08 14:01:56 +02:00
Marco Pivetta
5e702ad524 #6001 documenting minor BC break in QueryCacheEntry#time type - specific version used 2016-09-08 13:58:30 +02:00
Luís Cobucci
9e9864c684 The timestamp verification is now done by the validator
So it's useless to keep it here too.
2016-09-08 13:58:24 +02:00
Luís Cobucci
88567ea395 Evict query cache when entities are updated 2016-09-08 13:56:46 +02:00
Luís Cobucci
bf18aac62d Add timestamp key to QueryCacheKey 2016-09-08 13:54:47 +02:00
Luís Cobucci
4d16e30a16 Use microtime to have more precision on cache time 2016-09-08 13:54:03 +02:00
Marco Pivetta
d592c14a6c Merge branch 'fix/#6004-#5989-fix-hydration-in-a-joined-inheritance-with-simple-array-or-json-array-2.5' into 2.5
Close #6004
Close #5989
2016-09-08 13:38:57 +02:00
Carl Vuorinen
da41161d73 Add unit test for SimpleObjectHydrator 2016-09-08 13:38:34 +02:00
Carl Vuorinen
33e23cdddb PR fixes (public properties & correct letter case in annotations) 2016-09-08 13:38:31 +02:00
Carl Vuorinen
c47c23a101 Use yoda condition in the null check 2016-09-08 13:38:27 +02:00
Carl Vuorinen
7352b97b14 Fix hydration in a joined inheritance with simple array or json array
SimpleArrayType and JsonArrayType convert NULL value to an empty array, which fails the null check that is used to prevent overwrite
Fixes issue #5989
2016-09-08 13:38:23 +02:00
Carl Vuorinen
dce0aeaa15 Create a failing test for issue #5989
Field with type=simple_array in a joined inheritance gets overridden by empty array in the hydrator
2016-09-08 13:38:18 +02:00
Marco Pivetta
a2c23fb9cb Merge branch 'fix/#5975-fix_hydrating_fetch_join_with_composite_pk-2.5' into 2.5
Close #5975
Close #5762
Close #5776
2016-09-07 23:22:01 +02:00
Marco Pivetta
aa6dc9695d #5975 minor test cleanups 2016-09-07 23:20:47 +02:00
Marco Pivetta
c4a2a348f4 #5975 short array syntax 2016-09-07 23:20:43 +02:00
Alexander Kurilo
6ab27993fc Use ::class const instead of FQCN string (#5762) 2016-09-07 23:20:27 +02:00
Alexander Kurilo
5eedccc22a Remove irrelevant accessors (#5762) 2016-09-07 23:20:22 +02:00
John Keller
592122fbcb add functional test and bug fix for issue #5762 2016-09-07 23:20:17 +02:00
Marco Pivetta
aa5820309e Merge branch 'fix/#5867-allow-embeddable-usage-in-inheritance-2.5' into 2.5
Close #5867
Close #4097
Close #4277
2016-06-19 12:48:28 +02:00
Marco Pivetta
b183818fa8 #5867 s/::class/::CLASSNAME for PHP 5.4 compat 2016-06-19 12:48:15 +02:00
Marco Pivetta
2af84c6025 #5867 @group annotations, describing scenario 2016-06-19 12:47:05 +02:00
Marco Pivetta
f181cf6c6b #5867 simplifying test case by inlining all required models into the test case 2016-06-19 12:45:54 +02:00
Luís Cobucci
62431ae477 Allow the usage of embedded objects on parent classes.
The `ClassMetadataInfo` was always using the "current class" to
fetch the reflection of a property even when a field is declared
on the parent class (which causes `ReflectionProperty` to throw
an exception).
2016-06-19 12:45:47 +02:00
Marco Pivetta
0d93461e66 Merge branch 'fix/#5858-yaml-exporter-should-only-introspect-join-column-on-owning-association-side-2.5' into 2.5
Close #5858
2016-06-08 13:34:23 +02:00
Thomas Ploch
a5eb0f2e82 Exporters should only inspect joinColumns for owning side in bi-directional OneToOne
rebased commits:

- Added test case for bi-directional OneToOne in YamlExporter
- Only inspect joinColumns for owning side in bi-directional OneToOne in YamlExporter
- Adding bi-directional test case without joinColumn to XmlExporter test
- Same testcase also applied to PhpExporter
- Fixing bi-directional issue in PhpExporter when inspecting joinColumns index
- Implemented @Ocramius suggestions
2016-06-08 13:34:10 +02:00
Marco Pivetta
9a393ccba7 Removed reliance on ::class meta-constant (only available in PHP 5.5+) 2016-06-06 01:48:32 +02:00
Marco Pivetta
224ac9725e Removed annotation reader constructor argument (incorrect argument used) 2016-06-06 01:34:20 +02:00
Marco Pivetta
0af9ee0140 Merge branch 'fix/#5850-clearing-specific-entity-name-should-clear-also-its-entity-insertions-2.5' into 2.5
Close #5850
Close #5849
2016-06-06 00:34:54 +02:00
Marco Pivetta
fecadf059c #5849 #5850 renamed clearEntityInsertions to clearEntityInsertionsForEntityName, for clarity 2016-06-06 00:32:01 +02:00
Marco Pivetta
800215040a #5849 #5850 refactored clearIdentityMapForEntityName to remove useless looping 2016-06-06 00:31:56 +02:00
Marco Pivetta
ec4dd4ab44 #5849 #5850 renamed clearIdentityMap to clearIdentityMapForEntityName, for clarity 2016-06-06 00:31:51 +02:00
Marco Pivetta
7378035f68 #5849 #5850 correcting test scenario: identity map could not be built with auto-generated identities+persist 2016-06-06 00:31:23 +02:00
Marco Pivetta
7fbcbfa271 #5849 #5850 adding group annotations to the newly introduced test case 2016-06-06 00:30:46 +02:00
Rico Humme
4a38c96ec5 Correct naming convention of function. Was confusing otherwise 2016-06-06 00:30:42 +02:00
Rico Humme
110d771883 Split of functionality in separate functions 2016-06-06 00:30:37 +02:00
Rico Humme
996c5048ab Test Case for Clear entityInsertions for specific entityName 2016-06-06 00:30:33 +02:00
Rico Humme
cd746beae2 Clear entityInsertions for specific entityName 2016-06-06 00:30:28 +02:00
Marco Pivetta
dfbc6bbea3 Merge branch 'fix/#5599-having-regression-fix-2.5' into 2.5
Backport #5599 into 2.5
2016-01-16 10:29:29 -06:00
Bill Schaller
c4209b4654 Fix issue were identifier operands in /,* arithmetic terms were not checked to see if they're query components 2016-01-16 10:28:52 -06:00
Alessandro Lai
6279c80e05 Regression test: HAVING clause does not translate variable name when used with * and / math operators 2016-01-16 10:28:43 -06:00
Marco Pivetta
d05aa6a5e0 Bumping to development version 2.5.5-DEV 2016-01-05 22:36:06 +01:00
Marco Pivetta
bc4ddbfb01 Release 2.5.4 2016-01-05 22:34:58 +01:00
Marco Pivetta
14499f5021 Removing coveralls installation/reporting from 2.5: not required 2016-01-05 22:25:57 +01:00
Marco Pivetta
aae43cbb77 Merge branch 'hotfix/#1568-identifier-type-cached-incorrectly-backport-2-5' into 2.5
Backport #1568 to 2.5
2016-01-05 22:14:40 +01:00
Jan Langer
db6cb8dedc Second level cache stores identifier with correct type even if findById is called with wrong identifier type 2016-01-05 22:13:03 +01:00
Guido Contreras Woda
5092da074a Test that reflects the issue described in http://www.doctrine-project.org/jira/browse/DDC-3967 2016-01-05 22:12:55 +01:00
Marco Pivetta
1c6524db55 Bumping to development version 2.5.4-DEV 2015-12-25 16:50:31 +01:00
Marco Pivetta
d9fc5388f1 2.5.3 release 2015-12-25 16:50:05 +01:00
Marco Pivetta
d2e51eacff Reverting incorrect DBAL 2.6 bump 2015-12-25 16:49:48 +01:00
Marco Pivetta
5a6ae4686f Allowing doctrine/common 2.6 2015-12-25 15:58:40 +01:00
Marco Pivetta
8b8a1cbe81 Merge branch 'hotfix/common-2.6-upgrade-compat-2.5' into 2.5 2015-12-25 15:26:15 +01:00
Marco Pivetta
27a5284899 doctrine/common 2.6.0 compat
Less strict assertion - no need to check the exact file name
2015-12-25 15:24:37 +01:00
Marco Pivetta
0086d17afe Common 2.6 compatibility
Internal structure of the ArrayCache has changed, therefore we should fix the tests depending on it instead
2015-12-25 15:24:32 +01:00
Marco Pivetta
ab62167c8a Merge branch 'hotfix/#4884-support-proxy-php7-hints-generation-2.5' into 2.5
Close #4884
2015-12-25 14:47:12 +01:00
Marco Pivetta
6d43195669 #4884 - allow installation of doctrine/common 2.6.x, which allows generating type-hints on proxies 2015-12-25 14:46:59 +01:00
Marco Pivetta
7065ff0ac9 Merge branch 'hotfix/#1572-target-entity-resolver-dql-with-interfaces-support' into 2.5
Close #1572
2015-12-11 21:35:18 +01:00
Marco Pivetta
aa61328e90 #1572 - test coverage - interfaces should also resolve to target entities when in DQL 2015-12-11 21:30:19 +01:00
Marco Pivetta
62719f2a97 Merge branch 'hotfix/#1573-merge-associated-versioned-entity-2.5.x' into 2.5
Close #1573
2015-12-11 20:19:10 +01:00
Marco Pivetta
66770c5bfe #1573 - correcting test asset namespace, removing unused properties and bi-directional association 2015-12-11 20:18:53 +01:00
Marco Pivetta
42691c21b4 Removing empty newline 2015-12-11 20:18:48 +01:00
Marco Pivetta
596e895763 #1573 - correcting docblock arguments/description 2015-12-11 20:18:42 +01:00
Marco Pivetta
d5c82094df #1573 removing unused API 2015-12-11 20:18:37 +01:00
bilouwan
4148220f9c Refactor testing Proxy not initilized 2015-12-11 20:18:31 +01:00
bilouwan
e173c930ec Fix superflous whitespaces & empty lines 2015-12-11 20:18:25 +01:00
bilouwan
7071984559 Fix compatibility with php5.4 2015-12-11 20:18:19 +01:00
bilouwan
216c466233 Unit test & fix for merge versionned entity 2015-12-11 20:18:12 +01:00
Marco Pivetta
65f5777e60 Merge branch 'hotfix/php7-xdebug-incompatibility-fixes-2.5.x' into 2.5
Close #5547
2015-12-11 19:35:42 +01:00
Marco Pivetta
6e3ce26429 Correcting minor test case incompatibility with XDebug 2.4.x
In PHP 5.x + XDebug < 2.4, the output would be "string:..."
In PHP 7.x + XDebug >= 2.4, the output would be "the/file/name.php:11:string:..."

This is an improvement in XDebug that is quite annoying for our purposes, but is actually welcome to most users anyway.

This commit simply fixes that incompatibility
2015-12-11 19:35:28 +01:00
oprokidnev
752d4f9eac Target entity resolver for DQL
Since we have target entity resolver in doctrine this class check is not enought.
To gain interface resolution it is better to add interface check in addition to class_check here.
2015-11-27 16:00:56 +05:00
Marco Pivetta
2983081a60 Bumping current dev version to 2.5.3-DEV 2015-11-23 13:44:56 +01:00
Marco Pivetta
464b5fdbfb Release 2.5.2 2015-11-23 13:44:25 +01:00
Guilherme Blanco
04254a8e34 Merge pull request #1512 from neoglez/2.5
Backport of "LimitSubqueryOutputWalker: fix aliasing of property in OrderBy from MappedSuperclass"
2015-11-15 22:08:59 -05:00
Guilherme Blanco
1d213e6733 Merge pull request #1543 from nicolas-grekas/dep-30
Allow symfony 3.0 components on 2.5
2015-11-09 14:54:44 -05:00
Klein Thomas
bc82e94afc Move to 2.5 section 2015-11-09 03:56:16 +00:00
Klein Thomas
b9af1c8fa5 Update Upgrade.md after minor bc break in 2.5.1
The introduction of the second parameter in EntityRepository#createQueryBuilder generates a runtime notice if you have a sub-class of EntityRepository that has a second parameter in the createQueryBuilder method
2015-11-09 03:56:07 +00:00
Pantel
d606efd4eb [DDC-3711] add Test that check if the association key are composite 2015-11-09 03:46:06 +00:00
Pantel
581e1638a2 [DDC-3711] add Tests that check if the association key are composite 2015-11-09 03:45:56 +00:00
Pantel
17ae8d1b2d [DDC-3711] Correct Error on manyToMany with composite primary key 2015-11-09 03:45:46 +00:00
Guilherme Blanco
3a058f8522 Merge branch 'hotfix/#1375-prevent-duplicate-unique-index' into 2.5
Backported #1375 to 2.5
2015-11-07 16:47:26 +00:00
Michał Bundyra
567220ef71 prevent duplicate unique index 2015-11-07 16:46:22 +00:00
Marco Pivetta
39098ce415 Merge branch 'hotfix/#1507-fixed-wrong-property-name-in-resultset-mapping-builder' into 2.5
Backport merge #1507 into 2.5.x
Close #1507
2015-11-07 10:35:30 -05:00
François-Xavier de Guillebon
1eb9c8a7f6 Added test 2015-11-07 10:35:08 -05:00
François-Xavier de Guillebon
f2f53ba9dc Fixed wrong variable used as array key 2015-11-07 10:35:02 -05:00
François-Xavier de Guillebon
ebbc443ec3 Fixed wrong property name 2015-11-07 10:34:55 -05:00
Nicolas Grekas
16802d2614 Allow symfony 3.0 components
Tests should tell if any deprecated interfaces of Symfony are used. If not, then the bundle is defacto compatible with 3.0
2015-11-05 11:43:20 +01:00
neoglez
ef73249bc7 Entity to test a mapped superclass
Backport of https://github.com/doctrine/doctrine2/pull/1377/files to branch 2.5
2015-09-21 09:32:54 +02:00
neoglez
ed637e51b9 Backport of "fix aliasing of property in OrderBy from MappedSuperclass"
Backport of "LimitSubqueryOutputWalker: fix aliasing of property in OrderBy from MappedSuperclass" ( e501137d1a )
See my comment on a3ece3b419
2015-09-21 08:58:30 +02:00
neoglez
a3ece3b419 UnitTest backport of "Failing test case for broken paginator case"
UnitTest backport of "Failing test case for broken paginator case" ( 192da14842 ).
The branch 2.x is very important because it's related to ZF2 doctrine module (see https://github.com/doctrine/DoctrineORMModule/blob/master/composer.json ) and specially this issue affects the use case of extending the ZF2 user entity defined in ZfcUser ( https://github.com/ZF-Commons/ZfcUser ).
This test is meant to show the need of the backport of e501137d1a
2015-09-21 08:52:46 +02:00
Marco Pivetta
2d1bc78749 Merge branch 'hotfix/#1510-DDC-3908-fix-cache-related-tests-in-2.5' into 2.5
Close #1510
2015-09-19 10:45:24 +02:00
Matthias Pigulla
eaf8b1c7ca Fix tests related to caches, as per doctrine/cache 1.5.0 changes
Backports #1510
Fixes DDC-3908

dd47003641 removes the 'DoctrineNamespaceCacheKey[]' entry from the cache. Thus, all tests counting cache entries were off by one.
2015-09-19 10:44:47 +02:00
Benjamin Eberlei
8070b50150 Bump version to 2.5.2 2015-08-31 14:59:39 +02:00
Benjamin Eberlei
e6a83bedbe Release 2.5.1 2015-08-31 14:59:39 +02:00
Benjamin Eberlei
b6e5464b98 Fix version 2015-08-31 14:59:36 +02:00
Benjamin Eberlei
6366d190d7 [DCOM-293] Fix security misconfiguration vulnerability allowing local remote arbitrary code execution. 2015-08-31 14:58:12 +02:00
Bill Schaller
89eed31e79 Merge pull request #1463 from ehimen/paginate-order-by-subselect
Fixed issue when paginator orders by a subselect expression
Conflicts:
	tests/Doctrine/Tests/ORM/Tools/Pagination/LimitSubqueryOutputWalkerTest.php
2015-08-04 14:31:08 -04:00
Marco Pivetta
4ca00f7a9d Merge branch 'hotfix/#1387-DDC-3699-do-not-merge-managed-uninitialized-entities-2.5' into 2.5
Close #1387
2015-07-15 21:52:41 +01:00
Marco Pivetta
6bc405455e DDC-3699 - #1387 - leveraging the OrmFunctionalTestCase API 2015-07-15 21:52:25 +01:00
Marco Pivetta
173729e560 DDC-3699 - #1387 - catching specific exceptions 2015-07-15 21:52:20 +01:00
Marco Pivetta
86abbb0e78 DDC-3699 - #1387 - simpifying tests, clarifying on test method names 2015-07-15 21:52:16 +01:00
Lenard Palko
69ef75ff2d Added test cases for both one-to-one and one-to-many cases. 2015-07-15 21:52:08 +01:00
Lenard Palko
c68edec0c2 Fix skipping properties if they are listed after a not loaded relation. 2015-07-15 21:51:55 +01:00
Marco Pivetta
f9bbd953a7 Merge branch 'hotfix/#1381-wakeup-reflection-with-embeddable-and-staticreflection-serialization-fix-2.5' into 2.5
Close #1381
2015-07-15 20:50:28 +01:00
Nico Vogelaar
9097014c3d Fixes ClassMetadata wakeupReflection with embeddable and StaticReflectionService 2015-07-15 20:50:05 +01:00
Marco Pivetta
12d178777a Merge branch 'hotfix/#1380-non-cache-persister-bug-2.5' into 2.5
Close #1380
2015-07-15 20:45:38 +01:00
Marco Pivetta
ed1c4de2b6 DDC-3683 - #1380 - reverting BC break, annotating correct types, cs fixes 2015-07-15 20:45:02 +01:00
Darien Hager
fff56c7f3f Remove runtime assertion 2015-07-15 20:44:55 +01:00
Darien Hager
97e90ddefc Clarify state-changes, replace array_key_exists() with isset() for speed 2015-07-15 20:44:50 +01:00
Darien Hager
d5adda954d Whitespace formatting tweaks 2015-07-15 20:44:39 +01:00
Darien Hager
c507b52f20 Remove now-superfluous EntityManager check 2015-07-15 20:44:33 +01:00
Darien Hager
08be905fc3 Refactor LoadClassMetadataEventArgs to ensure it contains an EntityManager 2015-07-15 20:44:24 +01:00
Darien Hager
d29cc3660f Change the test listener than layers on second-level-caching so that it is more conservative, only turning on caching-associations when it knows the target entity is cache-able. 2015-07-15 20:44:10 +01:00
Darien Hager
768c291cd1 Stumbled across a bug where signatures didn't match, but also the current persister-type didn't support getCacheRegion(). Unsure of exact mechanism, but clearly the constructor doesn't take the second argument anyway, may be old code. 2015-07-15 20:43:51 +01:00
Bill Schaller
10ed690d99 Backport Merge pull request #1430 from michael-lavaveshkul/master
"INSTANCE OF" example doesn't match description.
2015-06-18 10:41:56 -04:00
Benjamin Eberlei
e4e59d8064 Merge branch 'DDC-3756' into 2.5 2015-06-16 21:44:14 +02:00
Restless-ET
0e208f7538 [2.5][Bug] Fix ConvertDoctrine1Schema->getMetadata
This bug was introduced at #1205 while resolving #1200.
2015-06-16 21:43:54 +02:00
Guilherme Blanco
3e6c6af845 Merge pull request #1382 from holtkamp/patch-second-level-cache-association-hydration
Patch second level cache association hydration
2015-04-14 11:57:54 -04:00
Marco Pivetta
584345397b Merge branch 'hotfix/#1374-fix-ddc-767-test-php7-pg94-2.5' into 2.5 2015-04-06 04:23:17 +01:00
Matteo Beccati
786791b8fe Fix DDC767Test failing on php7 + pg94
The failure happens when running the full suite or even just:

phpunit tests/Doctrine/Tests/ORM/Functional/Ticket
2015-04-06 04:23:03 +01:00
Marco Pivetta
724dfa0de3 Merge branch 'hotfix/#1361-persistent-collection-collection-hint-fix' into 2.5 2015-04-05 01:30:32 +01:00
Marco Pivetta
39592ba59c Correcting ObjectHydrator logic: if an array is a default value for a collection-valued property, it should be cast to a Collection 2015-04-05 01:29:59 +01:00
Marco Pivetta
58a6013d15 Correcting static introspection issue in cache specific tests (null was being passed to a PersistentCollection) 2015-04-05 01:29:52 +01:00
Marco Pivetta
4580429616 Removing irrelevant tests (as per discussion with @guilhermeblanco and @stof 2015-04-05 01:29:42 +01:00
Marco Pivetta
6e563a313e a PersistentCollection should only allow another collection as a wrapped collection 2015-04-05 01:29:35 +01:00
Marco Pivetta
e8c9cb2f23 Reverting BC break: PersistentConnection#__construct() now accepts null|array|Collection again 2015-04-05 01:29:28 +01:00
Marco Pivetta
4792b4f974 FQCN reference (class was not imported correctly) 2015-04-05 01:29:19 +01:00
Marco Pivetta
c2f6b09ee0 PersistentCollection should still accept null and array as constructor argument, as it did before 2015-04-05 01:29:08 +01:00
Marco Pivetta
cb3179865b Minor docblock correction (discovered during testing) 2015-04-05 01:29:00 +01:00
Marco Pivetta
a1602bd91f Hydration of fetch-joined results fails when an entity has a default value of array for the collection property 2015-04-05 01:28:53 +01:00
Marco Pivetta
34696126e0 Merge branch 'hotfix/#1365-query-dql-function-test-determinism-2.5' into 2.5 2015-04-05 00:10:25 +01:00
Bill Schaller
aa4b2e59ce fix rare query test failures due to nondeterminism without order by clause 2015-04-05 00:10:11 +01:00
Marco Pivetta
2cd86deeb4 Merge branch 'hotfix/#1360-docs-fix-misleading-embeddable-documentation-prefix' into 2.5 2015-04-02 23:25:11 +01:00
Stefan Blanke
293c6f6313 Fixed misleading typo in Embeddables tutorial 2015-04-02 23:19:26 +02:00
Marco Pivetta
52288abf48 Merge branch 'docs/#1359-correcting-mapping-in-working-with-objects-reference' into 2.5 2015-04-02 21:56:03 +01:00
Marco Pivetta
f495dfcc9c Merge branch 'docs/#1359-correcting-mapping-in-working-with-objects-reference' 2015-04-02 21:55:57 +01:00
Juti Noppornpitak
3b6616fe65 Fixed typo in the documentation 2015-04-02 16:46:25 -04:00
Marco Pivetta
f20de54281 Bumping version to 2.6.0-DEV 2015-04-02 21:42:47 +01:00
Marco Pivetta
aa80c7d2c5 Preparing for v2.5.0 release 2015-04-02 21:40:18 +01:00
Marco Pivetta
f8270d7bb2 Bumping branch alias for master to 2.6.x-dev 2015-04-02 21:40:05 +01:00
Marco Pivetta
7ecadb4c61 Merge pull request #1358 from zerocrates/patch-1
Update docs for clear-cache commands
2015-04-02 20:33:51 +01:00
Marco Pivetta
014d554c28 Merge pull request #1355 from scaytrase/patch-1
[Docs] TablePrefix example - Check for being the owning side
2015-04-02 20:31:27 +01:00
Marco Pivetta
8d186528e6 Merge pull request #1357 from DavidPrevot/exec
Drop useless execution bit
2015-04-02 20:30:23 +01:00
John Flatness
5058312d6d Update clear-cache command docs 2015-04-01 17:10:40 -04:00
David Prévot
b7cf41ca45 Drop useless execution bit 2015-04-01 16:01:22 -04:00
Pavel Batanov
ac70c18d50 Check for the being owning side
* Small fix do get rid of notice `undefined index 'joinTable'` as the inverse side does not declare `joinTable` at all.
* Shortened access to `$classMetadata->associationMappings[$fieldName]` for read accesses to increase readability
2015-04-01 14:55:52 +03:00
Marco Pivetta
61bcfda167 Bumping version to v2.5.0-DEV 2015-03-31 22:13:40 +01:00
Marco Pivetta
afd0f28c5f Bumping version for v2.5.0-RC2 release 2015-03-31 22:12:50 +01:00
Marco Pivetta
13ef9fd179 Merge branch 'hotfix/#1350-default-property-value-for-sql-filter'
Close #1350
2015-03-31 22:03:20 +01:00
Marco Pivetta
9a2afd1a9a #1350 - parameters should be an array by default 2015-03-31 22:02:48 +01:00
mmoreram
f6a1ea4859 Assigned default value to array
* For strict configurations of PHP, we were accessing to a non-array element
2015-03-31 22:02:05 +01:00
Marco Pivetta
82230cc427 Merge branch 'hotfix/#1353-#1347-#1351-fix-paginator-sorting-and-fetch-joining'
Close #1353
2015-03-31 21:55:27 +01:00
Marco Pivetta
ba00fc1e90 #1353 #1347 #1351 - s/inSubselect/inSubSelect (with docblock documentation) 2015-03-31 21:51:56 +01:00
Marco Pivetta
6c5dbd8d4c #1353 #1347 #1351 - Removing double quotes (confusing) 2015-03-31 21:50:08 +01:00
Bill Schaller
5c93e61686 Fix issue in LimitSubqueryOutputWalker with entities having field names different from column names 2015-03-31 21:39:21 +01:00
Kristopher Wilson
9d7aa9ba39 Adding failing test case for PaginationTest
The failure comes into play when an entity has an attribute named
differently from its corresponding column name.
2015-03-31 21:39:21 +01:00
Bill Schaller
608dfa2f57 Add more detection in LimitSubqueryWalker for conditions that must be handled by LimitSubqueryOutputWalker 2015-03-31 21:39:20 +01:00
Bill Schaller
b76107e20f resolve review comments from @stof 2015-03-31 21:39:20 +01:00
Bill Schaller
edcc0fc024 Fix paginator when ordering by while selecting entities using joined table inheritance 2015-03-31 21:39:20 +01:00
Bill Schaller
09d28819b5 Fix issue where paginating on a query with a subquery in the where clause crashed 2015-03-31 21:38:58 +01:00
Bill Schaller
af3f5c5c5a Add test for paginating on a query with a subquery in the where clause
Conflicts:
	tests/Doctrine/Tests/ORM/Tools/Pagination/LimitSubqueryOutputWalkerTest.php
2015-03-31 21:38:58 +01:00
Kristopher Wilson
a4aa18f796 test case for joined table inheritance pagination 2015-03-31 21:38:58 +01:00
Bill Schaller
010d52378c Fix LimitSubqueryOutputWalkerTest 2015-03-31 21:36:33 +01:00
Bill Schaller
a8342a4be2 Cleanup 2015-03-31 21:36:33 +01:00
Alexander Orabey
f92307d06d problem with LimitSubqueryOutputWalker when use InheritanceType
Conflicts:
	tests/Doctrine/Tests/OrmFunctionalTestCase.php
2015-03-31 21:36:32 +01:00
Bill Schaller
ff75a3ad49 Fix paginator issues when ordering by a joined column from a to-many association.
Manual merge testcase from #1351
2015-03-31 21:36:32 +01:00
Bill Schaller
54d7efd92c Fix LimitSubqueryOutputWalker when used on tables with joined table inheritance 2015-03-31 21:32:28 +01:00
Marco Pivetta
b923c937e2 Merge branch 'hotfix/#1352-entity-generator-new-class-metadata-hotfix'
Close #1352
2015-03-31 08:45:48 +01:00
Fedik
5cd8334897 fix EntityGenerator RegenerateEntityIfExists 2015-03-27 13:10:14 +02:00
Marco Pivetta
60bacda685 Bumping version to 2.5.0-DEV 2015-03-25 23:16:30 +00:00
Marco Pivetta
df902c9c6a Preparing release v2.5.0-RC1 2015-03-25 23:14:52 +00:00
Marco Pivetta
cf1ecffb14 Merge pull request #1339 from BenMorel/dqlcustomtype
[DDC-2224] Honor convertToDatabaseValueSQL() in DQL query parameters
2015-03-25 01:27:05 +00:00
Benjamin Morel
9eb458caa6 Query::_getQueryCacheId() directly accesses $this->_parsedTypes 2015-03-24 17:14:45 +01:00
Marco Pivetta
dc99ed286a Merge branch 'hotfix/#1342-paginator-functional-test-integration-take2'
Close #1342
Close #1337
Close #1325
2015-03-24 00:39:03 +00:00
Marco Pivetta
d97d3ec0e5 Minor CS fixes (braces) 2015-03-24 00:37:17 +00:00
Marco Pivetta
45d39dd50d Making preserveSqlOrdering API private 2015-03-24 00:36:13 +00:00
Marco Pivetta
6dfff304f3 Merge branch 'hotfix/#1337-fix-oracle-postgresql-paginator-sorting-issues' into hotfix/#1342-paginator-functional-test-integration 2015-03-24 00:25:12 +00:00
Bill Schaller
147bdd8ede Fixed nitpicks from @stof 2015-03-24 00:25:12 +00:00
Bill Schaller
81ccd93b74 Add thorough functional tests for Paginator, expand existing ones. 2015-03-24 00:25:12 +00:00
Marco Pivetta
06998d015f Skipping DDC-3634 tests when a post-insert generator is unavailable 2015-03-24 00:20:03 +00:00
Marco Pivetta
70c8591bbe Merge pull request #1343 from karlrixon/master
Support embeddables in partial object query expression [DDC-3621]
2015-03-23 23:43:36 +00:00
Marco Pivetta
22d699008c Merge branch 'hotfix/#1346-post-insert-big-integer-cast-avoidance'
Close #1346
2015-03-23 23:38:21 +00:00
Marco Pivetta
4c119c44a1 Completed test coverage for DDC-3634 2015-03-23 23:37:36 +00:00
Marco Pivetta
cbdf23ca65 Verifies that identifiers are kept as strings when dealing with large numbers 2015-03-23 23:29:22 +00:00
Marco Pivetta
34168d7085 Merge pull request #1345 from zeroedin-bill/fix-crash-in-convertmapping-command
Fix crashes in ConvertMappingCommand and GenerateEntitiesCommand...
2015-03-23 22:35:33 +00:00
Jonathan H. Wage
525c77d4a1 Update docs theme submodule. 2015-03-23 22:10:06 +00:00
Josef Kříž
e57be9da5e Fix: generated IDs are converted to integer 2015-03-23 17:51:04 +01:00
Karl Rixon
6070c9395d Functional tests for partial selection with embeddables [DDC-3630] 2015-03-23 15:44:06 +00:00
Josef Kříž
d1a695b42b Typo in phpdoc 2015-03-23 15:57:41 +01:00
Bill Schaller
4b10db3a43 Fix crashes in ConvertMappingCommand and GenerateEntitiesCommand when using entities with joined table inheritance
ConvertMappingCommand and GenerateEntitiesCommand both use the DisconnectedClassMetadataFactory, which allows metadata manipulation without loading the associated classes. Commit a36bea broke these two commands by adding a bailout condition in ClassMetadataFactory::populateDiscriminatorValue which checks $metadata->reflClass->isAbstract(). If the DisconnectedClassMetadataFactory is being used, $metadata->reflClass will always be null, causing a fatal error, "Fatal error: Call to a member function isAbstract() on null".

This commit adds a check to see if $metadata->reflClass is set before checking isAbstract.
2015-03-20 13:59:27 -04:00
Guilherme Blanco
e6887954ec Merge pull request #1344 from zeroedin-bill/fix-slc-tests-console-decoration
Fix tests for SLC console commands failing due to console output decoration
2015-03-20 13:52:00 -04:00
Bill Schaller
b057b64c1c Fix tests for SLC console commands failing due to comparison with decorated console output. 2015-03-20 13:45:49 -04:00
Bill Schaller
4c84f54493 Fix failures on SQL Server due to scalar select items not having an alias 2015-03-19 17:09:47 -04:00
Bill Schaller
591fd00d73 Fix capitalization of mapping annotations in PaginationTestCase.php 2015-03-19 16:47:04 -04:00
Marco Pivetta
24425436b0 Bumping version constants to 2.5.0-DEV 2015-03-18 22:38:42 +00:00
Marco Pivetta
483d48cc54 Bumping version constants for the 2.5.0-BETA1 release 2015-03-18 22:38:18 +00:00
Marco Pivetta
05db65d034 Merge pull request #1341 from javiereguiluz/patch-6
[doc] Minor fixes and typos
2015-03-18 22:02:15 +00:00
Javier Eguiluz
be18915ed6 Minor fixes and typos 2015-03-18 17:27:31 +01:00
Benjamin Eberlei
b3a6fb7fde [DDC-3461] Renamed AssocationBuilder::isPrimaryKey() to makePrimaryKey(). Same for FieldBuilder and depreceating isPrimaryKey(). Adjust tests. Revert change in ClassMetadataInfo and fix bug. 2015-03-18 17:06:30 +01:00
Marco Pivetta
df8be6f31e Correcting import that was colliding with another already imported User type 2015-03-17 23:58:53 +00:00
Marco Pivetta
4daf383e4f Merge pull request #1303 from mrkrstphr/querybuilder-get-all-aliases
make QueryBuilder::getAllAliases public
2015-03-17 23:33:43 +00:00
Marco Pivetta
3b0fb6b4b8 Merge pull request #1274 from doctrine/persistent-collection-as-lazy-collection
PersistentCollection now extends AbstractLazyCollection.
2015-03-17 23:32:17 +00:00
Marco Pivetta
1add0a04fa Merge pull request #1302 from goetas/pr1301
Store column values of not cache-able associations
2015-03-17 23:27:04 +00:00
Benjamin Morel
517cb7e2a2 Honor convertToDatabaseValueSQL() in DQL query parameters 2015-03-18 00:24:41 +01:00
Marco Pivetta
0738571b7d Merge branch 'feature/#1316-allow-non-public-schema-join-tables'
Close #1316
2015-03-17 23:16:26 +00:00
Marco Pivetta
648fde8914 #1316 - removing useless null check (redundant with isset()), cs cleanups 2015-03-17 23:16:16 +00:00
Marco Pivetta
4095bbaa92 #1316 - adding @group annotation to newly introduced tests 2015-03-17 23:15:07 +00:00
Marco Pivetta
0c0d3a1a7c #1316 - removing unused API from stub class 2015-03-17 23:14:29 +00:00
Marco Pivetta
bfd628e153 #1316 - refactoring test code to reduce the number of actual involved systems (quote strategy) 2015-03-17 23:14:13 +00:00
molchanoviv
ab740abe96 Add DefaultQuoteStrategyTest::testGetJoinTableName() test 2015-03-17 23:03:03 +00:00
molchanoviv
f244db80fb Allow to join non-public schema tables 2015-03-17 23:03:03 +00:00
Marco Pivetta
8f0b3398d3 Merge branch 'hotfix/#1327-entity-generator-default-property-value-export'
Close #1327
2015-03-17 22:47:50 +00:00
Jeremy
ac9a5e69ec Properly generate default value from yml & xml mapping 2015-03-17 22:47:11 +00:00
Bill Schaller
5c4b6a2140 resolve nitpicks from @Ocramius and @deeky666 2015-03-17 18:44:03 -04:00
Marco Pivetta
ce41e35c1f Merge branch 'hotfix/#1338-identity-map-garbage-collection-prevention-on-canceled-remove'
Close #1338
2015-03-17 22:38:19 +00:00
Marco Pivetta
0a2d9fa130 #1338 - Removing redundant test case 2015-03-17 22:36:00 +00:00
Bill Schaller
d710555265 Remove shameful hack in LimitSubqueryOutputWalker - replace with significantly less shameful hack 2015-03-17 18:32:57 -04:00
Marco Pivetta
504552e779 Adding @group annotations for newly introduced tests 2015-03-17 22:31:05 +00:00
Marco Pivetta
b721841c73 #1338 DDC-3619 - moved test to unit of work tests 2015-03-17 22:30:06 +00:00
nclavaud
b492d61398 Update identityMap when entity gets managed again
http://www.doctrine-project.org/jira/browse/DDC-3619

When using SoftDeleteable doctrine extension, an entity can be scheduled
for deletion, then persisted before flushing. In such a case, the entity
was removed from the unit of work identity map and no reference was
hold. This could lead to spl_object_hash collisions, and prevent
another, new entity to be persisted later.

This fix makes sure the unit of work identity map holds a reference to
the entity after it has been soft-deleted.
2015-03-17 22:19:10 +00:00
Bill Schaller
df0875c596 Fix Paginator OrderBy clauses when ordering by columns from non-fetched joined tables 2015-03-17 17:32:28 -04:00
Marco Pivetta
da72f3e62c Merge branch 'hotfix/#1336-handle-custom-object-type-identifiers-in-uow'
Close #1336
2015-03-17 21:31:03 +00:00
Marco Pivetta
5c89bb8c6b #1336 DDC-3622 - removing implicit cast from string to CustomIdObject in entity API (confusing) 2015-03-17 21:29:30 +00:00
Marco Pivetta
712b6a7a64 #1336 DDC-3622 - adding @group annotations for newly introduced tests 2015-03-17 21:23:16 +00:00
Marco Pivetta
11da060668 #1336 - class constants over string references in tests - removing useless QueryBuilder usage 2015-03-17 21:21:20 +00:00
Marco Pivetta
40c41857e8 #1333 - Removing unused is_string() function call and cast (always a string) 2015-03-17 21:12:20 +00:00
Marco Pivetta
d6687e070e #1333 - Removing useless is_string() function call, clarifying docblock parameters 2015-03-17 21:11:43 +00:00
Stefano Torresi
5d6a39d14c fix tests tear down 2015-03-17 21:08:07 +00:00
Stefano Torresi
904bcfa4f9 add docs notice about custom object types as IDs 2015-03-17 21:08:07 +00:00
Stefano Torresi
c7ad932b5f fix copyright notices 2015-03-17 21:08:07 +00:00
Stefano Torresi
1b850fbb23 add missing return statement 2015-03-17 21:08:07 +00:00
Stefano Torresi
2bdc1142fe add string casting to id hashes 2015-03-17 21:08:06 +00:00
Stefano Torresi
41e873bd72 add failing functional test for custom id object types 2015-03-17 21:08:06 +00:00
Marco Pivetta
32137c72e4 Merge branch 'hotfix/#1333-datetime-immutable-dql-parameter-inference'
Close #1333
2015-03-17 21:01:05 +00:00
Marco Pivetta
376e74fb7e #1333 - minor CS fixes - spacing/PSR-2 2015-03-17 20:59:56 +00:00
Jan Langer
8ac66bb608 Allow DateTimeInterface as parameter value 2015-03-17 20:58:20 +00:00
Bill Schaller
eebce88146 Revert "Revert "Merge branch 'hotfix/#1220-sort-paginator-subquery-output-only-once'""
This reverts commit 6a1755972d.
2015-03-17 13:58:50 -04:00
Karl Rixon
778ed04eac Support embeddables in partial object query expression [DDC-3621] 2015-03-17 15:46:01 +00:00
Marco Pivetta
2fb11cdf05 Merge pull request #1335 from BenMorel/queryreturntype
Fix AbstractQuery::getParameter() documented return type
2015-03-17 14:58:21 +00:00
Benjamin Morel
8d7ba1aebb Fixed AbstractQuery::getParameter() documented return type 2015-03-17 15:53:09 +01:00
Marco Pivetta
89ab4b3f48 Merge pull request #1334 from acrobat/internal-phpdoc-fix
Changed some wrong usage of the @internal phpdoc
2015-03-15 19:08:02 +01:00
Jeroen Thora
a409e7591d Changed some wrong usage of the @internal phpdoc 2015-03-15 16:53:34 +01:00
Marco Pivetta
6cf76158a0 Merge pull request #1329 from Wilt/patch-1
Fix for inconsistent use of getSQLDeclaration
2015-03-13 17:44:40 +01:00
Marco Pivetta
d87118437e Merge pull request #1330 from coolmic/patch-1
Fix @Column options sections in documentation
2015-03-12 22:16:28 +01:00
Marco Pivetta
cdc739b7f8 Merge pull request #1331 from 1ed/patch-2
[DOCS] Fixed class name in aggregate fields example
2015-03-12 22:14:38 +01:00
Gábor Egyed
6a75bf078b [DOCS] Fixed class name in aggregate fields example 2015-03-12 19:27:54 +01:00
Coolmic
f2d8b6d762 Fix @Column options sections
I lose hours to find out how to make column collation works, mostly because of incorrect docs.

Annotations options is the equivalent of customSchemaOptions in https://github.com/doctrine/dbal/blob/master/docs/en/reference/schema-representation.rst

See d1e5034659/lib/Doctrine/ORM/Tools/SchemaTool.php (L443)
2015-03-12 12:22:59 +01:00
Wilt
228dc895ca getSqlDeclaration -> getSQLDeclaration
Fixed inconsistent use of getSQLDeclaration method
2015-03-11 14:14:29 +01:00
Wilt
a6931dedaf getSqlDeclaration -> getSQLDeclaration
Fixed inconsistent use of getSQLDeclaration method
2015-03-11 14:07:04 +01:00
Wilt
5ae888b853 getSqlDeclaration -> getSQLDeclaration
Fixed inconsistent use of getSQLDeclaration method
2015-03-11 14:06:36 +01:00
Wilt
ea70e080c2 getSqlDeclaration -> getSQLDeclaration
Fixed inconsistent use of getSQLDeclaration method
2015-03-11 14:05:36 +01:00
Marco Pivetta
cfc7236599 Merge pull request #1319 from TomasVotruba/patch-1
travis: PHP 7.0 nightly added
2015-03-11 01:12:18 +01:00
Marco Pivetta
a3f9f153dd Merge pull request #1321 from vvh-empora/master
embeddedClasses support...
2015-03-10 21:53:05 +01:00
Marco Pivetta
73d4d88ba1 Merge pull request #1326 from guiwoda/orphan-removal-association-builder
Allow AssociationBuilder to set a relation as orphan removal
2015-03-09 23:18:59 +01:00
Guido Contreras Woda
71821bb7a3 Allow AssociationBuilder to set a relation as orphan removal 2015-03-09 18:54:35 -03:00
Volker von Hoesslin
0824c6136d unittest DDC3597: fix for PHP 5.4 2015-03-04 11:55:08 +01:00
Marco Pivetta
34b7f07344 Merge pull request #1322 from dennisbirkholz/patch-1
Typo in documentation
2015-03-04 03:07:37 +00:00
Volker von Hoesslin
2aef87c9b2 add unittest for DDC3597 2015-03-03 16:59:48 +01:00
Dennis Birkholz
69e5562de4 Typo in documentation
Two list items where just one
2015-03-03 16:57:51 +01:00
vvh-empora
6afcac84d0 embeddedClasses support...
...for JoinedSubclassPersister.php
2015-03-03 11:40:19 +01:00
Tomas Votruba
0e14136fad travis: PHP 7.0 nightly added 2015-03-02 20:41:50 +01:00
Marco Pivetta
f2f47930e6 Merge pull request #1320 from joshdifabio/patch-1
Fix 'entitiy' typo in Getting Started tutorial
2015-03-02 16:58:05 +00:00
Joshua Di Fabio
dce76bba60 Fix 'entitiy' typo in Getting Started tutorial 2015-03-02 16:53:44 +00:00
Guilherme Blanco
b1d918b124 Fixed more broken tests. 2015-03-01 23:57:38 -05:00
Guilherme Blanco
588c92875d Removed fragile test. 2015-03-01 00:32:43 -05:00
Guilherme Blanco
19f18fa069 PersistentCollection now extends AbstractLazyCollection. 2015-03-01 00:30:21 -05:00
Guilherme Blanco
6e40361fe7 Merge pull request #1311 from jankramer/DDC-3582-nested-embeddable-hydration
[DDC-3582] Wrong class is instantiated when using nested embeddables
2015-02-27 10:31:58 -05:00
Jan Kramer
f09b9895b6 Fix embeddable instantiation in nested situations 2015-02-27 15:09:58 +01:00
Jan Kramer
c059de9e60 Implement test to show nested embeddables are not instantiated properly 2015-02-27 15:09:22 +01:00
Marco Pivetta
a41e774bb1 Merge pull request #1314 from FabioBatSilva/date-add-second
DATE_ADD - Support for seconds
2015-02-26 10:20:52 +00:00
Marco Pivetta
94223621dc Merge pull request #1315 from GeekMode/GeekMode-patch-url-fix
Fixed broken url for implementing Serializable interface
2015-02-26 08:49:22 +00:00
Niro
1afaec9cbf Fixed broken url for implementing Serializable interface 2015-02-26 02:53:37 -05:00
Guilherme Blanco
7fc1dc9209 Merge pull request #1313 from doctrine/querybuilder-indexby
Added programmatical support to define indexBy on root aliases.
2015-02-25 14:42:13 -05:00
FabioBatSilva
57bcd7cd3d DATE_ADD - Support for seconds 2015-02-25 14:32:51 -05:00
Guilherme Blanco
5ab4c3d50c Added programatical support to define indexBy on root aliases. 2015-02-25 14:29:10 -05:00
Guilherme Blanco
1369cdda2b Merge pull request #1312 from ThomasLomas/master
Add proper pluralization into UpdateCommand
2015-02-24 13:37:34 -05:00
Thomas Lomas
37f5c82d15 Add proper pluralization into UpdateCommand 2015-02-24 18:13:13 +00:00
Asmir Mustafic
d33ee5e7ff Removed unnecessary API from test cases 2015-02-24 08:53:22 +01:00
Guilherme Blanco
4680a7b861 Fixed bug where embedded reflection fields were never exposed to userland. 2015-02-20 14:10:28 -05:00
Asmir Mustafic
4d43f5ca52 Tested composite keys on non cache-able entities 2015-02-20 19:00:32 +01:00
Asmir Mustafic
d72ad9cc50 Handling composite keys on non cache-able entities 2015-02-20 10:00:36 +01:00
Marco Pivetta
38c819ae04 Merge pull request #1305 from guillaumerobin/patch-2
Documentation : fix table prefix with STI
2015-02-16 21:35:28 +00:00
Guillaume Robin
1661d96b92 Documentation : fix table prefix with STI
If an Entity use STI, it gets its table name from the parent class. In this case, we need to check that the class is the root class of the hierarchy when adding prefix, otherwise children class are prefixed twice.
2015-02-16 22:11:30 +01:00
Kristopher Wilson
a6448f5c77 make QueryBuilder::getAllAliases public 2015-02-16 08:31:14 -05:00
Asmir Mustafic
24dd0c6a55 Fixed delete order on tearDown method 2015-02-16 08:55:27 +01:00
Asmir Mustafic
b9577bf2f3 Added tests for many-to-one non cache-able relations 2015-02-16 08:55:27 +01:00
Asmir Mustafic
60164931b8 Handled one-to-many non cache-able relations 2015-02-16 08:55:27 +01:00
Asmir Mustafic
a2461d6d5f Use identifier flattener to retrevie entity identifiers 2015-02-16 08:55:27 +01:00
Asmir Mustafic
58e20c70c6 Store column values of not cache-able associations 2015-02-16 08:55:27 +01:00
Michaël Gallego
ed6fa0deb4 Add failing test 2015-02-16 08:55:27 +01:00
Marco Pivetta
a13143b1ac Merge branch 'feature/#1229-to-one-association-builder'
Close #1229
2015-02-16 02:06:32 +00:00
Marco Pivetta
1f67218dc5 #1229 - code style fixes (alignment/spacing) 2015-02-16 02:06:22 +00:00
Guido Contreras Woda
baeab5d4f4 More consistent test naming 2015-02-16 02:02:29 +00:00
Guido Contreras Woda
51881fed94 Added tests and validation on joinColumns being set before checking if its a composite key. 2015-02-16 02:02:29 +00:00
Guido Contreras Woda
cd728344e9 Allow an association to be set as primary key through the builder 2015-02-16 02:02:29 +00:00
Marco Pivetta
b5238966d1 Merge branch 'hotfix/#1295-fix-join-when-re-creating-query-builder-from-parts'
Close #1295
2015-02-16 01:23:54 +00:00
Dries De Peuter
4a6afb46e2 Fix join when recreation of query from parts. 2015-02-16 01:23:27 +00:00
Marco Pivetta
f90897465c Merge branch 'hotfix/#1113-composite-pk-improved-support'
Close #1113
2015-02-16 01:17:48 +00:00
Marco Pivetta
2a99d5a19b #1113 - minor CS fixes (spacing/alignment) 2015-02-16 01:02:56 +00:00
Asmir Mustafic
8eea7c86f7 Resolve association entries on multi get cache 2015-02-16 00:53:48 +00:00
Asmir Mustafic
cb52782e5e Default Version Value identifier is always an array 2015-02-16 00:53:47 +00:00
Asmir Mustafic
c9e66e464d Changed getSelectConditionStatementColumnSQL return docblock 2015-02-16 00:53:47 +00:00
Asmir Mustafic
1630ec1ebd Fixed owing-inverse side search by criteria 2015-02-16 00:53:47 +00:00
Asmir Mustafic
4d531d8855 Right type detection on to-many relations 2015-02-16 00:53:47 +00:00
Asmir Mustafic
4323d9ce4c Removed unused methods 2015-02-16 00:53:47 +00:00
Asmir Mustafic
7948b0c160 Identity map check 2015-02-16 00:53:47 +00:00
Asmir Mustafic
5838115582 Fixed type checking on to-many relations 2015-02-16 00:53:47 +00:00
Asmir Mustafic
2e890362c5 Tested second level cache with composite primary keys 2015-02-16 00:53:46 +00:00
Asmir Mustafic
51b34919ba Second level cache check with composite primary keys 2015-02-16 00:53:46 +00:00
Asmir Mustafic
7222991b13 Tested composite primary key support 2015-02-16 00:53:46 +00:00
Asmir Mustafic
5e29bbd41f Improved composite primary key support 2015-02-16 00:53:46 +00:00
Asmir Mustafic
2eb7dedf4f Refactored IdentifierFlattener 2015-02-16 00:53:46 +00:00
Marco Pivetta
081ad0efbe Merge pull request #1297 from eugene-dounar/docs-embeddable-mapping
[DDC-3480] Docs: Embeddable supported mappings
2015-02-14 23:20:09 +01:00
Marco Pivetta
eb90cf0c3b Merge pull request #1298 from eugene-dounar/docs-clean-up-toc
Docs: Remove empty pages from TOC
2015-02-14 23:18:48 +01:00
Guilherme Blanco
4c68a38bd6 Merge pull request #1294 from weaverryan/target-platform-when-needed
Avoid Connection error when calling ClassMetadataFactor::getAllMetadata()
2015-02-04 16:42:55 -05:00
Ryan Weaver
0e08633790 Adding docblock 2015-02-04 13:51:02 -05:00
Ryan Weaver
75bb3a0de3 Small code change thanks to the comments and adding a test 2015-02-04 13:49:51 -05:00
Steve Müller
a0f3b75ec0 Merge pull request #1299 from javiereguiluz/patch-5
Fixed missing quote in one DQL example
2015-02-04 11:40:57 +01:00
Javier Eguiluz
aa0f18def3 Fixed missing quote in one DQL example 2015-02-04 11:12:15 +01:00
Eugene Dounar
f996f6583a Remove empty pages from TOC
Remove Installation page from TOC as it was moved to "Installation and
Configuration"
2015-02-04 00:44:57 +03:00
Eugene Dounar
cd7f91910b Docs: Embeddable supported mappings
Mention that only basic mapping is supported by embeddables
2015-02-04 00:17:13 +03:00
Marco Pivetta
78d3f51140 Merge pull request #1296 from joenivl/patch-1
Flip key value in $namespaces array
2015-02-03 14:48:44 +00:00
Jeroen van Leeuwen
f9cf2b6a95 Flip key value in $namespaces array
Key value should be other way around.
2015-02-03 14:54:21 +01:00
Guilherme Blanco
64ef89ce4c Merge pull request #1292 from goetas/private-method-mark
Mark getSelectConditionStatementColumnSQL method as private
2015-01-28 22:11:49 -05:00
Ryan Weaver
b30d1dd39c Only getting the target platform when it's *actually* needed to avoid errors
initialize() is called sometimes, even when the following code doesn't need
the targetPlatform property. Specifically, in AbstractClassMetadataFactory::getAllMetadata().

But as of DBAL 2.5.0, calling Connection::getDatabasePlatform() will make a
connection to the database, which means that sometimes it may fail (e.g. you
haven't configured your database yet). As a result, calling a method like
AbstractClassMetadataFactory::getAllMetadata() - which does not need the
targetPlatform - will fail, because determining the targetPlatform requires
a connection, which fails.

This avoids that - we only get the targetPlatform *when* we need it, which
are cases where we're doing things that do indeed need a connection.
2015-01-28 20:17:28 -05:00
Asmir Mustafic
fb5cd928ee Mark getSelectConditionStatementColumnSQL method as private 2015-01-28 23:55:20 +01:00
Marco Pivetta
17a23ea825 Merge pull request #1222 from guiwoda/embeddables-in-metadata-builder
Embeddables in metadata builder
2015-01-28 22:25:10 +00:00
Marco Pivetta
3ed73b4a60 Merge pull request #1288 from Ocramius/hotfix/#1169-extra-lazy-one-to-many-is-noop-when-not-doing-orphan-removal
Hotfix - #1169 - extra lazy one to many must be no-op when not doing orphan removal
2015-01-28 20:27:22 +00:00
Marco Pivetta
e76b20b109 #1169 DDC-3343 - removing note about query count assertion 2015-01-28 20:01:57 +00:00
Marco Pivetta
ffaffa0b8a Merge pull request #1290 from phansys/doc-slc
[Doc] [Reference] [Second Level Cache]
2015-01-27 16:37:22 +00:00
Javier Spagnoletti
c6158ae3f4 Updated reference for Second Level Cache (fixed some typos and docblocks). 2015-01-27 13:24:35 -03:00
Marco Pivetta
969788d928 Merge pull request #1289 from deeky666/improve-testsuite
Improve test suite
2015-01-27 12:24:36 +00:00
Steve Müller
3b61d2d0fe initialize database schema only once and avoid unnecessary connections 2015-01-27 12:28:31 +01:00
Steve Müller
75e41eefb5 fix indentation 2015-01-27 10:02:57 +01:00
Steve Müller
5795d53ca7 remove temporary database dependencies from Travis build 2015-01-27 09:44:06 +01:00
Steve Müller
2fbc483fe3 apply current implementation from DBAL @ dcdf744e3fdd2ba99239ee41009e08a4b6450eff 2015-01-27 09:40:45 +01:00
Marco Pivetta
c7a6352b08 #1169 DDC-3343 - eagerly evicting cache if a persister passes a delete operation down to the DB 2015-01-27 09:04:28 +01:00
Marco Pivetta
a9671fdc2e #1169 DDC-3343 - eagerly evicting cache if a persister passes a delete operation down to the DB 2015-01-27 09:04:00 +01:00
Marco Pivetta
c4019d96b9 #1169 DDC-3343 - when a deletion fails for some reason, related cache entries should be evicted to avoid collisions with DB state 2015-01-27 09:03:36 +01:00
Marco Pivetta
f32766c00d #1169 DDC-3343 - when using one-to-many extra-lazy with orphan-removal, referenced entities should be deleted directly 2015-01-27 07:46:31 +01:00
Marco Pivetta
3f28adf9b6 #1169 DDC-3343 - correcting collection name used in tests 2015-01-27 07:45:58 +01:00
Marco Pivetta
a0eb6005f3 #1169 DDC-3343 - adding tests for orphan-removal + extra-lazy + one-to-many element removal behavior 2015-01-27 07:42:48 +01:00
Marco Pivetta
9eaac13615 #1169 DDC-3343 - correcting one-to-many persister - association should not be updated directly if no orphan removal is involved 2015-01-27 06:27:37 +01:00
Marco Pivetta
539c364ca6 #1169 DDC-3343 - updating test expectations - one-to-many changes should be no-op unless orphan removal is specified. 2015-01-27 06:26:55 +01:00
Marco Pivetta
9839c400b8 #1169 DDC-3343 - updating test expectations - one-to-many changes should be no-op unless orphan removal is specified. 2015-01-27 06:19:26 +01:00
Marco Pivetta
7e8d27d41a Merge pull request #1287 from BenMorel/patch-1
Typo fix
2015-01-26 01:53:41 +01:00
Benjamin Morel
58e2510f41 Typo fix 2015-01-25 23:54:59 +01:00
Marco Pivetta
146354d835 Merge pull request #1280 from Ocramius/hotfix/#1277-find-one-with-eager-loads-is-failing
[DDC-3346] #1277 find one with eager loads is failing
2015-01-25 06:00:47 +01:00
Marco Pivetta
d024193cc0 Merge pull request #1272 from Ocramius/hotfix/DDC-2704-merge-inherited-transient-properties
[DDC-2704] - merge inherited transient properties - merge properties into uninitialized proxies
2015-01-25 05:55:53 +01:00
Marco Pivetta
d62cb6237f Merge pull request #1286 from Ocramius/feature/remove-xdebug-from-non-coverage-builds
Removing XDebug from non-coverage builds
2015-01-25 05:51:11 +01:00
Marco Pivetta
5bf18298b1 Merge pull request #1281 from Ocramius/hotfix/#1169-extra-lazy-one-to-many-should-not-delete-referenced-entities
Hotfix/#1169 extra lazy one to many should not delete referenced entities
2015-01-25 05:43:34 +01:00
Marco Pivetta
3570f4a49a #1277 DDC-3346 - disabling XDebug only for non-hhvm builds 2015-01-25 05:42:24 +01:00
Marco Pivetta
670acfc693 Removing XDebug from non-coverage builds 2015-01-25 05:35:31 +01:00
Marco Pivetta
d4b278c809 #1277 DDC-3346 - removing leftover comments 2015-01-25 05:03:19 +01:00
Marco Pivetta
cb780e8bb6 #1169 DDC-3343 - factoring logging into cached collection persister changes 2015-01-25 04:45:45 +01:00
Marco Pivetta
7e85c94f48 #1169 DDC-3343 - adapting cached collection persister logic to EXTRA_LAZY collection behavior 2015-01-25 04:40:30 +01:00
Marco Pivetta
4a05e19f37 Merge pull request #1283 from Ocramius/hotfix/#1267-order-by-broken-in-pagination-logic
#1267 - order by broken in pagination logic (reverts #1220)
2015-01-24 19:20:00 +01:00
Marco Pivetta
97ea6a7d85 #1277 DDC-3346 - removing array-based persister context handling (better to just use private props) 2015-01-24 14:39:47 +01:00
Marco Pivetta
dff365318d #1277 DDC-3346 DDC-3531 - enforcing 0 offset to avoid persisting more than 1 row 2015-01-24 14:39:47 +01:00
Marco Pivetta
186c593058 #1277 DDC-3346 DDC-3531 - proper bi-directional association setup 2015-01-24 14:39:46 +01:00
Marco Pivetta
39a8941d1b #1277 DDC-3346 DDC-3531 - minor CS fixes/cleanups: avoiding setters 2015-01-24 14:39:46 +01:00
Marco Pivetta
04a271a04e #1277 DDC-3346 DDC-3531 - refactoring test assets for readability 2015-01-24 14:39:46 +01:00
Marco Pivetta
36bc448880 #1277 DDC-3346 DDC-3531 - refactoring test code for simplicity/readability 2015-01-24 14:39:46 +01:00
Marco Pivetta
16f447d1ac #1277 DDC-3346 DDC-3531 - correct usage of the model set (setUp/tearDown of model-related tables) 2015-01-24 14:39:46 +01:00
Marco Pivetta
6e3ad496e2 #1277 DDC-3346 DDC-3531 - constants over string references 2015-01-24 14:39:45 +01:00
Marco Pivetta
157bf203bc #1277 DDC-3346 DDC-3531 - additional tests for LIMIT and OFFSET repository API (must not hydrate collections) 2015-01-24 14:39:45 +01:00
Marco Pivetta
1672448993 #1277 DDC-3346 DDC-3531 - renaming persister context switch for clarity 2015-01-24 14:39:45 +01:00
Marco Pivetta
a37fa97be3 #1277 DDC-3346 DDC-3531 - skipping joining of associations when limiting and fetch-joining to-many eager associations 2015-01-24 14:39:45 +01:00
Marco Pivetta
67f60f2286 #1277 DDC-3346 DDC-3531 - switching persister context at runtime, depending on choices 2015-01-24 14:39:44 +01:00
Marco Pivetta
23a0d9a1fb #1277 DDC-3346 DDC-3531 - switch persister context at runtime 2015-01-24 14:39:44 +01:00
Marco Pivetta
8b9171c8ad #1277 DDC-3346 DDC-3531 - caching the currently in use persister context 2015-01-24 14:39:44 +01:00
Marco Pivetta
ebdfab8f2c #1277 DDC-3346 DDC-3531 - moved sqlTableAliases into the newly created CachedPersisterContext 2015-01-24 14:39:44 +01:00
Marco Pivetta
2a7f149029 #1277 DDC-3346 DDC-3531 - moved sqlAliasCounter into the newly created CachedPersisterContext 2015-01-24 14:39:44 +01:00
Marco Pivetta
b9f698c98c #1277 DDC-3346 DDC-3531 - moved selectJoinSql into the newly created CachedPersisterContext 2015-01-24 14:39:43 +01:00
Marco Pivetta
55930a3402 #1277 DDC-3346 DDC-3531 - moved selectColumnListSql into the newly created CachedPersisterContext 2015-01-24 14:39:43 +01:00
Marco Pivetta
4c62d3bfda #1277 DDC-3346 DDC-3531 - moved resultsetmapping into the newly created CachedPersisterContext 2015-01-24 14:39:43 +01:00
Pavel Batanov
981cebbf4c Update test according to @Ocramius notes 2015-01-24 14:39:43 +01:00
Pavel Batanov
e36c7b0c2a DDC-3346 failing test example 2015-01-24 14:39:42 +01:00
Marco Pivetta
28e0da4321 #1272 DDC-2704 - reverting classmetadata API changes (moved all to reflection property getter API) 2015-01-24 14:32:23 +01:00
Marco Pivetta
d952077d04 #1272 DDC-2704 - using the property getter utility rather than metadata API when fetching reflection properties for a class 2015-01-24 14:30:40 +01:00
Marco Pivetta
05a8e1c77d #1272 DDC-2704 - test assets for the property getter utility tests 2015-01-24 14:30:07 +01:00
Marco Pivetta
1aa453d493 #1272 DDC-2704 - property getter utility is package private 2015-01-24 14:29:40 +01:00
Marco Pivetta
5ec300452a #1272 DDC-2704 - implementation for a property getter utility 2015-01-24 14:29:09 +01:00
Marco Pivetta
1b0a5e38d9 #1272 DDC-2704 - specification for a property getter utility 2015-01-24 14:28:54 +01:00
Marco Pivetta
8910c2c482 DDC-2704 - data should be merged only into initialized proxies 2015-01-24 13:22:16 +01:00
Marco Pivetta
91f4ed8b92 DDC-2704 - data should be merged only into initialized proxies 2015-01-24 13:22:16 +01:00
Marco Pivetta
21995a8b10 DDC-2704 - more explicit value checking 2015-01-24 13:22:16 +01:00
Marco Pivetta
30dcece125 DDC-2704 - covering code handling class metadata skipping of static properties 2015-01-24 13:22:16 +01:00
Marco Pivetta
3df9b4d122 DDC-2704 - synchronized model classes to new test code 2015-01-24 13:22:16 +01:00
Marco Pivetta
885700d38c DDC-2704 - should initializeAllReflectionProperties also on initializeReflection 2015-01-24 13:22:16 +01:00
Marco Pivetta
bd667b82d9 DDC-2704 - carefully checking defined classes in getAllReflectionProperties 2015-01-24 13:22:16 +01:00
Marco Pivetta
a4982a8dc2 DDC-2704 - handling partial initialization of the class as expected (class metadata may not hold reflection class after wakeup) 2015-01-24 13:22:15 +01:00
Marco Pivetta
1e6c071bb8 DDC-2704 - trying to get all reflection properties from a partially initialized class metadata instance will result in a failure 2015-01-24 13:22:15 +01:00
Marco Pivetta
4e08c99b86 DDC-2704 - trying to get all reflection properties from an unitialized class metadata instance will result in a failure 2015-01-24 13:22:15 +01:00
Marco Pivetta
0a3d6966d6 DDC-2704 - providing hotfix - also storing inherited transient properties in the class metadata 2015-01-24 13:22:15 +01:00
Marco Pivetta
5ae980e0f9 DDC-2704 - reducing test case clutter 2015-01-24 13:22:15 +01:00
Marco Pivetta
302e6218bb DDC-2704 - renaming test case for clarity 2015-01-24 13:22:15 +01:00
Marco Pivetta
942004226c DDC-2704 - basic test case verifying that merged transient properties are not handled when in an inheritance 2015-01-24 13:22:15 +01:00
Marco Pivetta
6a1755972d Revert "Merge branch 'hotfix/#1220-sort-paginator-subquery-output-only-once'"
This reverts commit 8f097ab304, reversing
changes made to b23a8dd429.

Conflicts:
	tests/Doctrine/Tests/ORM/Tools/Pagination/LimitSubqueryOutputWalkerTest.php
2015-01-24 13:10:25 +01:00
Austin Morris
c8160fcd0e Failing test for an ORDER BY that is INNER JOINED in a subquery 2015-01-24 13:07:56 +01:00
Marco Pivetta
01a9dadee7 #1169 DDC-3343 - removed unused imports 2015-01-24 12:54:40 +01:00
Marco Pivetta
b7b716a6bb #1169 DDC-3343 - moved tests to correct test class 2015-01-24 12:53:48 +01:00
Marco Pivetta
d443d4f3b6 #1169 DDC-3343 - additional test cases: removing proxies from an extra-lazy collection still updates the owning side values 2015-01-24 12:21:21 +01:00
Marco Pivetta
6a2b7c2a8e #1169 DDC-3343 - correcting query count assertions on extra-lazy specific tests (some DELETE operations became UPDATE operations) 2015-01-24 12:20:33 +01:00
Marco Pivetta
99c5650ba4 #1169 DDC-3343 - removing duplicate test 2015-01-24 11:59:21 +01:00
Marco Pivetta
a8796fa489 #1169 DDC-3343 - integrating tests into the existing test suite 2015-01-24 11:58:57 +01:00
Marco Pivetta
ff986a9bf5 #1169 DDC-3343 - importing used classe 2015-01-24 11:54:58 +01:00
Marco Pivetta
ed0331d25a #1169 DDC-3343 - optimized imports 2015-01-24 11:54:32 +01:00
Marco Pivetta
43f301fdad #1169 DDC-3343 - refactoring test to use pre-existing test models 2015-01-24 11:54:17 +01:00
Marco Pivetta
15397bbe40 #1169 DDC-3343 - refactoring test to use pre-existing test models 2015-01-24 11:54:03 +01:00
Marco Pivetta
aed01ea571 #1169 DDC-3343 - minor refactoring: constant over string reference 2015-01-24 11:41:20 +01:00
Marco Pivetta
f184956d3a #1169 DDC-3343 - one-to-many extra-lazy should not delete associated values when they are removed, but just update the owning side 2015-01-24 11:40:48 +01:00
Andrea Sprega
c2b3348f99 [DDC-3343] Failing test case (updated) 2015-01-24 11:30:17 +01:00
Andrea Sprega
db3697433b [DDC-3343] Failing test case 2015-01-24 11:30:17 +01:00
Marco Pivetta
3f360d7fbc Merge branch 'hotfix/#1257-discriminator-map-changes-documentation' 2015-01-24 09:21:27 +01:00
Marco Pivetta
52fb4e53bc #1257 DDC-3300 DDC-3503 - describing new inheritance map requirements in the upgrade notes/blogpost 2015-01-24 09:21:13 +01:00
Marco Pivetta
efa375ac96 #1257 DDC-3300 DDC-3503 - providing upgrade notes for the breaking change in discriminator map declarations 2015-01-24 09:14:58 +01:00
Marco Pivetta
22533042a5 Merge pull request #1279 from phansys/doc-slc
[Doc][Reference][2nd level cache]
2015-01-23 16:25:53 +01:00
Javier Spagnoletti
72785eb27e [Doc][Reference][2nd level cache]
* Fixed typo in TimestampRegion title.
* Normalized php snippets (comments, indentation).
2015-01-23 11:23:21 -03:00
Marco Pivetta
b889e18a9a Merge branch 'hotfix/#1176-merging-entities-with-composite-association-identifier'
Close #1176
2015-01-22 12:11:16 +01:00
Marco Pivetta
a67332fb51 #1176 DDC-3378 - minor CS fixes (imports, spacing, IDE hints) 2015-01-22 12:11:03 +01:00
Marco Pivetta
8305649a45 #1176 DDC-3378 - refactored test logic to use the newly introduced test assets 2015-01-22 12:10:39 +01:00
Marco Pivetta
8987c9ab37 #1176 DDC-3378 - moved test asset entities to proper models directory 2015-01-22 12:07:42 +01:00
Adrien Brault
f189c1aaf0 Update test to valid use case 2015-01-22 11:18:12 +01:00
Adrien Brault
fc8191f557 Naive fix 2015-01-22 11:18:12 +01:00
Adrien Brault
4058ad3958 Add test exposing UnitOfWork merge bug 2015-01-22 11:18:12 +01:00
Marco Pivetta
dfa4bbd67a Merge branch 'hotfix/resolve-target-entity-also-in-discriminator-map'
Close #1257
2015-01-22 09:52:17 +01:00
Marco Pivetta
6547d5462e #1257 DDC-3300 - strengthening test case (missing assertion, test name) 2015-01-22 09:51:43 +01:00
Marco Pivetta
c1cc768aee #1257 DDC-3300 - correcting further incomplete discriminator maps in the test suite 2015-01-22 09:50:59 +01:00
Marco Pivetta
cd3ffa8f14 #1130 DDC-3300 - removing typo causing parse error 2015-01-22 09:44:40 +01:00
Marco Pivetta
e969a6be85 #1130 DDC-3300 - rewording and clarifying logic that re-maps discriminator values when needed 2015-01-22 09:44:39 +01:00
Marco Pivetta
635d2c141f #1130 DDC-3300 - minor CS fix (EOF EOL) 2015-01-22 09:44:39 +01:00
Marco Pivetta
fbe294927f #1130 DDC-3300 - cleaning up test code 2015-01-22 09:44:39 +01:00
Marco Pivetta
8a6b1b48e3 #1130 DDC-3300 - removing unused ResolveDiscriminatorMapListener and related test 2015-01-22 09:44:39 +01:00
Marco Pivetta
b7c28924b1 #1130 DDC-3300 - fixed inheritance maps where inheritance members were missing 2015-01-22 09:44:39 +01:00
Marco Pivetta
a36bea2951 #1130 DDC-3300 - optimizing performance (looping over existing classes first): throwing exceptions if the class is not found in the discriminator map 2015-01-22 09:44:39 +01:00
Marco Pivetta
8579baf28c #1130 DDC-3300 - minor refactoring (else removal, spacing) 2015-01-22 09:44:39 +01:00
Marco Pivetta
786c34faa5 #1130 DDC-3300 - refactoring auto-remapping of discriminator value into a private method 2015-01-22 09:44:38 +01:00
Marco Pivetta
c589b5d013 #1130 DDC-3300 - re-mapping discriminator column at runtime (based on modified class metadata) 2015-01-22 09:44:38 +01:00
mmoreram
5a1a32297b Tested DDC-3300 2015-01-22 09:44:38 +01:00
mmoreram
93b6eeca54 Full resolveTargetEntities as constructor argument 2015-01-22 09:44:38 +01:00
mmoreram
fa45c0834d Removed unused construct param 2015-01-22 09:44:38 +01:00
mmoreram
2a6c844953 Using constructor to define environment 2015-01-22 09:44:38 +01:00
mmoreram
7a73d27600 Added resolve entities support in discrim. map 2015-01-22 09:44:38 +01:00
Marco Pivetta
39c36f6037 Merge pull request #1232 from PowerKiKi/doc-partial-indexes
Explicit example of partial indexes
2015-01-22 09:21:57 +01:00
Adrien Crivelli
3caaf26069 Explicit example of partial indexes 2015-01-22 16:38:24 +09:00
Marco Pivetta
3930fd50a7 Merge pull request #1273 from TrkiSF2/master
Incorrect @throws doc. in getSingleScalarResult
2015-01-20 22:42:11 +01:00
Lukáš Lukáč
ea213ef23c Merge pull request #1 from TrkiSF2/TrkiSF2-getSingleScalarResult-Doc
Incorrect @throws doc. in getSingleScalarResult
2015-01-20 17:24:29 +01:00
Lukáš Lukáč
5e6ec8ebf3 Incorrect @throws doc. in getSingleScalarResult 2015-01-20 17:21:43 +01:00
Guilherme Blanco
335492aed7 Merge pull request #1269 from spdionis/patch-1
[DDC-3520] self-update composer before install
2015-01-20 09:19:27 -05:00
Marco Pivetta
f019bf4379 Merge branch 'docs/#1264-2.5-upgrade-notes'
Close #1264
2015-01-20 12:12:57 +01:00
Marco Pivetta
542d9b664b #1264 - removing backtick 2015-01-20 12:11:39 +01:00
Marco Pivetta
daf2763894 Merge pull request #1271 from kix/patch-1
Update migration_2_5.rst
2015-01-20 11:41:32 +01:00
Stepan Anchugov
6ac0ae3c87 Update migration_2_5.rst
Fixed some formatting issues and typos.
2015-01-20 15:35:47 +05:00
Spinei Dionis
2528d0b3fc self-update composer before install
Updating composer before install seems like a good idea. At the moment for example the travis build is failing because of the new composer syntax with '^' and it would be fixed by composer self-update.
2015-01-20 03:31:42 +02:00
Guilherme Blanco
2418f8f5e6 Removed todo by implementing it. 2015-01-18 22:21:18 -05:00
Benjamin Eberlei
cd616ff40e Update changelog docs 2015-01-18 22:52:30 +01:00
Marco Pivetta
d8d4ec6eb2 Merge branch 'hotfix/#1265-sti-persister-one-to-one-association-notices'
Close #1265
2015-01-18 18:27:33 +01:00
Marco Pivetta
544add9e8b Merge branch 'hotfix/#1265-sti-persister-one-to-one-association-notices-fix' into hotfix/#1265-sti-persister-one-to-one-association-notices 2015-01-18 18:27:01 +01:00
Marco Pivetta
9abbdb9e7f #1265 DDC-3517 - moved test assets to separate models dir, namespaced table names 2015-01-18 18:25:46 +01:00
Marco Pivetta
185f22668c #1265 DDC-3517 - correcting test docblocks 2015-01-18 18:15:03 +01:00
Marco Pivetta
bffc99a116 #1265 DDC-3517 - failing test - finding via a STI root class fails if there is a one-to-one association in a subclass 2015-01-18 18:13:15 +01:00
Anderson Müller
d48093886d Fix error undefined index "targetEntity" 2015-01-18 15:54:43 +01:00
Benjamin Eberlei
79ba8c6be8 Add Changelog/Migration to 2.5 documentation chapter. 2015-01-18 15:18:18 +01:00
Marco Pivetta
61e07e5907 Handling minor HHVM incompatibility (dumped value is different between PHP and HHVM) 2015-01-18 02:54:18 +01:00
Marco Pivetta
7cba76082e Corrected test: metadata should be retrieved from a specific entity manager
Metadata is subject to modification depending on the active database platform (generator strategies, usually),
therefore it is not safe to pull it from an entity manager and sharing metadata across multiple entity managers.
2015-01-18 02:32:02 +01:00
Marco Pivetta
39766e645c Merge branch 'feature/#1248-better-exception-messages-on-invalid-association-data'
Close #1248
2015-01-18 01:07:08 +01:00
Marco Pivetta
c7f5ee8e9e #1228 DDC-3490 - Remove unused method 2015-01-18 01:05:53 +01:00
Marco Pivetta
b1d7a057fd #1228 DDC-3490 - avoid catching unknown exceptions, remove unused method call 2015-01-18 01:05:36 +01:00
Marco Pivetta
1cd03625a5 #1228 DDC-3490 - fixed exception catching in BasicFunctionalTest logic 2015-01-18 00:59:58 +01:00
Marco Pivetta
66479334d4 #1228 DDC-3490 - computing changes of invalid objects should also fail 2015-01-18 00:55:40 +01:00
Marco Pivetta
9c1275bb1f #1228 DDC-3490 - persistence of invalid values should also cause exceptions 2015-01-18 00:54:18 +01:00
Marco Pivetta
d0c0f43c79 #1228 DDC-3490 - preventing invalid association values from being persisted 2015-01-18 00:53:57 +01:00
Marco Pivetta
71a6a88de8 #1228 DDC-3490 -better/more complete exception message for invalid populated associations 2015-01-18 00:53:34 +01:00
Marco Pivetta
5e76f12000 #1228 DDC-3490 - tests for invalid association values handled in the UnitOfWork 2015-01-18 00:37:21 +01:00
flip111
83de071c00 Update ORMInvalidArgumentException.php
remove added `value` to exception
2015-01-18 00:16:10 +01:00
flip111
d1a2655090 Update UnitOfWork.php
rename duplicate method
2015-01-18 00:16:10 +01:00
flip111
b5dd999f84 Update ORMInvalidArgumentException.php
rename duplicate method
2015-01-18 00:16:10 +01:00
flip111
059c33e69d Update UnitOfWork.php
removed one `)` too many
2015-01-18 00:16:10 +01:00
flip111
1ae153d315 Update UnitOfWork.php 2015-01-18 00:16:10 +01:00
flip111
643ae78691 Update ORMInvalidArgumentException.php
Add unused parameters for `invalidAssociation`
2015-01-18 00:16:09 +01:00
flip111
04e4940607 Update ORMInvalidArgumentException.php
`@return self` trend break with `@return ORMInvalidArgumentException`
2015-01-18 00:16:09 +01:00
flip111
88e071d22d moved exception constructors out of UoW 2015-01-18 00:16:09 +01:00
flip111
b120dafb70 Added new exception constructors 2015-01-18 00:16:09 +01:00
flip111
00a2c8e09c improved error handling for invalid association values
Possibly to do:
1. Make custom Exception for line 713
2. Make custom Exception for line 817
3. Does the object check on line 816 slow down the code too much? Alternatively a try-catch could be put around line 1415 or higher up.
2015-01-18 00:16:09 +01:00
Marco Pivetta
84562bca82 Merge branch 'hotfix/#1252-include-class-name-when-calling-naming-strategy-join-column-name'
Close #1252
2015-01-18 00:12:54 +01:00
Marco Pivetta
025565005d #1252 DDC-3496 - reverting interface BC break 2015-01-18 00:11:47 +01:00
Marco Pivetta
369a9934a5 #1252 DDC-3496 - moving stub naming strategy to tests directory 2015-01-18 00:07:54 +01:00
Marco Pivetta
29007e7d79 #1252 DDC-3496 - minor test cleanups (avoiding private static method) 2015-01-18 00:03:49 +01:00
Jack Sleight
60523d1b62 Update docblock for joinColumnName to include className details 2015-01-17 23:57:52 +01:00
Jack Sleight
04d8f66b72 Tests for new class based join column NamingStrategy 2015-01-17 23:57:52 +01:00
Jack Sleight
be9d92bb26 Example NamingStrategy for using class name in join column names. 2015-01-17 23:57:52 +01:00
Jack Sleight
82163a3301 Include className in calls to NamingStrategy joinColumnName method. 2015-01-17 23:57:52 +01:00
Marco Pivetta
4cde35dc18 Merge branch 'feature/#954-multi-get-slc-regions'
Close #954
2015-01-17 23:49:40 +01:00
Marco Pivetta
d5f6b4440a #954 DDC-2982 - s/CacheProvider/Cache in documentation 2015-01-17 23:44:40 +01:00
Marco Pivetta
b1474768fe #954 DDC-2982 - Better type-safety in Doctrine\ORM\Cache\Region\DefaultMultiGetRegion instantiation logic 2015-01-17 23:43:34 +01:00
Marco Pivetta
624b98544a #954 DDC-2982 - DefaultCacheFactory now supports generic Doctrine\Common\Cache\Cache instances 2015-01-17 23:42:49 +01:00
Marco Pivetta
95fe03b182 #954 DDC-2982 - Coverage for different instantiation of single-/multi-get cache regions 2015-01-17 23:42:15 +01:00
Marco Pivetta
564624814b #954 DDC-2982 - Evicting all cache entries is not supported with a generic cache adapter 2015-01-17 23:30:37 +01:00
Marco Pivetta
0e4a7caf0b #954 DDC-2982 - Evicting all cache entries is not supported with a generic cache adapter 2015-01-17 23:30:20 +01:00
Marco Pivetta
95c6cca336 #954 DDC-2982 - Minor CS fixes/IDE hints 2015-01-17 23:17:07 +01:00
Marco Pivetta
8ddcc4b270 #954 DDC-2982 - No need to check if a Region is a MultiGetRegion 2015-01-17 23:11:14 +01:00
Marco Pivetta
3c5a794691 #954 DDC-2982 - Making cache Region always a MultiGetRegion (no need to segregate the interface here) 2015-01-17 23:10:49 +01:00
Asmir Mustafic
3f64f3252b Changed some tests to be compatible with the new implementation of
multiget region
2015-01-17 22:27:59 +01:00
Asmir Mustafic
e73bd9e9bb New buildCacheEntry way bo build a entry for a cached collection 2015-01-17 22:27:59 +01:00
Asmir Mustafic
1b4eee6d0d Fixed strange test case with CmsUser and second-level cache 2015-01-17 22:27:59 +01:00
Asmir Mustafic
5ec2014051 MultiGetCollectionHydrator depends knows the multi-get region 2015-01-17 22:27:59 +01:00
Asmir Mustafic
1bfa68d94f Removed dependency with Region interface 2015-01-17 22:27:59 +01:00
Asmir Mustafic
779af8ce8e Added dependency with doctrine/cache 1.4 2015-01-17 22:27:59 +01:00
Asmir Mustafic
77c2e24215 Added test case for buildCachedCollectioHydrator on DefaultCacheFactory 2015-01-17 22:27:59 +01:00
Asmir Mustafic
b0792330e4 Added test case for MultiGetRegion 2015-01-17 22:27:58 +01:00
Asmir Mustafic
74e93e4cad Added multi-get support for second level cached collections 2015-01-17 22:27:58 +01:00
Marco Pivetta
8f097ab304 Merge branch 'hotfix/#1220-sort-paginator-subquery-output-only-once'
Close #1220
2015-01-17 22:13:36 +01:00
Bill Schaller
3fd3da3d46 Fixed removal of ASC and DESC keywords from orderby items that will be included in select list 2015-01-17 22:12:26 +01:00
Bill Schaller
39aeb9935b Added failing testcase for Limit queries on entities with column names containing 'asc' or desc' 2015-01-17 22:12:26 +01:00
Bill Schaller
8350de781f Doc fix 2015-01-17 22:12:26 +01:00
Bill Schaller
dfc0910756 Fixed how order by items are included in the select list of the select distinct wrapper statement 2015-01-17 22:12:26 +01:00
Bill Schaller
7031539314 Fixed SQL that could be considered invalid on the targeted platforms in LimitSubqueryOutputWalkerTest 2015-01-17 22:12:26 +01:00
Bill Schaller
ed800e4b86 Added function to LimitSubqueryOutputWalker which takes an order by clause and rebuilds it to work in the scope of the wrapping query 2015-01-17 22:12:25 +01:00
Bill Schaller
42bea80a6a Added failing test cases for limit queries with with complex scalar order by items 2015-01-17 22:12:25 +01:00
Bill Schaller
a4ebc08c4f * Modified tests in LimitSubqueryOutputWalkerTest.php to not have duplicated order by clauses
* Modified LimitSubqueryOutputWalker to not duplicate order by clauses
2015-01-17 22:12:25 +01:00
Marco Pivetta
b23a8dd429 Merge branch 'hotfix/#1262-restore-run-dql-command-functionality'
Close #1262
2015-01-17 21:31:11 +01:00
Marco Pivetta
fea0425a4f #1262 DDC-3513 - RunDqlCommand should write to the output object rather than to the output buffer 2015-01-17 21:31:00 +01:00
Marco Pivetta
f06d652393 #1262 DDC-3513 - RunDqlCommand should display the generated SQL when asked to do so 2015-01-17 21:30:34 +01:00
Marco Pivetta
1c6fd512a5 #1262 DDC-3513 - providing basic coverage for the RunDqlCommand logic 2015-01-17 21:27:32 +01:00
Bob van de Vijver
3c2ed7d8a8 Fixes the broken DQL command
Now it can again output more than only the created SQL query.
See cdb62a70cd (comments)
2015-01-17 13:21:30 +01:00
Marco Pivetta
fe4d46014d Merge branch 'hotfix/#1212-fix-regression-that-hid-join-aliases-in-criteria-expressions'
Close #1212
2015-01-17 08:35:27 +01:00
Kiel Goodman
0c5ea34fd4 [DDC-3436] Fix changes requested 2/2 2015-01-17 08:33:23 +01:00
Kiel Goodman
dc98da585d [DDC-3436] Fix changes requested 1/2 2015-01-17 08:33:23 +01:00
Kiel Goodman
349966832f [DDC-3436] Convert short array syntax to legacy style 2015-01-17 08:33:23 +01:00
Kiel Goodman
918d2910d9 [DDC-3108] Fix regression introduced in DDC-2764 where join aliases were no longer accessible in Criteria expressions 2015-01-17 08:33:23 +01:00
Marco Pivetta
6ba5211310 Merge branch 'hotfix/#1206-matching-should-not-modify-criteria'
Close #1206
2015-01-17 08:30:26 +01:00
Marco Pivetta
e9fd5678a5 #1206 DDC-3430 - PersistentCollection should not mutate the given Criteria instances when matching() 2015-01-17 08:30:16 +01:00
Oliver Tischlinger
f8072dd8e0 Fixed typo 2015-01-17 08:20:24 +01:00
Oliver Tischlinger
b5ba84f667 matching should not change critera
The matching should behave like in ArrayCollection, where it is not changed.
The criteria should be cloned so that it could be used for more than one matching operation.
2015-01-17 08:20:24 +01:00
Marco Pivetta
6164f17229 Merge branch 'hotfix/#1086-identifier-type-in-proxies'
Close #1086
2015-01-17 08:15:50 +01:00
Marco Pivetta
f13b085582 Using PersisterHelper instead of the unreliable ClassMetadataInfo#getTypeOfColumn() 2015-01-17 08:14:04 +01:00
Marco Pivetta
f1170c84a4 #1086 - Passing type information when building meta-mappings for JTI and STI inheritances 2015-01-17 08:09:55 +01:00
Marco Pivetta
40849f8ae1 #1086 - Minor CS fixes applied to the test case (simplifying) 2015-01-17 08:09:55 +01:00
Thomas Lallement
a0165858c4 Delete DDC0003Test.php 2015-01-17 08:09:55 +01:00
Thomas Lallement
033b8e51e9 Create DDC3223Test.php 2015-01-17 08:09:55 +01:00
Thomas Lallement
556c562258 Failing test (get id return string type) 2015-01-17 08:09:54 +01:00
Marco Pivetta
dad3a6bae1 Merge branch 'hotfix/#1178-correct-association-links-dbal-types-conversion'
Close #1178
2015-01-17 08:03:00 +01:00
Marco Pivetta
67f59dc256 Revert "#1178 - simplified ValueConversionType tests by using a single model-set for the entire subset of tests (faster as well)"
This reverts commit 2702540930.
2015-01-17 08:01:31 +01:00
Marco Pivetta
2702540930 #1178 - simplified ValueConversionType tests by using a single model-set for the entire subset of tests (faster as well) 2015-01-17 07:59:03 +01:00
Marco Pivetta
131a39bad4 #1178 - s/getValue/getIdentifierValues 2015-01-17 07:59:03 +01:00
Marco Pivetta
584839d38a #1178 - moved private method to the bottom of the class 2015-01-17 07:59:03 +01:00
Marco Pivetta
edf054cd0c #1178 - removing duplicate configuration of the rot13 DBAL type 2015-01-17 07:59:03 +01:00
Marco Pivetta
b32c779c37 #1178 - minor typo (method names) 2015-01-17 07:59:02 +01:00
Marco Pivetta
d47f724f16 #1178 - restoring correct getJoinTableRestrictionsWithKey logic as per @jaspernbrouwer's previous implementation 2015-01-17 07:59:02 +01:00
Marco Pivetta
f88f5ce454 #1178 - fetching actual target entity when resolving column types of it 2015-01-17 07:59:02 +01:00
Marco Pivetta
a39b6869ca #1178 - mapping between criteria parameters and types when fetching on one-to-many with additional criterions 2015-01-17 07:59:02 +01:00
Marco Pivetta
ce446a6f03 #1178 - correcting filtering when initializing a one-to-many collection that has composite complex (custom DBAL types) identifiers 2015-01-17 07:59:02 +01:00
Marco Pivetta
096bd90aed #1178 - using the PersisterHelper to extract type of associated meta-result columns 2015-01-17 07:59:02 +01:00
Marco Pivetta
e5c4e65764 #1178 - proxy identifiers should be correctly converted 2015-01-17 07:59:02 +01:00
Marco Pivetta
0743238b43 #1178 - minor code duplication removal 2015-01-17 07:59:01 +01:00
Marco Pivetta
4eaa7ea821 #1178 - correcting class from which the type of a column should be fetched (source class when relationToSourceKeyColumns is used) 2015-01-17 07:59:01 +01:00
Marco Pivetta
6e2179aa8e #1178 - handling custom types when filtering/removing by element in extra-lazy many-to-many associations 2015-01-17 07:59:01 +01:00
Marco Pivetta
5e49aeef6f #1178 - handling custom types when filtering by key in extra-lazy many-to-many associations 2015-01-17 07:59:01 +01:00
Marco Pivetta
e39f08f6bd #1178 - handling correct parameter binding when counting extra-lazy collections with custom-type referenced identifiers 2015-01-17 07:59:01 +01:00
Marco Pivetta
c82794bff7 #1178 - handling traversal of association mapping data in lazy-loading many-to-many requests on the inverse side 2015-01-17 07:59:01 +01:00
Marco Pivetta
1e606d1ed3 #1178 - adding note about ClassMetadataInfo#getTypeOfColumn() being unreliable/dangerous 2015-01-17 07:59:01 +01:00
Marco Pivetta
41900dca76 #1178 - correctly handling initialization of collections referenced via custom DBAL types 2015-01-17 07:59:00 +01:00
Marco Pivetta
91bceca7ee #1178 - correcting collection insert/update logic to correctly cast values for custom typed columns 2015-01-17 07:59:00 +01:00
Marco Pivetta
aaa6443954 #1178 - PersisterHelper::getTypeOfColumn() should not fail silently, as that makes persister bugs impossible to spot 2015-01-17 07:59:00 +01:00
Marco Pivetta
a80532a538 #1178 - correcting association column type when dealing with multiple derived associations/identifier levels
Since the ClassMetadata can only know about internal state, any `joinColumn` association details on the
inverse side of an association need to be computed by fetching associated metadata.
2015-01-17 07:59:00 +01:00
Marco Pivetta
445798ed46 #1178 - reverting patch and keeping tests (rebase gone awry)
Also cleaning up `OrmFunctionalTestCase`
2015-01-17 07:59:00 +01:00
Jasper N. Brouwer
5c1d1931b7 Fixed typehints and use statements 2015-01-17 07:59:00 +01:00
Jasper N. Brouwer
fe21f18991 Fixed doc-blocks 2015-01-17 07:59:00 +01:00
Jasper N. Brouwer
a0b43d0a7f Don't alias PersisterHelper to Helper 2015-01-17 07:58:59 +01:00
Jasper N. Brouwer
7b9c6a69bd Add tests for extra lazy many-to-many associations
and fixed production code
2015-01-17 07:58:59 +01:00
Jasper N. Brouwer
ba3df8577b Refined and added tests, fixed found issues
- Renamed id properties so they don't coexist between entities in a test
- Added tests for extra lazy one-to-many associations
- Fixed production code to make tests green
2015-01-17 07:58:59 +01:00
Jasper N. Brouwer
f7b14085f2 Abstracted infering binding types away in a helper 2015-01-17 07:58:59 +01:00
Jasper N. Brouwer
4f9f7eedf5 Removed DDC-3380 mentions in production code 2015-01-17 07:58:59 +01:00
Jasper N. Brouwer
f60f2a567a Fixed associations using a value-conversion type for identifiers 2015-01-17 07:58:59 +01:00
Marco Pivetta
f6445d5a3e Fixing build using a dedicated in-memory connection to stub out two real connections for DB-access checks 2015-01-17 07:58:35 +01:00
Marco Pivetta
074ec358ab Merge branch 'hotfix/#1172-avoid-proxy-initialization-when-proxy-is-merged-into-uow'
Close #1172
2015-01-16 22:56:03 +01:00
Marco Pivetta
57ce6ccfcf #1172 - fixed minor CS issues (spacing) 2015-01-16 22:54:30 +01:00
Marco Pivetta
45e733eb60 #1172 - adding @method annotation to simplify static introspection 2015-01-16 22:50:52 +01:00
Marco Pivetta
42c9ff026e #1172 - renaming test class for clarity 2015-01-16 22:47:00 +01:00
Marco Pivetta
937113e234 #1172 - simplified logic, re-using existing generic model 2015-01-16 22:46:31 +01:00
Marco Pivetta
cd3fc6e6ea #1172 - adding required @group annotations for newly introduced tests 2015-01-16 22:43:52 +01:00
Marco Pivetta
94724b7a56 #1172 - reverted: moving MergeUninitializedProxyTest tests into EntityManagerTest (invalid, as they are functional tests) 2015-01-16 22:43:03 +01:00
Marco Pivetta
3769cd1119 #1172 - adding required @group annotations for newly introduced tests 2015-01-16 22:37:38 +01:00
Marco Pivetta
70840131ff #1172 - moved MergeUninitializedProxyTest tests into EntityManagerTest 2015-01-16 22:36:30 +01:00
Marco Pivetta
438feccd55 #1172 - removing redundant test logic 2015-01-16 22:25:41 +01:00
Marco Pivetta
de4e980389 #1172 - covering merging of unmanaged, un-initialized proxies bound to a different entity manager 2015-01-16 22:25:00 +01:00
Marco Pivetta
b7566dc65b #1172 - correcting test: all connections should have a saved file instance 2015-01-16 22:20:58 +01:00
Marco Pivetta
d1e7960f99 #1172 - tests to verify that proxies keep distinct entity manager instances even across merging operations 2015-01-16 22:12:42 +01:00
Marco Pivetta
4ed0a6ce53 #1172 - removing redundant tests 2015-01-16 21:25:25 +01:00
Marco Pivetta
3df119f4fe #1172 - when merging an initialized proxy, the managed proxy must be initialized before merging 2015-01-16 21:23:47 +01:00
Marco Pivetta
a18f258b4d #1172 - covering merging of managed proxies 2015-01-16 21:15:39 +01:00
Marco Pivetta
0329ac5074 #1172 - covering also detached proxies - merging operations should not initialize either proxy 2015-01-16 21:14:13 +01:00
Marco Pivetta
dde09872df #1172 - writing a more concise test case about merging detached proxies 2015-01-16 21:09:53 +01:00
Mathieu De Zutter
318b23097b Don't load uninitialized proxies after merging.
Previous patch avoided initialization of proxies before merging, mainly to
fix a bug with merging. However, later on, doctrine tries again to load
the proxy. This is unnecessary and thus has been removed. This way, a
round trip to the database is saved.
2015-01-16 20:54:15 +01:00
Mathieu De Zutter
ec35d4886c Don't load detached proxies when merging them.
Ticket DDC-1392 fixed an issue where uninitialized proxies could not be merged
because the merge routine couldn't get the identifier from them. The soution
was to initialize the proxy.
Ticket DDC-1734 fixed the merging of *unserialized* uninitialized proxies by
resetting their internals, so these proxies were able to initialize, as required
by the fix for DDC-1392.

Somehow, in the meanwhile, the fix for DDC-1392 is not needed anymore:
reverting the patch will not break the associated test (but it does break the
test for DDC-1734). This means it is not needed anymore to initialize the proxy
when merging.

Uninitialized proxies that get merged should not be loaded at all.  Since they
are not initialized, the entity data for sure hasn't changed, so it can be
safely ignored. Actually, the only thing the data is needed for while merging,
is to copy it into the managed entity, but that one is already supposed to be
up to date. By not initializing the proxy, a potential database roundtrip is
saved, and the fix for DDC-1734 is not needed anymore.

Besides optimizing the merge, this patch also solves an issue with merging.
Currently, when a detached uninitialized proxy is merged while there is already a
corresponding managed entity (proxy or not), the ORM returns a blank entity
instead of returning the already managed entity. This patch makes sure that
already existing managed entities are re-used.
2015-01-16 20:54:15 +01:00
Marco Pivetta
f28654de12 Merge branch 'hotfix/#1133-better-exception-message-on-missing-embeddable-class-in-metadata'
Close #1133
2015-01-16 19:50:26 +01:00
Marco Pivetta
935a79e15f #1133 DDC-3305 - minor cs fix (spacing) 2015-01-16 19:46:04 +01:00
Marco Pivetta
7e4dab17ec #1133 DDC-3305 - test case with embeddable without referenced embeddable class 2015-01-16 19:45:16 +01:00
Javier Spagnoletti
705a7d2cc2 [Embeddables] Improved exception message when embeddables is missing 'class' attribute. 2015-01-16 19:18:46 +01:00
Marco Pivetta
655394d433 Merge branch 'hotfix/abstract-id-generator-revert-bc-break' 2015-01-16 18:53:36 +01:00
Marco Pivetta
6acfdc1439 Removing Doctrine\ORM\Id\AbstractIdGenerator#generate(EntityManagerInterface $em, $entity) from upgrade notes (BC break reverted) 2015-01-16 18:53:27 +01:00
Marco Pivetta
f799986be1 Reverting BC break in AbstractIdGenerator signature 2015-01-16 18:52:58 +01:00
Marco Pivetta
de589799e8 Merge pull request #1209 from Ocramius/hotfix/DDC-3427-allow-entitymanagerinterface-globally
s/EntityManager/EntityManagerInterface in type-hints
2015-01-16 15:06:58 +01:00
Marco Pivetta
efe9e3ab28 #1209 DDC-3427 - documenting s/EntityManager/EntityManagerInterface signature BC breaks 2015-01-16 14:55:16 +01:00
Marco Pivetta
339bd23ac8 #1209 DDC-3427 - removing leftover EntityManager hints (using interface instead) 2015-01-16 14:44:31 +01:00
Marco Pivetta
dd8db1acd2 DDC-3427 - s/EntityManager/EntityManagerInterface in relevant tests about identifier generation 2015-01-16 14:22:03 +01:00
Marco Pivetta
6fc0d84b7a DDC-3427 - s/EntityManager/EntityManagerInterface in type-hints 2015-01-16 14:21:30 +01:00
Marco Pivetta
0e7646cf4b Merge branch 'namespace-persisters'
Close #1258
2015-01-16 00:10:56 +01:00
Guilherme Blanco
f90475772d Classify persisters into more granular namespaces. 2015-01-16 00:10:25 +01:00
Fabio B. Silva
f97bb00dff Merge pull request #1259 from Ocramius/hotfix/cache-region-cache-namespace-mutability-removal
Hotfix: Cache region should not mutate injected cache instance settings
2015-01-15 15:26:23 -05:00
Marco Pivetta
0f2c117f3e Cloning and configuring the cache adapter for each newly created cache region (fixes cache namespacing) 2015-01-15 21:17:49 +01:00
Marco Pivetta
6564f95260 Typo fix (region should be named 'bar', not 'foo' 2015-01-15 21:17:25 +01:00
Marco Pivetta
a82eecfc07 Each cache region built by the DefaultCacheFactory should have its own cache with its own unique namespace 2015-01-15 21:15:38 +01:00
Marco Pivetta
514fd008b9 Cache regions will not modify the injected cache instance settings 2015-01-15 21:01:35 +01:00
Marco Pivetta
f38d4551f1 Cache regions should not modify the injected cache instance settings 2015-01-15 21:01:02 +01:00
Guilherme Blanco
0b2fb7fd78 Fixed identifier quoting in functional tests. 2015-01-15 03:55:29 +00:00
Guilherme Blanco
8a0989aa50 Fixed identifier quoting in functional tests. 2015-01-15 03:50:18 +00:00
Marco Pivetta
5bd921139e Merge branch 'hotfix/#1250-DDC-3493-fix-class-pseudo-constant-parsing-in-entitygenerator' 2015-01-15 04:16:44 +01:00
Guilherme Blanco
a1d77bdc65 Renamed coll to collection and some small updates to tests. 2015-01-15 03:14:48 +00:00
Marco Pivetta
5be57d0f4a Merge branch 'hotfix/#1256-DDC-3493-fix' into hotfix/#1250-DDC-3493-fix-class-pseudo-constant-parsing-in-entitygenerator
Close #1250
Close #1256
2015-01-15 04:13:28 +01:00
Andrea Sprega
243210e896 DDC-3493 - fixed EntityGenerator parsing for php 5.5 "::class" syntax 2015-01-15 04:13:09 +01:00
lukasmaz
41dd584f62 Test case for "class" keyword
Test case for http://www.doctrine-project.org/jira/browse/DDC-3493
2015-01-15 04:12:31 +01:00
Marco Pivetta
55a75bfb1b Merge pull request #1249 from doctrine/extra-lazy-get-m2m
Support for extra lazy get for both owning and inverse side on many to many associations.
2015-01-15 03:36:35 +01:00
Steve Müller
d343617f13 Merge pull request #1255 from Ocramius/cleanup/php-5.3-support-end
Cleanup: PHP 5.3 support end
2015-01-15 01:29:00 +01:00
Marco Pivetta
934e4fdde4 Merge pull request #1251 from TomasVotruba/travis-optimize
travis: optimize to run coverage only once
2015-01-15 01:20:02 +01:00
Marco Pivetta
a88726d84e Merge branch 'hotfix/#1072-fix-iteration-of-file-lock-region-on-no-match'
Close #1072
2015-01-15 00:55:16 +01:00
Marco Pivetta
8b223c5c83 #1072 DDC-3191 - test cleanup: reflection is better than mixing up I/O operations and global state 2015-01-15 00:54:25 +01:00
Marco Pivetta
e2acd74cb4 #1072 DDC-3191 - minor performance optimization 2015-01-15 00:37:41 +01:00
Marco Pivetta
aca719be41 #1072 DDC-3191 - adding test for failing glob() operations on the FileLockRegion 2015-01-15 00:36:26 +01:00
Alexander Kurilo
58cd520e32 Fix attempt of traversing bool in FileLockRegion 2015-01-14 23:51:41 +01:00
Tomas Votruba
57cad1f232 travis: optimize to run coverage only once 2015-01-14 23:08:15 +01:00
Marco Pivetta
a1e40fc3f1 Removing PHP 5.3 references, simplified getting started docs 2015-01-14 21:02:15 +01:00
Marco Pivetta
3ee47bef41 Updating readme minimum required PHP version 2015-01-14 21:00:59 +01:00
Marco Pivetta
89520b1f38 Updating readme minimum required PHP version 2015-01-14 21:00:37 +01:00
Marco Pivetta
9024c04c72 Removing conditionals checking for PHP 5.4 support 2015-01-14 20:14:39 +01:00
Marco Pivetta
541e7bdf72 Refactoring test method: no need to test for PHP version 2015-01-14 20:13:46 +01:00
Marco Pivetta
8e28cb9119 Removing useless $self use statements, as PHP 5.4 supports $this in closures 2015-01-14 20:12:27 +01:00
Marco Pivetta
effe33096d Dropping PHP 5.3 from the build matrix 2015-01-14 20:03:49 +01:00
Marco Pivetta
e05858b09c Requiring PHP 5.4 as a minimum runtime 2015-01-14 20:02:48 +01:00
Marco Pivetta
e030dac3d0 Merge pull request #1253 from SofHad/fix-dbal-configuration-404
Fix dead link
2015-01-14 19:43:03 +01:00
Marco Pivetta
1d4b96eed0 Merge branch 'hotfix/#881-support-schema-on-platform-without-schema-emulation'
Close #881
2015-01-14 19:18:22 +01:00
Marco Pivetta
0106cba602 #881 DDC-2825 - reusing mapping files that already exist in models, where applicable 2015-01-14 19:17:39 +01:00
Marco Pivetta
7164e28138 #881 DDC-2825 - renaming table/schema name for clarity and to avoid collisions 2015-01-14 19:16:42 +01:00
Marco Pivetta
7b168de236 #881 DDC-2825 - removing unused imports 2015-01-14 19:05:40 +01:00
Marco Pivetta
962f479318 #881 DDC-2825 - refactoring test logic, removing dead private method 2015-01-14 19:04:58 +01:00
Marco Pivetta
80ce601eae #881 DDC-2825 - refactoring test logic to use data-provider instead of code repetitions 2015-01-14 19:02:44 +01:00
Marco Pivetta
f874189456 #881 DDC-2825 - refactoring tests for clarity/readability and ease of use 2015-01-14 18:56:37 +01:00
Marco Pivetta
9d6890e6ca #881 DDC-2825 - expectations are the first parameter in an assertion 2015-01-14 18:50:17 +01:00
Marco Pivetta
67788d89b5 #881 DDC-2825 - simplifying/extracting test logic: moved verifying metadata into separate test method 2015-01-14 18:47:17 +01:00
SofHad
9ba7c9a74d Fix dead link 2015-01-14 18:43:46 +01:00
Marco Pivetta
0a91b83e27 #881 DDC-2825 - exploding test case into smaller units 2015-01-14 18:34:58 +01:00
Marco Pivetta
6f85ca3356 #881 DDC-2825 - exploding test case into smaller units 2015-01-14 18:31:11 +01:00
Marco Pivetta
3ba9689448 #881 DDC-2825 - aligning assignments 2015-01-14 18:19:22 +01:00
Marco Pivetta
f0102a69f9 #881 DDC-2825 - refactoring mapping driver to use ClassMetadata#setPrimaryTable() instead of duplicating explode() logic 2015-01-14 18:12:12 +01:00
Marco Pivetta
eefa3b2e53 #881 DDC-2825 - correcting YAML driver implementation (wasn't using extracted schema) 2015-01-14 18:06:29 +01:00
Marco Pivetta
04467218a3 #881 DDC-2825 - providing YAML mappings for explicit schema definition 2015-01-14 18:05:58 +01:00
Marco Pivetta
7911beaf1c #881 DDC-2825 - providing YAML mappings for implicit schema definition 2015-01-14 18:05:38 +01:00
Marco Pivetta
51bf82b7e7 #881 DDC-2825 - correcting PHP mapping behavior when using implicit schema in table name 2015-01-14 17:54:00 +01:00
Marco Pivetta
0fd51cf852 #881 DDC-2825 - providing PHP mappings for implicit schema definition 2015-01-14 17:53:01 +01:00
Marco Pivetta
d96cd1b690 #881 DDC-2825 - providing PHP mappings for explicit schema definition 2015-01-14 17:52:51 +01:00
Marco Pivetta
53845b79e1 #881 DDC-2825 - providing XML mappings for implicit schema definition 2015-01-14 17:34:44 +01:00
Marco Pivetta
3820fa57d3 #881 DDC-2825 - XML mappings should handle explicitly defined schema name 2015-01-14 17:33:17 +01:00
Marco Pivetta
941bfca68c #881 DDC-2825 - providing XML mappings for explicit schema definition 2015-01-14 17:27:53 +01:00
Marco Pivetta
617fd6cfdc #881 DDC-2825 - moving YAML and XML mapping tests to base mapping driver tests. Excluding Static PHP mapping tests 2015-01-14 16:59:01 +01:00
Marco Pivetta
cf641cd0a3 #881 DDC-2825 - testing annotation driver with table name defining schema name as part of the name 2015-01-14 16:47:05 +01:00
Marco Pivetta
8b2b54c033 #881 DDC-2825 - typo fix (causing test failure) 2015-01-14 16:32:02 +01:00
Marco Pivetta
c6d839869b #881 DDC-2825 - annotation mapping tests for explicitly defined schema name on mappings 2015-01-14 16:30:20 +01:00
Michaël Perrin
0dbc6a12ee Update mapping documentation for schema support
Updated documentation:

* Annotations
* XML
* Yaml
* PHP
2015-01-14 15:48:49 +01:00
Michaël Perrin
54b3c0548d Fix persistence exception on a table with a schema on a platform without schema support 2015-01-14 15:48:49 +01:00
Marco Pivetta
c571f6f6a9 Correctly dealing with emulated cascades in ExtraLazyCollectionTest 2015-01-14 14:36:01 +01:00
Steve Müller
00a8265fb9 Merge pull request #1181 from Ocramius/feature/#385-support-fetching-entities-by-aliased-name
Support fetching entities by aliased name
2015-01-14 13:54:33 +01:00
Marco Pivetta
ba5378fecc #385 #1181 DDC-3385 - fixing Events docblocks as per @deeky666's review 2015-01-13 21:15:34 +01:00
Marco Pivetta
ae8ab0812e #385 #1181 DDC-3385 - fixing OnClassMetadataNotFoundEventArgs docblocks as per @deeky666's review 2015-01-13 21:14:32 +01:00
Marco Pivetta
d712ad97a5 #385 #1181 DDC-3385 - test coverage for OnClassMetadataNotFoundEventArgs impl 2015-01-13 21:04:50 +01:00
Marco Pivetta
662b49608c #385 #1181 DDC-3385 - aligning tests and implementation to new OnClassMetadataNotFoundEventArgs API 2015-01-13 20:56:57 +01:00
Marco Pivetta
6debf2c909 #385 #1181 DDC-3385 - aligning tests to new OnClassMetadataNotFoundEventArgs API 2015-01-13 20:56:40 +01:00
Marco Pivetta
762e798d22 #385 #1181 DDC-3385 - extending OnClassMetadataNotFoundEventArgs from ManagerEventArgs instead of generic EventArgs 2015-01-13 20:56:21 +01:00
Marco Pivetta
6021e3a1b8 #385 #1181 DDC-3385 - Updating docblock of OnClassMetadataNotFoundEventArgs 2015-01-13 20:49:08 +01:00
Marco Pivetta
06f256b410 #385 #1181 DDC-3385 - documenting onClassMetadataNotFound event 2015-01-13 20:45:00 +01:00
Marco Pivetta
f14063def5 #385 #1181 DDC-3385 - splitting test case to verify interface-first fetching of metadata (via fallback logic) 2015-01-13 20:38:01 +01:00
Marco Pivetta
94a2036d50 #385 #1181 DDC-3385 - adding @group annotation to newly introduced tests 2015-01-13 20:37:28 +01:00
Marco Pivetta
eaa9187dd8 #385 #1181 DDC-3385 - minor CS fix (spacing) 2015-01-13 20:33:30 +01:00
Marco Pivetta
8ea394e778 #385 #1181 DDC-3385 - removing @todo that was discussed/cleared 2015-01-13 20:33:10 +01:00
Marco Pivetta
a710706c81 #385 #1181 DDC-3385 - optimized imports, removing duplicate imports (caused by rebase conflicts) 2015-01-13 20:00:40 +01:00
Marco Pivetta
ce4df761df Explicitly requiring doctrine/common with at least version 2.5 2015-01-13 19:51:35 +01:00
Marco Pivetta
e4cbdb57ad Enabling fallback logic in metadata loading 2015-01-13 19:50:55 +01:00
Marco Pivetta
d91b0b4938 Minor CS fixes in the ResolveTargetEntityListener 2015-01-13 19:50:17 +01:00
Marco Pivetta
f5eb20b63d OnClassMetadataNotFoundEventArgs should support setting the actually resolved ClassMetadata as a mutable event result vector 2015-01-13 19:50:17 +01:00
Marco Pivetta
efd4500e6b ClassMetadataFactory should support fallback (event-based) logic for hooking into failed ClassMetadata loading 2015-01-13 19:50:15 +01:00
Bart van den Burg
d66356542d added use statement 2015-01-13 19:49:58 +01:00
Bart van den Burg
3be43a1def Rebased and renamed PreLoadClassMetadata to OnClassMetadataNotFound 2015-01-13 19:49:57 +01:00
Bart van den Burg
437f812718 Added new event to allow actions to be done before trying to load class metadata 2015-01-13 19:49:57 +01:00
Bart van den Burg
19c52e4ae1 added failing test 2015-01-13 19:49:57 +01:00
Bart van den Burg
51528fbdea set metadata for interface to be able to fetch entites by interface name 2015-01-13 19:49:57 +01:00
Guilherme Blanco
25b7c64dc6 Implemented support for extra lazy get for both owning and inverse side on many to many associations. 2015-01-13 17:50:20 +00:00
Marco Pivetta
9c3cb57931 Merge branch 'optimize-persisters'
Close #1246
2015-01-13 15:05:45 +01:00
Marco Pivetta
35dd7f8e2b #1246 DDC-3487 - docblock args fixes 2015-01-13 15:03:04 +01:00
Marco Pivetta
278b8bfa08 #1246 DDC-3487 - minor alignment fixes 2015-01-13 14:58:56 +01:00
Marco Pivetta
7f71cbc8c7 #1246 DDC-3487 - removed unused assignment, minor alignment fixes 2015-01-13 14:54:00 +01:00
Marco Pivetta
97d1d5343e #1246 DDC-3487 - removed unused assignment, making $association variable overwrite more obvious 2015-01-13 14:46:34 +01:00
Marco Pivetta
c4366124c7 #1246 DDC-3487 - removed unused assignment, direct return instead 2015-01-13 14:45:13 +01:00
Marco Pivetta
17a865ec7f #1246 DDC-3487 - correcting docblock (static introspection fix) 2015-01-13 14:39:05 +01:00
Marco Pivetta
b99f4461be #1246 DDC-3487 - re-aligning SQL string concatenation for readability, fixed docblock return value hint 2015-01-13 14:37:32 +01:00
Marco Pivetta
5942b6c302 #1246 DDC-3487 - re-aligning SQL string concatenation for readability 2015-01-13 14:31:22 +01:00
Marco Pivetta
77234d6aec #1246 DDC-3487 - removing unused assignment 2015-01-13 14:30:51 +01:00
Marco Pivetta
a8dcc2acf3 #1246 DDC-3487 - removing possible undefined value path for $newValId for clarity 2015-01-13 14:05:27 +01:00
Guilherme Blanco
c49b0795db Update UPGRADE.md 2015-01-12 22:53:55 -05:00
Guilherme Blanco
de4723883f Merge pull request #1171 from jaimz22/master
Improvements for complex select statements when using new object expression
2015-01-12 22:48:56 -05:00
Guilherme Blanco
bc268da8c2 Small optimization. 2015-01-13 03:30:07 +00:00
Guilherme Blanco
678f47f494 More deprecated code removal. 2015-01-13 02:52:31 +00:00
Guilherme Blanco
965cdbdbbb Optimized column to field resolutions. 2015-01-13 02:18:49 +00:00
Guilherme Blanco
96955d6e79 Some small improvements to persisters. 2015-01-13 02:05:33 +00:00
Marco Pivetta
5630c37b35 Merge branch 'feature/#1240-include-identifiers-in-exception-messages'
Close #1240
2015-01-13 02:56:06 +01:00
Marco Pivetta
1bfa7ea754 #1240 DDC-3479 - Basic coverage for EntityNotFoundException 2015-01-13 02:55:51 +01:00
Marco Pivetta
fc72b41953 #1240 DDC-3479 - Using a static proxy constructor rather than the default constructor 2015-01-13 02:51:47 +01:00
Marco Pivetta
66c556fbfd #1240 DDC-3479 - Fixing minor CS issues (naming, alignment) 2015-01-13 02:48:57 +01:00
Lars Strojny
8e4092750d Include IDs in the exception message to ease debugging 2015-01-13 02:41:05 +01:00
Marco Pivetta
1ac688644a Merge branch 'hotfix/#1242-lock-uninitialized-proxies'
Close #1242
2015-01-13 02:37:09 +01:00
Carnage
00b6f62287 Fixed issue 2015-01-13 02:36:58 +01:00
Carnage
36f9822466 Added test to demonstrate issue 2015-01-13 02:36:58 +01:00
Marco Pivetta
ef113e52ab Merge branch 'feature/#1054-DDC-3161-allow-connection-access-in-filters'
Close #1054
2015-01-13 02:06:49 +01:00
Marco Pivetta
ef5a3f1bb7 #1054 DDC-3161 - adding @group annotation for newly introduced tests 2015-01-13 02:06:39 +01:00
Vladislav Veselinov
759836113f assertion fix 2015-01-13 02:05:49 +01:00
Vladislav Veselinov
79bf84e1ad revert typehint change 2015-01-13 02:05:49 +01:00
Vladislav Veselinov
9cb17d2915 EntityManagerInterface instead of EntityManager
Make connection available in filters
Add test for the changes
2015-01-13 02:05:49 +01:00
Marco Pivetta
14c3adbec0 Merge branch 'hotfix/#470-DDC-54-postLoad-deferred-event-triggering-tests'
Close #470
2015-01-13 01:43:44 +01:00
Marco Pivetta
b81209c278 #470 DDC-54 DDC-3005 - documenting postLoad and Doctrine\ORM\AbstractQuery#iterate() partial incompatibility 2015-01-13 01:43:12 +01:00
Marco Pivetta
f571a9ef88 #470 DDC-54 DDC-3005 - query iteration must cause eager hydrationComplete logic to be fired 2015-01-13 01:42:38 +01:00
Marco Pivetta
0ffc752f6f #470 DDC-54 DDC-3005 - simple-object hydration should also trigger postLoad events when iterating over single results 2015-01-13 01:42:03 +01:00
Marco Pivetta
5cd73f0d12 #470 DDC-54 DDC-3005 - reverting assertion
`postLoad` should be triggered eagerly when using `iterate()`, as worse problems may be experienced with
missed initialization via listeners.
2015-01-13 01:36:13 +01:00
Marco Pivetta
0a19fbb376 #470 DDC-54 DDC-3005 - minor test cleanups, changing test according to current limitation to document the actual expected behavior 2015-01-13 01:26:04 +01:00
Marco Pivetta
a884452ffc #470 DDC-54 DDC-3005 - removing unused PostLoadEventDispatcher 2015-01-13 01:16:46 +01:00
Marco Pivetta
b1144e74ea #470 DDC-54 DDC-3005 - reverting hydrator changes, as patch DDC-3005 already deals with the issue 2015-01-13 01:09:23 +01:00
Lukasz Cybula
aa4796cd0d Moved postLoad dispatching from UnitOfWork to object hydrators 2015-01-13 01:03:48 +01:00
Marco Pivetta
a906295c65 Merge branch 'hotfix/#1001-DDC-3005-defer-postload-event-after-fully-populated-associations'
Close #1001
2015-01-13 00:54:31 +01:00
Marco Pivetta
d09280a1dc #1001 DDC-3005 - HydrationCompleteHandler cs fixes (line-wrap) 2015-01-13 00:52:12 +01:00
Marco Pivetta
45221b1951 #1001 DDC-3005 - removed HydrationCompleteHandler#invokeAllDeferredPostLoadEvents() (useless method call indirection) 2015-01-13 00:51:44 +01:00
Marco Pivetta
c9ccd91421 #1001 DDC-3005 - optimized HydrationCompleteHandler imports 2015-01-13 00:50:19 +01:00
Marco Pivetta
730c2a81f7 #1001 DDC-3005 - HydrationCompleteHandler static introspection cleanups, as well as memory and performance improvements 2015-01-13 00:50:05 +01:00
Marco Pivetta
8c54a65aa5 #1001 DDC-3005 - Verifying HydrationCompleteHandler skips over registered deferred loads that were already handled by hydrationComplete 2015-01-13 00:48:53 +01:00
Marco Pivetta
29d4d342bd #1001 DDC-3005 - Testing HydrationCompleteHandler with multiple deferred entities postLoads 2015-01-13 00:45:07 +01:00
Marco Pivetta
948d6c2b9f #1001 DDC-3005 - Testing HydrationCompleteHandler against all possible ListenersInvoker flags 2015-01-13 00:39:28 +01:00
Marco Pivetta
833058fd2e #1001 DDC-3005 - Testing HydrationCompleteHandler when no events should be triggered 2015-01-13 00:36:17 +01:00
Marco Pivetta
7b81cfb6ea #1001 DDC-3005 - Minor CS fixes in HydrationCompleteHandler 2015-01-13 00:33:15 +01:00
Marco Pivetta
89530f88f7 #1001 DDC-3005 - Removing dead assignment HydrationCompleteHandler#__construct() 2015-01-13 00:32:10 +01:00
Marco Pivetta
516d04c391 #1001 DDC-3005 - Removing useless dependency from the HydrationCompleteHandler to the UnitOfWork 2015-01-13 00:31:32 +01:00
Marco Pivetta
fccd08afa5 #1001 DDC-3005 - Basic coverage for the HydrationCompleteHandler 2015-01-13 00:29:50 +01:00
Marco Pivetta
af93539576 #1001 DDC-3005 - HydrationCompleteHandler should accept EntityManagerInterface instances 2015-01-13 00:06:07 +01:00
Marco Pivetta
22e12e0043 #1001 DDC-3005 - coverage annotations, minor CS fixes 2015-01-12 23:50:16 +01:00
Guilherme Blanco
dd883f2136 Moved delete() and update() to proper locations. 2015-01-12 22:04:04 +00:00
Strate
0c8a31bf2b DDC-3005. Revert empty line. Removed @since annotation 2015-01-12 22:34:24 +01:00
Strate
96184b9541 DDC-3005.Removed warning in documentation 2015-01-12 22:34:24 +01:00
Strate
367a79206d DDC-3005. Renamed class by removing underscore 2015-01-12 22:34:24 +01:00
Strate
35ea399d33 DDC-3005 Defer invoking of postLoad event to the end of hydration cycle.
1. Refactor handling of hydration complete: delegate this task to special object
2. Write test case for situation, when inside postLoad listener other entity is loading.
3. Make test, written on second step, be able to pass :)
2015-01-12 22:34:24 +01:00
Strate
f3b31c2807 DDC-3005 Defer invoking of postLoad event to the end of hydration cycle.
This feature makes guarantee, that postLoad event fires after all associations are populated
2015-01-12 22:33:40 +01:00
Marco Pivetta
b9c0868f08 Merge branch 'one-to-many-extra-lazy-joined-inheritance'
Close #1245
2015-01-12 22:05:12 +01:00
Marco Pivetta
0f362b0650 #1245 DDC-2504 - removing duplicate test 2015-01-12 22:03:54 +01:00
Marco Pivetta
ebf5811761 #1245 DDC-2504 - extracting test:
Removing an unmanaged/persisted/new item from a one-to-many extra-lazy association to a JTI does not initialize the collection
2015-01-12 21:55:57 +01:00
Marco Pivetta
25d40caf1e #1245 DDC-2504 - extracting test:
Removing a managed item from a one-to-many extra-lazy association to a JTI does not initialize the collection
2015-01-12 21:43:37 +01:00
Marco Pivetta
ec08286173 #1245 DDC-2504 - constants over string references 2015-01-12 21:37:53 +01:00
Marco Pivetta
7a0cb1c370 #1245 DDC-2504 - splitting test method into a test about count() and one about contains() on a lazy persistent collection 2015-01-12 21:34:12 +01:00
Marco Pivetta
8d287b17d7 #1245 DDC-2504 - splitting test method into single feature checks 2015-01-12 21:29:48 +01:00
Guilherme Blanco
932a56f26f Internalize UnitOfWork in CollectionPersisters. Updated related code. 2015-01-12 19:52:27 +00:00
Guilherme Blanco
c5f1b99721 Fixed wrong return. 2015-01-12 18:18:15 +00:00
Guilherme Blanco
73afcec22a Implemented support for one to many extra lazy with joined inheritance. 2015-01-12 18:15:13 +00:00
Marco Pivetta
573153669c Merge pull request #1244 from BenMorel/static
Change $this return type to static in AbstractQuery
2015-01-11 18:02:45 +01:00
Benjamin Morel
fbcf18cf33 Changed $this return type to static in AbstractQuery
This allows IDEs and static code analysis tools to properly understand the return type when chaining methods, for example when using the QueryBuilder.
2015-01-11 16:48:09 +00:00
Guilherme Blanco
4dbfdfb9d6 Merge pull request #1243 from doctrine/composer-autoloader-dev
Fixed phpunit tests autoload requirements and moved to composer autoload-dev
2015-01-10 16:05:14 -05:00
Guilherme Blanco
9201d09ab7 Fixed phpunit tests autoload requirements and moved to composer autoload-dev configuration. 2015-01-10 20:28:57 +00:00
Marco Pivetta
be91cc9bb3 Merge pull request #1239 from deeky666/fix-index-duplication
Fix index duplication for unique association join columns
2015-01-09 23:07:50 +01:00
Marco Pivetta
664b6bf4c5 Merge pull request #1227 from c960657/production-settings-query-cache
Ensure query cache is not ArrayCache in production
2015-01-09 16:58:38 +01:00
Steve Müller
d1e5034659 fix index duplication for unique association join columns 2015-01-08 15:39:41 +01:00
Marco Pivetta
0cbab230bf Merge branch 'feature/#1238-allow-skipping-column-prefixing-in-xml-mapped-embeddables'
Close #1238
2015-01-08 13:33:52 +01:00
Marco Pivetta
6fdb100793 #1238 DDC-3293 DDC-3477 - exploding tests with set use-column-prefix="true" and use-column-prefix="false" xml mappings 2015-01-08 13:33:38 +01:00
Marco Pivetta
43db4a4182 #1238 DDC-3293 DDC-3477 - adding @group annotations for newly introduced tests 2015-01-08 13:28:11 +01:00
Andrey Knupp Vital
a701c9d046 Removing warning about non-availability of no-prefix in XML mappings 2015-01-08 10:11:22 -02:00
Andrey Knupp Vital
74a2cfc83b Also adding docs for the new attribute use-column-prefix 2015-01-08 09:37:41 -02:00
Andrey Knupp Vital
08e8af9372 Type-hinting SimpleXMLElement (_getCascadeMappings) 2015-01-08 09:28:15 -02:00
Andrey Knupp Vital
b90943c56b Minor improvements 2015-01-08 09:04:37 -02:00
Andrey Knupp Vital
bacadbf366 Adding tests for the attribute use-column-prefix 2015-01-08 00:11:34 -02:00
Andrey Knupp Vital
4935da138d Respecting use-column-prefix instead of relying on false/0 of column-prefix 2015-01-08 00:10:24 -02:00
Andrey Knupp Vital
c964dd0cd2 Adding use-column-prefix attribute as proposed (DDC-3293) #1239 2015-01-08 00:09:30 -02:00
Andrey Knupp Vital
8bbc492978 Removing weird strict comparison on different types 2015-01-07 17:24:44 -02:00
Andrey Knupp Vital
82cda1ecb0 Prevents prefixing a column when false on column-prefix (XML) 2015-01-07 17:22:48 -02:00
Guilherme Blanco
ef65270387 Merge pull request #1230 from johannes/master
Allow dumping SQL query when passing DQL on cli
2015-01-06 21:39:11 -05:00
Marco Pivetta
6448627bc9 Merge pull request #1233 from SofHad/refactoring-duplicate-code
[Minor] Refactoring to avoid duplicate code
2015-01-04 22:59:05 +01:00
SofHad
eb22db0dcf remove the unnecessary check 2015-01-04 21:01:32 +01:00
Marco Pivetta
5237692979 Merge pull request #1236 from abackstrom/patch-1
Minor docs fix: missing word 'do'
2014-12-31 09:59:33 +01:00
Marco Pivetta
d13e2fbb83 Merge branch 'hotfix/#1235-consistent-joined-subclass-persister-return-types'
Close #1235
2014-12-31 09:46:31 +01:00
Marco Pivetta
0f165bce50 #1235 DDC-3470 - coverage annotations 2014-12-31 09:46:19 +01:00
Marco Pivetta
a93e5fa1c2 #1235 DDC-3470 - license headers 2014-12-31 09:45:46 +01:00
Marco Pivetta
74f00327bd #1235 DDC-3470 - adding @group annotation for newly introduced test cases 2014-12-31 09:45:33 +01:00
Marco Pivetta
e2b34ff5d2 #1235 DDC-3470 - joined subclass persister empty executeInserts() method return type test 2014-12-31 09:44:39 +01:00
Annika Backstrom
27fe4d78b7 Minor docs fix: missing word 'do' 2014-12-30 20:12:11 -05:00
Martin Prebio
8f15c5e905 Consistent return type confirming with interface 2014-12-31 01:28:05 +01:00
Sofiane HADDAG
8d91f7de60 Rename handleCache to updateCache 2014-12-30 14:49:12 +01:00
shaddag
ccb09ad0ac Rename the private method 2014-12-30 14:10:56 +01:00
shaddag
12b5a0cdd7 Extracted ony the common logic 2014-12-30 14:06:48 +01:00
shaddag
50ef1369c3 [Minor] Refactoring to avoid duplicate code 2014-12-30 10:03:49 +01:00
Johannes Schlüter
cdb62a70cd Allow dumping SQL query when passing DQL on cli 2014-12-24 14:15:23 +01:00
Christian Schmidt
61c72e4aa7 Ensure query cache is not ArrayCache in production 2014-12-19 20:18:45 +01:00
James Murray
d9cbe1a8b7 removed unnecessary fieldIdentificationVariable property check 2014-12-19 14:10:47 -05:00
James Murray
2f76571d3a Added a fix for ObjectHydrator when the same number of scalar results and new object results exist
Adding additional tests for mixed New object and scalar query
2014-12-19 14:06:03 -05:00
Marco Pivetta
193e31f22a Merge pull request #1226 from stof/patch-2
Update Travis badges to use the SVG version
2014-12-19 19:19:48 +01:00
Christophe Coevoet
92efd887e2 Update Travis badges to use the SVG version 2014-12-19 19:04:04 +01:00
Guido Contreras Woda
82847e1851 Added more docblock 2014-12-16 22:37:50 -03:00
Guido Contreras Woda
8fd28fcd8f Added embedded and embeddables to ClassMetadataBuilder 2014-12-16 22:30:28 -03:00
Marco Pivetta
5a6bbbd624 Merge branch 'hotfix/#1216-tests-for-#1214-xml-driver-exporting'
Close #1216
Close #1214
2014-12-10 01:33:23 +01:00
Marco Pivetta
b6bbf6ac22 #1214 #1216 - adding @group annotation for newly introduced test cases 2014-12-10 01:33:09 +01:00
Fedik
68ed56ce27 test for #1214, XML export the field options 2014-12-09 20:49:51 +02:00
Marco Pivetta
1cc42d6a63 Merge branch 'hotfix/#1202-nullable-options-should-be-allowed'
Close #1202
2014-12-08 01:35:11 +01:00
Marco Pivetta
78ba7f1073 #1202 - simplified test and test asset 2014-12-08 01:34:30 +01:00
Gareth Evans
c1000d23db Added test that passes following previous commit 2014-12-08 01:31:14 +01:00
Gareth Evans
2fac6272a1 Checks key exists rather than isset
If the default value is set to `null`, `isset` will return `false` even though the key is actually there for a reason.
2014-12-08 01:31:14 +01:00
Marco Pivetta
9509bec79a Merge branch 'hotfix/#1213-DDC-3437-reflection-embeddable-with-abstract-embeddable-ancestor'
Close #1213
2014-12-08 01:22:31 +01:00
Marco Pivetta
cf1b16a505 #1213 - DDC-3437 - renaming variables/alignment/clarifications in docblocks 2014-12-08 01:22:20 +01:00
Marco Pivetta
357292de44 #1213 - DDC-3437 - removing unused test assets 2014-12-08 01:20:00 +01:00
Marco Pivetta
55bcc193ae #1213 - DDC-3437 - removing redundant test method 2014-12-08 01:19:15 +01:00
Marco Pivetta
af0be57538 #1213 - DDC-3437 - integrating new tests into the pre-existing data-provider 2014-12-08 01:18:36 +01:00
Marco Pivetta
d75d6ffb11 #1213 - DDC-3437 - adding relevant test assets 2014-12-08 01:17:57 +01:00
Marco Pivetta
d259ba91b3 #1213 - DDC-3437 - refactoring tests to support embeddable class name != embeddable class property declaring class 2014-12-08 01:17:25 +01:00
Austin Morris
d48546d2dd fix instantiation of embedded object in ReflectionEmbeddedProperty 2014-12-08 01:06:11 +01:00
Guilherme Blanco
9900d35367 Merge pull request #1214 from Fedik/fix-xml-export-options
XML export driver: fix the options export
2014-12-07 10:52:45 -05:00
Fedik
c1eff7045a XML export driver: fix export options 2014-12-07 13:05:19 +02:00
Guilherme Blanco
0059e01936 Merge pull request #1208 from Ocramius/hotfix/DDC-3427-class-metadata-factory-should-accept-entitymanagerinterface-instances
DDC-3427 - class metadata factory should accept `EntityManagerInterface` instances
2014-12-05 12:22:23 -05:00
Marco Pivetta
590d971f83 Merge pull request #1211 from Ocramius/hotfix/DDC-3434-paginator-ignores-hidden-fields-in-order-by-query
DDC-3434 - paginator ignores `HIDDEN` fields in `ORDER BY` query
2014-12-05 18:02:39 +01:00
Marco Pivetta
ac67a10d4c DDC-3434 - adding note on why restoring 'HIDDEN' selected fields is relevant 2014-12-05 18:02:12 +01:00
Marco Pivetta
6169175a89 DDC-3434 - HIDDEN modifier marked fields in ORDER BY clause are always preserved when creating a paginator subquery 2014-12-05 17:11:57 +01:00
Marco Pivetta
6e8057b6ea DDC-3434 - adding test case for HIDDEN modifier fields in ORDER BY sequences: should be preserved in any case 2014-12-05 17:10:39 +01:00
Marco Pivetta
0c9a898ccd DDC-3434 - removed unneeded escaping sequences 2014-12-05 17:09:59 +01:00
Guilherme Blanco
a6cf714f41 Merge pull request #1210 from Ocramius/hotfix/DDC-3336-undefined-property-with-paginator-and-scalar-expression-select
DDC-3336 - undefined property with paginator walker and scalar expression in ORDER BY clause
2014-12-05 10:42:55 -05:00
Marco Pivetta
e53e8bfe8e DDC-3336 - applied hotfix: only PathExpression instances have a $field property 2014-12-05 14:56:47 +01:00
Marco Pivetta
c689ff081d DDC-3336 - adding missing type-hint docblock 2014-12-05 14:55:56 +01:00
Marco Pivetta
2bc8811e62 DDC-3336 - renamed test method for clarity 2014-12-05 14:55:26 +01:00
Marco Pivetta
42e0e6b0b8 DDC-3336 - adding failing test case: scalar expressions in the ORDER BY clause crash the LimitSubqueryOutputWalker 2014-12-05 14:54:26 +01:00
Marco Pivetta
529a268bbc DDC-3336 - importing platform classes 2014-12-05 14:53:42 +01:00
Steve Müller
38650b748d Merge pull request #1207 from Ocramius/hotfix/embedded-classes-reflection-new-instance-creation
Embedded classes reflection new instance creation with internal PHP classes
2014-12-05 14:24:23 +01:00
Marco Pivetta
e65417f1f6 DDC-3427 - Adding setting an EntityManagerInterface instance in the ClassMetadataFactory#setEntityManager() 2014-12-05 13:49:42 +01:00
Marco Pivetta
d20e018081 DDC-3427 - Adding a test to verify that the ClassMetadataFactory supports setting an EntityManagerInterface instance 2014-12-05 13:38:45 +01:00
Marco Pivetta
dcf824688a Verifying that reflection properties that don't contain an embeddable will not crash reading properties, but will return null instead 2014-12-05 13:15:15 +01:00
Marco Pivetta
b4a23e97a9 ReflectionEmbeddedProperty should be like any ReflectionProperty, and should therefore extend it for type compatibility 2014-12-05 13:06:41 +01:00
Marco Pivetta
112fdf46d0 Using instantiator to work with internal PHP classes as embeddables 2014-12-05 13:00:54 +01:00
Marco Pivetta
a8b0ac82b4 Adding a data-provider case for a generic model (non-internal class) 2014-12-05 12:57:48 +01:00
Marco Pivetta
ecf028490f Test to verify that Doctrine\ORM\Mapping\ReflectionEmbeddedProperty is able to interact with internal PHP classes 2014-12-05 12:56:34 +01:00
Marco Pivetta
7f84bc76a6 Namespace correction 2014-12-05 12:43:12 +01:00
Marco Pivetta
56cb47c585 Adding a test asset to play around with reflection and internal classes 2014-12-05 12:41:22 +01:00
Marco Pivetta
fc3f233923 Yodaism good for you: is. 2014-12-05 11:18:10 +01:00
Marco Pivetta
1d5a0a0a1b Adding docblocks 2014-12-05 11:17:43 +01:00
Marco Pivetta
b9506ac64a Merge pull request #1195 from decoursin/patch-1
Correction Events.rs - Entity Listeners Resolver
2014-12-04 14:03:09 +01:00
Marco Pivetta
8d4b46d014 Merge branch 'hotfix/#1204-metadata-xml-exporter-should-export-sequence-generator-info'
Close #1204
2014-12-04 14:00:34 +01:00
Marco Pivetta
c35f1310bc #1204 - using specific XML assertions to build a less-fragile test (asserting on the entire string may cause failures if the XML structure changes) 2014-12-04 14:00:05 +01:00
Marco Pivetta
ce308dc476 #1204 - refactored sequence-generator metadata exporting into own private method for simplicity 2014-12-04 14:00:05 +01:00
Paulo de Freitas
aa1454562c Fix sequence-generator in MetaData exporter for XML Driver. 2014-12-04 14:00:05 +01:00
Marco Pivetta
798a8b6d91 Merge pull request #1205 from Ocramius/hotfix/#1200-Yaml-parse-does-not-accept-files-in-symfony-2-6-fix
Hotfix - #1200 - Symfony 2.7.x deprecation fixes
2014-12-04 13:59:02 +01:00
Marco Pivetta
351707f1f1 #1200 - bumping symfony/console dependency to ~2.5 because of the Symfony\Component\Console\Helper\Table not being available in < 2.5 2014-12-04 13:42:38 +01:00
Marco Pivetta
9d2c0481ae #1200 - removing console deprecation errors by using the new Symfony\Component\Console\Helper\Table instead of the deprecated TableHelper 2014-12-04 13:40:22 +01:00
Marco Pivetta
d3b1bf571b #1200 - removing Yaml::parse() deprecation errors by passing in file contents instead of file paths 2014-12-04 13:37:59 +01:00
Guilherme Blanco
30bf192cf4 Merge pull request #1201 from marcosdsanchez/master
Update working-with-objects.rst
2014-12-01 10:52:56 -05:00
Marcos Sánchez
8e26705693 Update working-with-objects.rst
Fix syntax error in constructor.
2014-12-01 12:50:11 -03:00
Marco Pivetta
c2ad338707 Merge pull request #1198 from Bilge/patch-2
Tables for buttons.
2014-11-28 12:23:23 +01:00
Marco Pivetta
18fd892c85 Merge pull request #1199 from kormik/patch-1
minor typo
2014-11-28 11:14:09 +01:00
Tomas Kormanak
27e671378b minor typo 2014-11-28 08:40:00 +00:00
Bilge
13c03b573c Tables for buttons. 2014-11-28 05:18:18 +00:00
Marco Pivetta
ee13405a13 Merge pull request #1197 from Bilge/patch-1
Minor grammar fix.
2014-11-27 19:16:00 +01:00
Marco Pivetta
9eae0d5ce8 Merge branch 'hotfix/#1196-inherit-mapped-superclass-indexes'
See DDC-3418
See DDC-3419

Close #1196
2014-11-27 19:10:57 +01:00
Marco Pivetta
b3fe0904eb #1196 DDC-3418 DDC-3419 - Minor CS fixes, explicit setExpectedException calls 2014-11-27 19:10:45 +01:00
Marco Pivetta
71135972c6 #1196 DDC-3418 DDC-3419 - Renamed _factory to cmf 2014-11-27 19:08:10 +01:00
Marco Pivetta
291b68634e #1196 DDC-3418 DDC-3419 - Adding missing docblock for test private property 2014-11-27 19:07:16 +01:00
Bilge
f9b4df70ff Minor grammar fix. 2014-11-27 18:07:10 +00:00
Marco Pivetta
34d2af8a77 #1196 DDC-3418 DDC-3419 - assertArrayHasKey() instead of assertTrue(isset(...)) 2014-11-27 19:06:42 +01:00
Marco Pivetta
084ce7ecc0 #1196 DDC-3418 DDC-3419 - reducing test assets annotations spacing for readability 2014-11-27 18:57:49 +01:00
Marco Pivetta
b761d84d4f #1196 DDC-3418 DDC-3419 - refactoring class metadata factory to avoid duplicate checks 2014-11-27 18:54:10 +01:00
Marco Pivetta
7648a3c590 #1196 DDC-3418 DDC-3419 - refactoring inherited indexes copying logic into separate private method 2014-11-27 18:52:03 +01:00
Dustin Thomson
17ec1aab77 Modified class metadata factory to have entity tables inherit indexes from mapped superclasses 2014-11-27 18:41:33 +01:00
Marco Pivetta
ec6781954a Merge branch 'hotfix/#1188-support-count-queries-with-parameters-in-removed-query-parts'
Close #1188
2014-11-27 18:16:22 +01:00
Marco Pivetta
f536daa1e4 #1188 - Simplified and optimized parameter un-setting logic 2014-11-27 18:08:11 +01:00
Marco Pivetta
ac0f1b2ce2 #1188 - Importing parser class 2014-11-27 17:59:12 +01:00
Marco Pivetta
64752532dd #1188 - assertCount instead of assertEquals 2014-11-27 17:57:42 +01:00
Marco Pivetta
42547234d2 #1188 - minor CS fixes (avoiding DQL one-liner) 2014-11-27 17:54:02 +01:00
Marco Pivetta
ecb09b5627 #1188 - accessing Doctrine\ORM\Tools\Pagination\Paginator#getCountQuery() via reflection for test purposes 2014-11-27 17:50:27 +01:00
Marco Pivetta
69064ac13d #1188 - making Doctrine\ORM\Tools\Pagination\Paginator#getCountQuery() private, as it is an implementation detail 2014-11-27 17:48:37 +01:00
Marco Pivetta
a80117a4ee #1188 - removing unused variable assignments 2014-11-27 17:42:14 +01:00
Paweł Kolanowski
af39fce6e5 Missing doc block, removed parse() parameter.
Missing doc block, removed parse() parameter.
2014-11-27 17:27:22 +01:00
Merixstudio
18244161f7 Filtering by auto-increnement field causes test error.
Executing the same test many times causes error because AI fields.
2014-11-27 17:27:22 +01:00
Merixstudio
de1843ad30 Testing SQLs in functional test is not necessary 2014-11-27 17:27:22 +01:00
Merixstudio
fa014ee55d Test parameter removing parameters passed to select part of query. 2014-11-27 17:27:22 +01:00
Merixstudio
d02ea224df Allowed to get count query from paginator. 2014-11-27 17:27:22 +01:00
Merixstudio
42aff75108 Fixed counting exception
Fixed "Invalid parameter number: number of bound variables does not match number of tokens " exception during execution count on Query where select part of query contains :parameters.
2014-11-27 17:27:22 +01:00
Nick DeCoursin
82c5547931 Correction Events.rs - Entity Listeners Resolver
Configuring the Entity Listener Resolver can only be done before Entity Manager is initialized as described here: https://github.com/doctrine/doctrine2/pull/1193
2014-11-26 19:29:58 -05:00
Steve Müller
bf5003f25e Merge pull request #1192 from javiereguiluz/patch-4
Fixed a very minor typo
2014-11-25 09:42:10 +01:00
Javier Eguiluz
7e64d606d2 Fixed a very minor typo 2014-11-25 09:41:13 +01:00
Marco Pivetta
88ce68e733 Merge pull request #1190 from c960657/autogenerate-integer
Document that AUTOGENERATE_ constants are allowed
2014-11-21 21:54:00 +01:00
Christian Schmidt
89684b4ce9 Document that AUTOGENERATE_ constants are allowed 2014-11-21 21:11:32 +01:00
Marco Pivetta
e7be0c4dc9 Merge pull request #1184 from goetas/patch-2
Postgres SERIAL is not a post-insert identifier generation strategy
2014-11-12 10:31:52 +01:00
Asmir Mustafic
a1660997ff Postgres SERIAL is not a post-insert identifier generation strategy 2014-11-12 10:10:06 +01:00
Marco Pivetta
9280a4621d Merge pull request #1183 from NAYZO/patch-2
Update tools.rst
2014-11-12 10:04:49 +01:00
Ala Eddine Khefifi
44304c30b3 Update tools.rst 2014-11-12 09:55:51 +01:00
Marco Pivetta
ab62914f87 Merge pull request #1089 from encoder32/EntityRepositoryGeneratorDefaultRepository
EntityRepositoryGenerator default repository
2014-11-11 16:22:51 +01:00
Marco Pivetta
f987cf77b5 Merge branch 'hotfix/#1173-merge-association-to-identical-entities'
Close #1173
2014-11-11 12:38:08 +01:00
Marco Pivetta
2888791e5c #1173 - test CS fixes, reduced clutter code, made method names more explicit 2014-11-11 12:37:16 +01:00
Marco Pivetta
511893e182 #1173 - applying CS fixes on top of the patch 2014-11-11 12:27:57 +01:00
Mathieu De Zutter
2ead9e23ab Fix merging of entities with associations to identical entities.
Without this patch, when an entity that refers multiple times to the same
associated entity gets merged, the second references becomes null.

The main issue is that even though doMerge returns a managed copy, that value
is not used while cascading the merge. These identicial entities are already
detected through the visitor map, but they are ignored.  There should be some
refactoring so cascadeMerge calls a function that checks if the parent must be
updated, based on the return value of its call to doMerge.  However, this patch
tries to impact the code as little as possible, and only introduces a new
function to avoid duplicate code.

The secondary issue arises when using inverted associations. In that case, it
is possible that an entity to be merged is already merged, so the the visitor
map is looked up by the hash of a managed copy instead of the original entity.
This means that in this case the visitor map entries should also be set to the
entity, instead of being set to 'true'.
2014-11-11 12:12:25 +01:00
Mathieu De Zutter
9caef62489 Test case for merging entities with associations to identical entities. 2014-11-11 12:12:25 +01:00
Marco Pivetta
25849a3412 Merge pull request #1177 from c960657/production-settings-arraycache
Ensure metadata cache is not ArrayCache in production
2014-11-11 10:43:29 +01:00
Christian Schmidt
3287ce12a4 Fix namespace collission 2014-11-11 08:31:36 +01:00
Christian Schmidt
c973d8df1a Code style fixes. 2014-11-11 07:35:52 +01:00
jaimz22
dd012dfd90 oops.. forgot to add a condition 2014-11-08 16:56:42 +00:00
jaimz22
e2f1ea7f23 stupid cloud 9 ide broke my code :( sorry 2014-11-08 16:45:58 +00:00
jaimz22
c47a072815 fixed for failing test case. when a single DTO is specified in the query, you no longer get a multidimensional array returned. 2014-11-08 16:36:55 +00:00
jaimz22
2ffda34f23 fixing a missing index error 2014-11-08 10:15:33 -05:00
Christian Schmidt
0990d64756 Ensure metadata cache is not ArrayCache in production 2014-11-08 15:05:56 +01:00
Marco Pivetta
76e1a469ef Merge pull request #1027 from PowerKiKi/feature-partial-indexes
Support for Partial Indexes for PostgreSql and Sqlite
2014-11-05 13:19:29 +01:00
James Murray
da7e4ed8de removing orphaned scalar results and allowing mixed results when use new object expressions 2014-10-28 17:59:37 -04:00
James Murray
85eac7200d Adding the ability to alias new object expressions 2014-10-28 17:34:57 -04:00
Marco Pivetta
20c6bfd360 Aligning expected exception test to typo fix in doctrine/doctrine2@b7d104d2a2, which was breaking the build 2014-10-23 07:01:59 +02:00
Guilherme Blanco
b7d104d2a2 Fixed typo 2014-10-21 22:43:26 -04:00
Guilherme Blanco
3a0d7d1d6b Merge pull request #1146 from c960657/order-by-assoc
Allow orderBy to reference associations
2014-10-21 21:40:04 -04:00
Guilherme Blanco
3924ede3ad Merge pull request #1128 from Erikvv/patch-1
Add QueryBuilder::addSelect()
2014-10-21 21:35:26 -04:00
Kim Hemsø Rasmussen
6fc6d18882 Merge pull request #1165 from Ocramius/feature/#1120-metadata-info-command
[DDC-3205] #1120 - metadata info command
2014-10-20 20:46:33 +02:00
Marco Pivetta
ea6f2130b4 #1120 - downgrading requirement for symfony/console to ~2.3
Just need `Symfony\Component\Console\Helper\TableHelper` availability
2014-10-20 18:51:39 +02:00
Marco Pivetta
95bc0fb456 #1120 - using the Symfony\Component\Console\Helper\TableHelper for symfony/symfony:~2.3 compatibility
(Instead of `Symfony\Component\Console\Helper\Table`)
2014-10-20 18:49:54 +02:00
Marco Pivetta
a0e107249f Removing public properties validation (supported) 2014-10-20 15:15:05 +02:00
Marco Pivetta
9ccb56a7ab #1120 - applying CS fixes as per @dantleech's review 2014-10-19 19:56:21 +02:00
Marco Pivetta
9bf8f6ed4c DDC-3261 - fixed link to DBAL documentation (should always reference latest) 2014-10-19 19:18:11 +02:00
Marco Pivetta
29e99b2b89 #1120 - removed duplication: field and association mappings actually use the same dump format 2014-10-19 18:57:58 +02:00
Marco Pivetta
d5d64b756d #1120 - removed redundant if block 2014-10-19 18:42:14 +02:00
Marco Pivetta
1208cc836a #1120 - registering the new MappingDescribeCommand with the ORM's ConsoleRunner 2014-10-19 18:41:14 +02:00
Marco Pivetta
806068b0df #1120 - removing useless variables, refactoring 2014-10-19 18:36:08 +02:00
Marco Pivetta
39a8a31de9 #1120 - removing unused private properties 2014-10-19 18:34:42 +02:00
Marco Pivetta
574f3ea909 #1120 - map functions over array iteration/mutation 2014-10-19 18:34:06 +02:00
Marco Pivetta
254a46e79c #1120 - avoiding mutable state for rows/output 2014-10-19 18:32:12 +02:00
Marco Pivetta
250b38710c #1120 - missing docblock parameter 2014-10-19 18:23:50 +02:00
Marco Pivetta
db74efbe34 #1120 - test coverage annotations 2014-10-19 18:22:28 +02:00
Marco Pivetta
0f289a1270 #1120 - cs cleanups - moving success cases at the end of methods 2014-10-19 18:21:45 +02:00
Marco Pivetta
97fdd0adb7 #1120 - cleaning up try-catch code when fetching metadata 2014-10-19 18:14:33 +02:00
Marco Pivetta
100766e360 #1120 - Removing example array('Foo', 'Bar', 'Boo') dumped data 2014-10-19 18:13:46 +02:00
Marco Pivetta
dcdffbffc7 #1120 - assuming existence of Symfony\Component\Console\Helper\Table 2014-10-19 18:13:01 +02:00
Marco Pivetta
a762158e99 #1120 - since we want to use Symfony\Component\Console\Helper\Table, symfony/console:~2.5 is required 2014-10-19 18:11:42 +02:00
Marco Pivetta
7cf427cfbf #1120 - avoiding version comparisons when working with version-dependant constants 2014-10-19 17:53:40 +02:00
Marco Pivetta
ed79648d7d #1120 - avoiding storing the Doctrine\ORM\EntityManager in the command itself 2014-10-19 17:51:17 +02:00
Marco Pivetta
cf078d8da8 #1120 - avoiding storing the Doctrine\ORM\EntityManager in the command itself 2014-10-19 17:49:28 +02:00
Marco Pivetta
e9d7c23261 #1120 - MappingDescribeCommand can be final 2014-10-19 17:43:32 +02:00
dantleech
37de75b2ae Split new functionality into new command 2014-10-19 17:40:50 +02:00
dantleech
c71b489e9e Added preg_quote and doc blocks 2014-10-19 17:40:50 +02:00
dantleech
b5552a82e3 Code review fixes 2014-10-19 17:40:50 +02:00
dantleech
51cd8f7ce8 Added test 2014-10-19 17:40:50 +02:00
dantleech
45ce6a41a3 Expanded scope of orm:info to include metadata information 2014-10-19 17:40:50 +02:00
Marco Pivetta
a9bd51c0e4 Merge branch 'hotfix/#615-enforce-A-to-Z-sql-table-aliases'
Close #615
2014-10-19 17:25:09 +02:00
Marco Pivetta
b989175754 #615 - Removing unused assignment 2014-10-19 17:24:07 +02:00
Marco Pivetta
264cd8ee11 #615 - Refactoring test case to remove duplication 2014-10-19 17:21:13 +02:00
Marco Pivetta
69494dc624 #615 - sql table aliases should stay constant over time 2014-10-19 17:18:30 +02:00
Marco Pivetta
10da2eb85b #615 - Using a data provider to build aliases for the SqlWalkerTest 2014-10-19 17:16:07 +02:00
Marco Pivetta
17c9388473 #615 - Test coverage annotations 2014-10-19 17:10:39 +02:00
Marco Pivetta
435befd25c #615 - EOF EOL fixes 2014-10-19 17:09:41 +02:00
Marco Pivetta
d557a0e01b #615 - assignment alignment 2014-10-19 17:09:27 +02:00
Marco Pivetta
a4e9c235f8 #615 - assignment alignment 2014-10-19 17:08:33 +02:00
Mike Meier
109b0444f5 add SqlWalkerTest for getSQLTableAlias method 2014-10-19 17:05:34 +02:00
Mike Meier
fb5f76f025 rewrite tablePrefixAlias 2014-10-19 17:05:34 +02:00
Mike Meier
ebc996c820 Update SqlWalker.php
Always be sure that only a-z characters are used for table alias, otherwise use generic "t" for "table"
2014-10-19 17:05:34 +02:00
Steve Müller
06b5c84728 Merge pull request #1160 from Ocramius/hotfix/#1159-multiple-entity-managers-per-repository-factory
#1159 - multiple entity managers per repository factory should be supported
2014-10-19 14:58:04 +02:00
Marco Pivetta
0f26c62e73 Merge pull request #1143 from MajorCaiger/master
Fixed a bug so that a versioned entity with a oneToOne id can be created
2014-10-19 11:52:37 +02:00
Marco Pivetta
d361ed904e Merge pull request #1164 from AlphaStream/fix-querybuilder-on-hhvm
[QueryBuilder] Remove unused method parameters to run on HHVM/PHP7
2014-10-19 10:56:32 +02:00
Marco Pivetta
697640f561 Setting default timezone, as HHVM is misconfigured on travis-ci 2014-10-19 10:54:35 +02:00
Alex Bakhturin
b33c9befb7 [QueryBuilder] Remove unused method parameters that are shadowed by local variables
PHP5 treats the left part of such assignment as an independent local variable, while HHVM treats it as a reference to the method parameter. This leads to the value of the parameter being changed, which, in turn, causes func_get_args() to return not what is expected.
This commit is a part of the effort to make Symfony run flawlessly on HHVM. This issue causes a bunch of Symfony tests to fail on HHVM.
2014-10-17 11:17:33 -07:00
Marco Pivetta
f5ecabbc21 Merge pull request #1163 from taavit/patch-1
Update xml-mapping.rst
2014-10-17 00:13:28 +02:00
Dawid Królak
143f87960e Update xml-mapping.rst
Fixed closing entity tag.
2014-10-17 00:11:56 +02:00
Marco Pivetta
35d4405727 Merge pull request #1161 from gammamatrix/patch-1
Fixing error with from() parameters in example
2014-10-14 13:18:27 +02:00
Jeremy Postlethwaite
abe97bf0df Fixing error with from() parameters in example
The from method requires $from and the $alias to be separate parameters.

    public function from($from, $alias, $indexBy = null);

The examples show: from('User u')
2014-10-13 20:37:19 -07:00
Marco Pivetta
f28fa2d3a1 #1159 - EOF EOL CS fixes for Doctrine\ORM\Repository\DefaultRepositoryFactory tests 2014-10-14 01:49:57 +02:00
Marco Pivetta
b61496a36b #1159 - adding UPGRADE.md notes for Doctrine\ORM\Repository\DefaultRepositoryFactory becoming final 2014-10-14 01:48:25 +02:00
Marco Pivetta
8093c6ddb0 #1159 - protecting Doctrine\ORM\Repository\DefaultRepositoryFactory API by making it final and its protected members private 2014-10-14 01:46:50 +02:00
Marco Pivetta
a9847533e5 #1159 - Doctrine\ORM\Repository\DefaultRepositoryFactory keeps separate caches per entity manager used to build repositories 2014-10-14 01:46:14 +02:00
Marco Pivetta
56378b9bf0 #1159 - optimized imports 2014-10-14 01:40:38 +02:00
Marco Pivetta
7142c9029c #1159 - Doctrine\ORM\Repository\DefaultRepositoryFactory should create different repositories for different entity managers 2014-10-14 01:40:19 +02:00
Marco Pivetta
9ef3285ebb #1159 - verifying that Doctrine\ORM\Repository\DefaultRepositoryFactory considers custom repository class from metadata when instantiating repositories 2014-10-14 01:35:51 +02:00
Marco Pivetta
1e467fd23c #1159 - verifying that Doctrine\ORM\Repository\DefaultRepositoryFactory caches instantiated repositories locally 2014-10-14 01:32:04 +02:00
Marco Pivetta
5adce9a1e3 #1159 - base coverage for the Doctrine\ORM\Repository\DefaultRepositoryFactory implementation 2014-10-14 01:29:45 +02:00
Marco Pivetta
3ca0dae606 Merge pull request #1156 from NAYZO/patch-1
Fixed missed initialization in CommitOrderCalculator.php
2014-10-13 02:36:00 +02:00
Marco Pivetta
1e6ca40ffa Merge pull request #1157 from gennadiylitvinyuk/patch-1
Fixing calls of schema-update tools
2014-10-13 02:32:42 +02:00
Marco Pivetta
1d8ef5ed18 Merge pull request #1158 from josemalonsom/update-query-builder-ref-doc
Update QueryBuilder reference documentation.
2014-10-13 02:26:42 +02:00
Jose M. Alonso M
82887d0361 Update QueryBuilder reference documentation.
- Updated the signature of methods "from", "innerJoin" and "leftJoin"
  since it does not match the actual implementation.

- Added reference to the "join" method.
2014-10-12 20:31:33 +02:00
Gennadiy Litvinyuk
83cd44697d Fixing calls of schema-update tools
composer-generated binaries should be called without php interpreter.

Added reminder to update schema.
2014-10-12 17:50:47 +02:00
Ala Eddine Khefifi
f2bdfe102e Fixed missed initialization in CommitOrderCalculator.php 2014-10-12 14:04:41 +01:00
Marco Pivetta
10b801dec0 Adding note about a minor BC break: d2 does not call __clone on new objects anymore. 2014-10-06 14:57:03 +02:00
Christian Schmidt
94f5f53d2a Allow orderBy to reference associations 2014-10-05 10:16:58 +02:00
Marco Pivetta
0bff6aadbc Merge pull request #1147 from naitsirch/master
Extended the docs for mapping attributes precision and scale
2014-10-03 00:50:00 +02:00
Rob Caiger
dd398ce577 - Fixed the basic entity persister so that versioned OneToOne entities can be created
- Created an IdentifierFlattener utility class
- Moved the logic for the flatten identifier method into the new utility class
- Replaced calls for private flattenIdentifier to use new utility
- Added appropriate unit tests
2014-10-01 14:01:44 +01:00
Steve Müller
05045d9544 Merge pull request #1148 from naitsirch/hotfix/DWEB-118
[DWEB-118] Fixed small typo in documentation about extra lazy associations
2014-09-27 18:19:53 +02:00
naitsirch
547a902bd3 Fixed small typo in documentation about extra lazy associations #DWEB-118 2014-09-26 19:49:12 +02:00
Christian Stoller
d93f648230 Extended the docs for mapping attributes precision and scale 2014-09-25 09:38:34 +02:00
Marco Pivetta
3f8865c6fb Merge pull request #1092 from birko/pagination-count-walker
[DDC-2794] Arbitrary Join count walkers solution
2014-09-23 00:30:30 +02:00
Marco Pivetta
15a00ea807 Clearing cache by --id, --regex, --prefix and --suffix is not supported anymore. 2014-09-14 17:30:47 +02:00
Marco Pivetta
f12c311a79 Merge pull request #1135 from deeky666/DDC-3304
[DDC-3304] Add support for embeddables in entity generator
2014-09-12 21:54:45 +02:00
Steve Müller
b291d8d589 add support for embeddables in entity generator 2014-09-12 20:29:37 +02:00
Steve Müller
b249aa9f65 Merge pull request #1132 from Ocramius/hotfix/DDC-3272-entity-generator-mapped-superclass-casing
DDC-3272 entity generator mapped superclass casing
2014-09-10 18:27:51 +02:00
Marco Pivetta
4974edc70a DDC-3272 - fixing issue with mapped superclass name, minor refactoring 2014-09-10 17:00:06 +02:00
Marco Pivetta
dd9a6bea0a DDC-3272 - minor cleanups - inspecting a test failure related with @Doctrine\ORM\Mapping\Table autoloading 2014-09-10 16:57:35 +02:00
Marco Pivetta
ffe38e5088 DDC-3272 - cleanups, importing classes, optimized imports 2014-09-10 16:41:49 +02:00
Marco Pivetta
b9090ef73e DDC-3272 - failing test (to be run in insulation because of autoloading) that verifies that a wrong annotation is generated for @MappedSuperclass 2014-09-10 16:40:17 +02:00
Marco Pivetta
e2fea427a4 Merge pull request #1127 from crybat/master
Document embeddables column prefixing
2014-09-10 16:12:22 +02:00
encoder64
6bc003e47d simple fixes 2014-09-10 01:07:22 +03:00
encoder64
e295a6d05e visibility changed && few simple fixes 2014-09-09 22:17:10 +03:00
encoder64
409f6b4bc1 Unit Tests && simple fixes 2014-09-07 18:26:09 +03:00
encoder64
cd547fecea Corrected names to DDC3231 2014-09-06 18:29:14 +03:00
encoder64
859a5f88cb Unit Tests && simple fixes 2014-09-06 18:14:16 +03:00
encoder64
dc3bc45d1d Merge remote-tracking branch 'upstream/master' into EntityRepositoryGeneratorDefaultRepository 2014-09-06 15:33:48 +03:00
Mauro Pinto
857fed0310 Make embeddable doc more succinct, fix xml 2014-09-03 11:13:28 +01:00
Erik van Velzen
ba50f978a5 Add QueryBuilder::addSelect() 2014-09-02 13:52:52 +02:00
František Bereň
589d26fc5e Changed calling $from[0] to using reset($from)
changed usage $from[0] according suggestion from @Ocramius  to use array
reset function
2014-09-02 08:39:29 +02:00
Mauro Pinto
3bd916f763 Document embeddables column prefixing 2014-09-01 12:48:10 +01:00
Marco Pivetta
d9b43dc649 Merge pull request #1116 from deeky666/DDC-3265
[DDC-3265] Fix DocBlock
2014-08-30 04:22:47 +02:00
Marco Pivetta
6e79515a75 Merge pull request #1123 from stof/patch-1
Fixed the structure of the reverse-engineered mapping
2014-08-30 04:19:55 +02:00
Marco Pivetta
6e34985b51 Merge pull request #1126 from phansys/master
Fixed new line in docblock
2014-08-30 04:13:55 +02:00
Javier Spagnoletti
f731a66e1c Removed extra line breaks for docblocks in set, get, add and remove method templates. 2014-08-29 23:11:49 -03:00
Javier Spagnoletti
1378626937 Fixed new line in docblock (247803715b). 2014-08-29 22:49:23 -03:00
Guilherme Blanco
2a80e34179 Merge pull request #1125 from kcassam/patch-1
Update improving-performance.rst
2014-08-29 18:40:20 -04:00
Ka
2120d41029 add a link to said chapter 2014-08-29 08:47:28 +02:00
Ka
398688ab38 Update improving-performance.rst 2014-08-29 08:42:14 +02:00
František Bereň
d48be34696 CS Fixes 2014-08-28 13:17:25 +02:00
Guilherme Blanco
4b504c9436 Merge pull request #1109 from doctrine/hotfix/DDC-3120-php-5.6-RC3-compat
DDC-3120 - PHP 5.6-RC3 compatibility
2014-08-27 12:27:05 -04:00
Christophe Coevoet
f0c02bb6d9 Fixed the test expectations for the DatabaseDriver 2014-08-27 14:00:34 +02:00
Christophe Coevoet
00eb0d3b67 Fixed the structure of the reverse-engineered mapping 2014-08-27 13:56:02 +02:00
Guilherme Blanco
3d4113bd1b Merge pull request #1122 from Ocramius/feature/support-arithmetic-expressions-in-count
Support arithmetic expressions in `COUNT()`
2014-08-26 21:01:56 -04:00
Marco Pivetta
48a86511cb DDC-3276 - #1122 - updating EBNF in documentation to reflect new syntax support 2014-08-27 02:17:08 +02:00
Marco Pivetta
45d74e7220 DDC-3276 - #1122 - updating EBNF in docblock to reflect new syntax support 2014-08-27 02:12:08 +02:00
Marco Pivetta
a2e0133a94 Adding DDC-3276 test group 2014-08-27 02:01:56 +02:00
Marco Pivetta
097840dc93 Allowing expression in COUNT() DQL aggregation functions 2014-08-27 01:56:11 +02:00
Marco Pivetta
02ba144c8d Adding test to verify SQL generation with an expression in COUNT() 2014-08-27 01:55:28 +02:00
Marco Pivetta
91fa4c9be3 Merge pull request #1121 from deeky666/DDC-3274
[DDC-3274] Improve schema validator error message for invalid bi-directional relations
2014-08-26 23:27:23 +02:00
encoder64
c8565c2772 Visibility for EntityRepositoryGenerator::generateClassName() 2014-08-26 21:42:55 +03:00
Steve Müller
8d3fba5540 improve schema validator error message for invalid bi-directional relations 2014-08-26 19:46:17 +02:00
Steve Müller
65f8357b46 Merge pull request #1119 from stof/travis_colors
Enabled colors for the PHPUnit output on Travis
2014-08-22 14:00:20 +02:00
Christophe Coevoet
e7739d9411 Enabled colors for the PHPUnit output on Travis 2014-08-22 13:42:43 +02:00
Steve Müller
ad1f228ef6 fix DocBlock 2014-08-22 09:26:54 +02:00
Guilherme Blanco
400acad533 Merge pull request #1105 from deeky666/nested-embeddables
Add support for nesting embeddables
2014-08-21 16:33:44 -04:00
Steve Müller
e47b31845c Merge pull request #1115 from armetiz/patch-1
Fix wrong variable name
2014-08-21 11:22:35 +02:00
Thomas Tourlourat
613119599f Fix wrong variable name 2014-08-21 10:42:22 +02:00
Marco Pivetta
ff80187930 Merge pull request #1098 from encoder32/DDC-1590
#DDC-1590: Fix Inheritance in Code-Generation
2014-08-18 22:35:52 +02:00
Marco Pivetta
c20b3a7cf2 Merge branch 'hotfix/#1112-single-repository-for-aliased-entity'
Close #1112
2014-08-18 15:22:13 +02:00
Marco Pivetta
dfbaac0401 #1112 - Fixed type-hint that is incompatible with most IDEs 2014-08-18 15:18:59 +02:00
Marco Pivetta
aab7fce2d4 #1112 - Elvis operator reduces code duplication even more 2014-08-18 15:17:54 +02:00
Marco Pivetta
bf03694e28 #1112 - Yoday need you may, better IDE hinting as well needed is. 2014-08-18 15:16:45 +02:00
Marco Pivetta
19d3552f2a #1112 - Removing useless trimming of the entity name being passed in 2014-08-18 15:14:53 +02:00
Marco Pivetta
36bbd28b75 #1112 - adding test to verify that leading backslash is not relevant when fetching repositories 2014-08-18 15:11:39 +02:00
Marco Pivetta
ae16afa428 #1112 - adding DDC-3257 group to test method 2014-08-18 15:07:07 +02:00
Marco Pivetta
01f22988b1 #1112 - cleaning up repository test - makes assertions more clear/simpler to read 2014-08-18 15:06:37 +02:00
Marco Pivetta
3fed769b40 #1112 - avoiding useless assignments/splitted return statement 2014-08-18 15:02:34 +02:00
Marco Pivetta
7865de92ab #1112 - renamed $class to $className 2014-08-18 15:01:52 +02:00
Giorgio Premi
a665cb0229 DefaultRepositoryFactory: single repository for aliased entities 2014-08-18 14:52:01 +02:00
Marco Pivetta
5ff67c92ee Merge pull request #1111 from eko/master
Fix inheritance hierarchy wrong exception message
2014-08-15 16:13:33 +02:00
Vincent Composieux
edc2ed9512 Fix QueryException::instanceOfUnrelatedClass() message 2014-08-15 15:39:56 +02:00
Guilherme Blanco
ebc70d1baf Merge pull request #1110 from baileylo/patch-2
Changed table name to be more appropriate.
2014-08-14 20:16:34 -04:00
Logan Bailey
9b7318ab4c Changed table name to be more appropriate.
This change assumes that the Article object references the articles tables, not the user table.
2014-08-14 17:07:05 -07:00
Marco Pivetta
7b145f8269 DDC-3120 - requiring doctrine\instantiator:~1.0.1 as of doctrine/instantiator#4 2014-08-14 16:55:32 +02:00
Marco Pivetta
361ec2a474 DDC-3120 - using Doctrine\Instantiator when building new instances 2014-08-14 15:51:48 +02:00
Marco Pivetta
f8a8437c95 DDC-3120 - need to wakeup reflection BEFORE using any ClassMetadata API 2014-08-14 15:51:17 +02:00
Marco Pivetta
c2993bcdeb DDC-3120 - add failing test for un-serialization of an internal PHP class from cached metadata instance 2014-08-14 15:39:58 +02:00
Marco Pivetta
d52dd39592 DDC-3120 - add failing test for un-serialization of an internal PHP class 2014-08-14 15:38:55 +02:00
Marco Pivetta
2c3126353c DDC-3120 - adding instantiator dependency 2014-08-14 15:33:09 +02:00
Steve Müller
6ac19b04bf Merge pull request #1108 from umpirsky/patch-1
Minor CS fix
2014-08-12 10:16:17 +02:00
Saša Stamenković
133bd288bf Minor CS fix 2014-08-12 09:57:19 +02:00
Steve Müller
0768916a06 fix handling infinite nesting of embeddables 2014-08-12 07:56:39 +02:00
Steve Müller
bca9d31531 add support for nesting embeddables 2014-08-11 16:53:18 +02:00
encoder64
cd4bc93483 Simple Fixes 2014-08-09 13:27:38 +03:00
encoder64
20b72ef344 Visibility for EntityRepositoryGenerator::$repositoryName 2014-08-09 13:20:27 +03:00
Adrien Crivelli
1003466a5f Surround ! with spaces according to code style 2014-08-05 18:07:00 +09:00
encoder64
94ba6e2dfc #DDC-1590: Simple Fixes 2014-08-04 20:18:26 +03:00
Marco Pivetta
723529ffff Merge pull request #1069 from anho/reuse-console-app
added method to be able to reuse the console application
2014-08-04 16:17:11 +02:00
encoder64
4e805bb59a #DDC-1590: Fix Inheritance in Code-Generation: Code Style Fixes 2014-08-03 17:07:20 +03:00
encoder64
e0ae7634d5 #DDC-1590: Fix Inheritance in Code-Generation 2014-08-03 17:02:33 +03:00
Marco Pivetta
2ae8538f96 Merge pull request #1096 from simonharris/master
Changes for grammar and clarity
2014-07-31 18:02:34 +02:00
Simon Harris
7c2ab7fff8 Changes for grammar and clarity 2014-07-31 16:45:33 +01:00
Simon Harris
bf91d03adf Merge pull request #1 from doctrine/master
Update from original
2014-07-31 16:24:31 +01:00
František Bereň
54ac6a0535 Updated Asset queries
Missing  braces and selected fields
2014-07-31 09:01:58 +02:00
František Bereň
458b953522 fixed typos in tests 2014-07-31 08:43:02 +02:00
František Bereň
164352562b Added Tests for Arbitrary Join 2014-07-31 08:31:39 +02:00
Marco Pivetta
0650bb954f Merge pull request #1094 from thekeyboardbum/master
Fix bulk insert code example
2014-07-31 00:06:05 +02:00
Justin
2d23c95c3f Fix bulk insert code example
Previous code example did not flush all entities when entity count was not a multiple of batch count.
2014-07-30 15:00:35 -07:00
Marco Pivetta
66d67445c9 Merge pull request #1093 from malukenho/patch-2
Use `null` comparation instead of `is_null()`
2014-07-30 21:58:55 +02:00
Jefersson Nathan
1b9f42ae67 Use null comparation instead of is_null() 2014-07-30 16:54:24 -03:00
František Bereň
a37f99f242 Root selection according other pagination tools
changed root selection in Walkers from looping queryComponents to using
$AST->fromClause as other walkers have
2014-07-30 15:55:14 +02:00
František Bereň
114bd2435f Arbitrary Join count walkers solution
Possible solution for Arbitrary Join problem in pagination count
walkers:
https://groups.google.com/forum/#!topic/doctrine-user/rpPYCDNKOU8

Added a condition to test query component against  SelectStatement from
clause
2014-07-30 09:56:22 +02:00
encoder64
df80d82aab Reverted visibility for EntityRepositoryGenerator::generateEntityRepositoryNamespace() 2014-07-27 20:15:18 +03:00
encoder64
5d608b6206 Private method EntityRepositoryGenerator::generateEntityRepositoryNamespace() changed to protected 2014-07-27 19:05:42 +03:00
encoder64
a4c7a89507 className fix: If namespace is not set then ClassName will be cut of 2014-07-27 17:28:06 +03:00
encoder64
c04b01cbd7 Added NS checking 2014-07-27 17:02:19 +03:00
encoder64
3dc2a68583 simple fixes 2014-07-27 15:22:51 +03:00
encoder64
90efaeec42 Code Style fixes 2014-07-27 14:54:35 +03:00
encoder64
c0ee57ae55 Default/Custom Entity Repository for Entity Repository Generator 2014-07-27 14:44:31 +03:00
Marco Pivetta
089cca636e Merge pull request #1088 from austinsmorris/fix-clt-autoload-path
Fix the composer autoload paths for the doctrine CLT
2014-07-24 17:34:21 +02:00
Austin Morris
a6a9c72a75 Fix the composer autoload paths for the doctrine CLT 2014-07-24 09:52:55 -04:00
Andreas Hörnicke
a76506c3fd amended documentation 2014-07-24 09:38:08 +02:00
Andreas Hörnicke
1d16e5322f added a simple test 2014-07-24 09:23:36 +02:00
Marco Pivetta
2b24478f05 Merge pull request #1087 from malukenho/patch-1
Remove the error control operator
2014-07-24 00:35:18 +02:00
Jefersson Nathan
70fe21b30a Remove the error control operator 2014-07-23 17:09:47 -03:00
Adrien Crivelli
bb5345b330 Adapt formatting to pre-existing content 2014-07-22 10:44:45 +09:00
Adrien Crivelli
27adf8d6e9 Refactor partial into options array
This coherent with what is done for Table. All platform specific things
are grouped into an options array. Eventually flags should be migrated
into options as well.
2014-07-22 10:32:31 +09:00
Adrien Crivelli
eeb7ff4a6d Support for Partial Indexes for PostgreSql and Sqlite
Support for Partial Indexes was available in Doctrine 1 following
http://www.doctrine-project.org/jira/browse/DC-82. This commit
reintroduce support for Doctrine 2. We use the same syntax with an
optionnal "where" attribute for Index and UniqueConstraint.
2014-07-22 10:32:30 +09:00
Marco Pivetta
499f09fc99 Merge pull request #1084 from hartca/master
Update advanced-field-value-conversion-using-custom-mapping-types.rst
2014-07-18 01:25:50 +02:00
hartca
0ab2672872 Update advanced-field-value-conversion-using-custom-mapping-types.rst 2014-07-18 00:10:47 +01:00
Marco Pivetta
205a5de4e5 Merge pull request #1083 from deeky666/DDC-3073
[DDC-3073] Add documentation about how to map column options
2014-07-17 11:56:40 +02:00
Steve Müller
040c445297 add documentation about how to map column options 2014-07-17 11:28:43 +02:00
Guilherme Blanco
c019047d6c Merge pull request #1082 from scotam/invalid-parameter-count
added more informative error messages when invalid parameter count
2014-07-15 11:06:53 -04:00
Rhodri Pugh
ad10a18071 added more informative error messages when invalid parameter count 2014-07-15 13:17:22 +01:00
Marco Pivetta
85fbf68436 Merge branch 'hotfix/#1019-detached-entity-exception-rewording'
Close #1019
2014-07-14 11:25:42 +02:00
Andreas Flack
0ade3aa62a Improve phrasing on exception message instead of trying to fix callers 2014-07-14 11:25:04 +02:00
flack
b8ef3af982 Small grammar fix
The exception was reading 

```
A detached entity was found during {removed|persisted} [entityName] 
```

I changed the verbs to infinitive now. Alternatively, the text in ``ORMInvalidArgumentException::detachedEntityCannot`` could also be changed to read 


```
Detached entity [entityName] cannot be {removed|persisted}  
```
2014-07-14 11:25:04 +02:00
Marco Pivetta
5361676bba Merge pull request #1038 from Greenflex/doc/dql-hidden-keyword
Add documentation for the `HIDDEN` keyword in DQL
2014-07-14 11:18:30 +02:00
Marco Pivetta
90dee7036d Merge pull request #1067 from albertvolkman/add-fullstop-and-newline
Add fullstop and newline after property description.
2014-07-14 11:09:40 +02:00
Marco Pivetta
b80149344d Merge pull request #1073 from kamazee/add_passing_type_to_rsm_in_sql_walker
Add missing type mapping
2014-07-14 10:51:13 +02:00
Alexander Kurilo
38fcc66c16 Add missing type mapping
Fixes DDC-3192
Refs DDC-2494

This is essentially a fix from DDC-2494 applied to SQLWalker.
The issue: type was not converted to PHP value when the result is fetched by
executing DQL query rather than using entity manager's findX(). Similar issue
for BasicEntityPersister (which is used when em's findX is executed) was fixed
in DDC-2494, but SQLWalker made the issue valid for any custom query.
2014-07-14 11:22:08 +03:00
Marco Pivetta
ae0ee72425 Merge pull request #1080 from danielsippel/DDC-2021
possible fix for DDC-2021
2014-07-11 21:35:34 +02:00
Daniel Sippel
ae2235fd3c DDC-2021 sql generation test: remove comment 2014-07-10 00:32:24 +02:00
Daniel Sippel
b31ba98076 DDC-2021 add sql generation test 2014-07-10 00:27:28 +02:00
Daniel Sippel
45358bf5d0 possible fix for DDC-2021 2014-07-09 16:39:44 +02:00
Marco Pivetta
bf1e7e150e Merge pull request #1078 from renan/patch-1
Removing Value Objects from limitations
2014-07-07 20:20:59 +02:00
Renan Gonçalves
c9901c9017 Removing Value Objects from limitations as per #835 2014-07-07 20:17:56 +02:00
Marco Pivetta
a8035f25a2 Merge pull request #1074 from zimmermanj42/DDC-3160
[DDC-3160] Alternate fix for DDC-2996 bug
2014-07-06 16:07:43 +02:00
Justin Zimmerman
6a4867512e Fix test issues. 2014-07-04 11:15:57 -04:00
Justin Zimmerman
65e7cc9143 [DDC-3160] Change to fix that was implemented for DDC-2996.
A fix for DDC-2996 was implemented that broke quite a few extensions.

This commit is an attempt to fix the DDC-2996 bug without the adverse side effects seen in DDC-3160.

Basically, if changes are detected that would cause a changeset to be made, but the entity is awaiting insertion, the code will not save the changeset nor flag the entity as awaiting updating in the Unit of Work.

Some styling tweaks based on Pull Request guidelines.
2014-07-04 10:51:04 -04:00
Guilherme Blanco
8c0166d3bf Merge pull request #1076 from velosipedist/fix-typos
Fix switch non-uniform syntax
2014-07-01 23:11:53 -04:00
velosipedist
60cb01be1f Fix switch non-uniform syntax 2014-06-29 18:00:02 +04:00
Marco Pivetta
c370426792 Merge pull request #1075 from vilartoni/master
Fixed query cache id generation: added platform to hash
2014-06-27 22:37:36 +02:00
Antonio Vilar
4e61ceb0df Added platform key 2014-06-27 22:36:02 +02:00
Antonio Vilar
0dde8585c3 Fixed query cache id generation: added platform to hash 2014-06-27 20:29:55 +02:00
Marco Pivetta
9e36a95a97 Merge pull request #1065 from egeloen/DDC-3179
[DDC-3179] EntityNotFoundException on the postRemove event if the entity is a proxy
2014-06-26 18:25:53 +02:00
Eric GELOEN
20f96cc9d3 [DDC-3179] Document postRemove limitation 2014-06-26 18:09:32 +02:00
Marco Pivetta
22d71de2c3 Merge pull request #1071 from VasekPurchart/fix-setup-cache
Setup::createConfiguration breaks Cache interface contract
2014-06-26 02:15:54 +02:00
Vasek Purchart
ee5f465a2f set namespace in setup only on CacheProvider instances 2014-06-26 01:29:35 +02:00
Andreas Hörnicke
eef32d4372 added method to be able to reuse the console application 2014-06-24 11:02:24 +02:00
Marco Pivetta
d98b4a5124 Merge pull request #1068 from jkavalik/patch-1
Fix typo in documentation
2014-06-24 08:25:19 +02:00
jkavalik
d5dd21dd79 Fix typo in documentation 2014-06-24 08:00:45 +02:00
Albert Volkman
247803715b Add fullstop and newline after property description. 2014-06-23 09:53:27 -04:00
Guilherme Blanco
38187a31d6 Merge pull request #1032 from bakura10/optimized-contains
Add support for optimized contains in LazyCriteria
2014-06-21 08:56:47 -04:00
Guilherme Blanco
381cf8022f Merge pull request #1063 from FlorianLB/master
singularize variable name on add/remove methods for EntityGenerator
2014-06-21 08:49:53 -04:00
Marco Pivetta
84a0fddaf4 Merge branch 'hotfix/#1064-xsd-on-update-removal' 2014-06-19 16:06:03 +02:00
Marco Pivetta
19b5e87cab on-update is not supported anymore 2014-06-19 16:05:12 +02:00
Marco Pivetta
e940ce1df6 Replacing " with ' to avoid escaping warnings 2014-06-19 15:54:43 +02:00
Marco Pivetta
59720370f9 Corrected FQCN reference in @expectedException 2014-06-19 15:53:37 +02:00
Marco Pivetta
7dfca09ff6 Minor CS fixes (use statements compliant with PSR-2) 2014-06-19 15:53:11 +02:00
Marco Pivetta
85c02e57b1 Merge pull request #1064 from stefanotorresi/update-xsd
remove on-update from join-column
2014-06-19 14:33:58 +02:00
Stefano Torresi
391847d627 remove on-update from join-column 2014-06-19 14:27:56 +02:00
FlorianLB
fdca5d7584 singularize variable name on add/remove methods for EntityGenerator 2014-06-19 10:00:40 +02:00
Guilherme Blanco
f7c5a0684a Merge pull request #1060 from ureimers/master
[DDC-3170] SimpleObjectHydrator fails to get discriminator column from mapped SQL result
2014-06-17 10:44:16 -04:00
Ulf
a7aa634247 Fixed mapping of discriminator column
Added fix for [DDC-3170] (http://www.doctrine-project.org/jira/browse/DDC-3170).

When querying a simple entity which uses single table- or class table inheritance using simple object hydration (``AbstractQuery::HYDRATE_SIMPLEOBJECT``), the mapped discriminator column was not retrieved correctly.

If the column got an alias during result set mapping other than it's actual name (e.g. ``type34`` insteaad of ``type``) than this alias wasn't reverted when retrieving the discriminator column from the SQL result set.
2014-06-17 14:51:19 +02:00
Ulf
7aa1c0a907 Create DDC3170Test.php
Added test for [DDC-3170] (http://www.doctrine-project.org/jira/browse/DDC-3170)
2014-06-17 14:45:59 +02:00
Marco Pivetta
ef43b223fd Merge pull request #1059 from iampersistent/patch-3
fix spacing for yaml example
2014-06-16 20:21:30 +02:00
Richard Shank
9a5fc49690 fix spacing for yaml example 2014-06-16 08:20:14 -07:00
Marco Pivetta
ca37f87c27 Merge pull request #1058 from DavidPrevot/Unicode
Drop Unicode character
2014-06-15 12:19:45 +02:00
David Prévot
3ff92f587f Drop Unicode character
It broke the LaTeX build.
2014-06-14 23:14:42 -04:00
Andreas Flack
a5cf6417b3 Add failing test for DDC-3160 2014-06-12 17:28:13 +02:00
Marco Pivetta
5c447cfb71 Merge branch 'hotfix/build-fix' 2014-06-07 15:12:09 +02:00
Marco Pivetta
50d7975fd6 Allowing failures on hhvm-nightly, as the build chokes on composer installation for now (unrecognized console flags) 2014-06-07 15:11:51 +02:00
Marco Pivetta
32b24ba155 Fixed mismatch in expected exception message, see doctrine/doctrine2#1048 2014-06-07 14:55:59 +02:00
Marco Pivetta
3ade0cf6a5 Merge pull request #1048 from MidnightDesign/patch-1
Fix typo in exception message
2014-06-06 04:34:50 +02:00
Marco Pivetta
d71159c6c5 Merge pull request #1049 from deeky666/DDC-3152
[DDC-3152] Fix redeclaration of methods on entity generation update
2014-06-06 03:48:24 +02:00
Steve Müller
dcf8d6a86e ignore case when checking for existing methods to avoid redeclaration on update 2014-06-05 15:58:54 +02:00
Rudolph Gottesheim
daa90bf32d Fix typo in exception message 2014-06-04 15:59:57 +02:00
Benjamin Eberlei
6f622ab1f7 Merge branch 'master' of github.com:doctrine/doctrine2 2014-06-03 21:42:38 +02:00
Benjamin Eberlei
46ebb57b45 Fix wrong version 2014-06-03 21:41:26 +02:00
Marco Pivetta
b3d01b6036 Merge pull request #1047 from simonharris/master
Minor grammatical corrections
2014-06-03 17:52:45 +02:00
Simon Harris
7dac285de6 A few minor changes for English and clarity 2014-06-03 16:46:37 +01:00
Simon Harris
8b1f5d71e1 Fix minor grammatical error 2014-06-03 16:26:54 +01:00
Benjamin Eberlei
e577e77867 Cleanup 93c276d 2014-06-03 17:05:02 +02:00
Marco Pivetta
2101a8fdc6 Merge branch 'hotfix/php-version-id-check-in-metadata-prototype-instantiation' 2014-05-31 13:37:50 +02:00
Marco Pivetta
72750b05e6 Using PHP_VERSION_ID instead of version_compare to see if we're using PHP 5.4+ 2014-05-31 13:37:39 +02:00
Guilherme Blanco
a851dd68fb Merge pull request #1045 from marmotz/master
Fix the "Erroneous data format for unserializing" error message
2014-05-30 09:11:34 -04:00
Renaud LITTOLFF
93c276d059 Fix the "Erroneous data format for unserializing" error message 2014-05-30 10:43:11 +02:00
Marco Pivetta
5d1275e938 Merge pull request #1044 from ronanguilloux/patch-2
Use of ->andWhere() whithout any ->where() before is valid
2014-05-29 22:42:09 +02:00
Ronan Guilloux
526c757901 Update query-builder.rst 2014-05-29 16:36:22 +02:00
Ronan Guilloux
495fe6002d Update query-builder.rst
->andWhere() can be used directly, without any ->where() before, and we can just always use ->andWhere(). This is why ->hasWhere() is useless, cf. #1043.
2014-05-29 16:29:49 +02:00
Marco Pivetta
5ee286e7e0 Merge pull request #1041 from c960657/entity-manager-interface
Allow all EntityManagerInterface implementations
2014-05-28 14:40:22 +02:00
Marco Pivetta
f941264b5e Merge pull request #1042 from bakura10/patch-1
Fix second level cache doc
2014-05-28 13:57:15 +02:00
Michaël Gallego
3d32bc47a7 Fix second level cache doc 2014-05-28 13:07:01 +02:00
Christian Schmidt
a7d072f525 Allow all EntityManagerInterface implementations
This is necessary if Doctrine\ORM\Decorator\EntityManagerDecorator is used.
2014-05-28 12:30:40 +02:00
Marco Pivetta
466808bf48 Merge pull request #1039 from iampersistent/patch-1
Add yml example to single table inheritance
2014-05-27 16:56:08 +02:00
Richard Shank
edaeaf48a8 Add yml example to single table inheritance 2014-05-27 07:47:07 -07:00
Michaël Perrin
b400ad52cc Add documentation for the HIDDEN keyword in DQL 2014-05-27 11:43:15 +02:00
Marco Pivetta
20e47ae52d Merge pull request #1037 from spiechu/patch-1
I can't look at those semicolons, sorry ;-)
2014-05-27 09:55:42 +02:00
Dawid Spiechowicz
9c24e0b510 I can't look at those semicolons, sorry ;-) 2014-05-27 09:37:40 +02:00
Marco Pivetta
b421d03f69 Merge pull request #1036 from albertvolkman/entity-mapper-remove-extra-space
Move space addition to implementation.
2014-05-22 00:15:22 +02:00
Albert Volkman
49bca5171b Move space addition to implementation. 2014-05-21 16:27:36 -04:00
Marco Pivetta
7debf736a6 Merge pull request #1034 from hashnz/master
Update caching.rst
2014-05-19 22:59:06 +02:00
hashnz
43c4c80388 Update caching.rst
Remove documentation referencing delete by regex/prefix.
2014-05-20 08:53:41 +12:00
Michaël Gallego
140dc92e5f Enforce Criteria 2014-05-18 12:47:59 +02:00
Marco Pivetta
04aea73a85 Merge branch 'tests/lazy-collection-tests'
Tests for doctrine/doctrine2@d30e3ab43c
2014-05-17 19:08:37 +02:00
Marco Pivetta
a259138180 The count in a LazyCriteriaCollection is null on initialization 2014-05-17 19:08:25 +02:00
Marco Pivetta
c68ed4c204 Verifying that the persister is used only once when matching on a lazy criteria collection 2014-05-17 19:06:16 +02:00
Marco Pivetta
d2174a893a Verifying that count is not called on the persister when the collection is initialized 2014-05-17 18:56:42 +02:00
Marco Pivetta
546bb53ef9 Verifying that count on the lazy criteria collection is cached even with 0 count 2014-05-17 18:51:33 +02:00
Marco Pivetta
c46b63f6b4 Verifying that count on the lazy criteria collection is cached 2014-05-17 18:51:01 +02:00
Marco Pivetta
81fbb049a5 LazyCriteriaCollection test setUp 2014-05-17 18:48:25 +02:00
Marco Pivetta
7cb40ed915 Mocking up tests for the lazy-criteria-collection 2014-05-17 18:45:33 +02:00
Michaël Gallego
9d7d731090 Remove BC notice 2014-05-17 16:59:43 +02:00
Michaël Gallego
8a8c6ea3a6 Remove extra phpdoc 2014-05-17 14:53:06 +02:00
Michaël Gallego
ddfc951a0e Remove useless docblock 2014-05-17 14:33:15 +02:00
Michaël Gallego
239b862665 Add missing typehint 2014-05-17 13:00:47 +02:00
Michaël Gallego
f52a512c59 Add UPGRADE note 2014-05-17 12:57:39 +02:00
Michaël Gallego
a04113f410 Add support for optimized contains 2014-05-17 12:54:25 +02:00
Guilherme Blanco
d6c727dcc1 Update LazyCriteriaCollection.php
Fixed issue where count = 0
2014-05-16 14:03:20 -04:00
Marco Pivetta
8babb77d37 Merge pull request #1031 from mnapoli/custom-functions-callback-documentation
Documentation for #991
2014-05-16 14:40:17 +02:00
Matthieu Napoli
5a4c558865 Fixed #991 to support non-closure callables on PHP 5.3 2014-05-16 10:49:59 +02:00
Matthieu Napoli
b16423b26b Documentation for #991 2014-05-16 09:32:52 +02:00
Guilherme Blanco
47ca10076b Merge pull request #991 from mnapoli/custom-functions-callback
Ability to define custom functions with callback instead of class name
2014-05-16 00:27:30 -04:00
Guilherme Blanco
d30e3ab43c Added count cache when lazy collection is not yet initialized. Some cosmetic changes (primarily, there's no ELSE). 2014-05-16 04:22:11 +00:00
Michaël Gallego
92a2b01c77 Fix tests by forcing collection initialization 2014-05-15 18:37:41 +02:00
Michaël Gallego
172df22281 Fix inconsistent mapping 2014-05-15 18:22:57 +02:00
Michaël Gallego
0a6c2027f5 Update tests 2014-05-15 18:22:57 +02:00
Michaël Gallego
45e9d6ed5a Fix test on some RDBMS 2014-05-15 18:22:57 +02:00
Michaël Gallego
11de4c2e72 Only create lazy collection for EXTRA_LAZY 2014-05-15 18:22:57 +02:00
Michaël Gallego
50832fd3bc Add tests for PersistentCollection 2014-05-15 18:22:57 +02:00
Michaël Gallego
876643e83e Add test for Entity Repository 2014-05-15 18:22:57 +02:00
Michaël Gallego
6cb5097ea8 Add method visibility 2014-05-15 18:22:57 +02:00
Michaël Gallego
8514ec7320 Remove useless imports 2014-05-15 18:22:57 +02:00
Michaël Gallego
3c522f4984 Reuse Doctrine Collection Lazy Collection 2014-05-15 18:22:57 +02:00
Michaël Gallego
28afb52734 Typehint to interface to support second level cache 2014-05-15 18:22:56 +02:00
Michaël Gallego
ac15b184b6 Fix tests for inheritance support 2014-05-15 18:22:56 +02:00
Michaël Gallego
632382b069 Add missing methods to the mock 2014-05-15 18:22:56 +02:00
Michaël Gallego
7551b1ad00 Update to latest cache API 2014-05-15 18:22:56 +02:00
Michaël Gallego
9813c2d5f1 Add tests 2014-05-15 18:22:56 +02:00
Michaël Gallego
0fa7b45a0e Also add efficient count for Persistent collection 2014-05-15 18:22:56 +02:00
Michaël Gallego
9b7dce1940 Use inner collection count if initialized 2014-05-15 18:22:56 +02:00
Michaël Gallego
b556bcb16c Remove useless dependency 2014-05-15 18:22:56 +02:00
Michaël Gallego
f1a793f2ee Initial work for efficient counting on criteria 2014-05-15 18:22:56 +02:00
Marco Pivetta
91df8f5649 Merge branch 'hotfix/DDC-3123-test-assertion-simplification' 2014-05-15 17:37:55 +02:00
Marco Pivetta
65e55a0c49 DDC-3123 - using assertAttributeEmpty (with message) instead of explicit reflection 2014-05-15 17:37:41 +02:00
Matthieu Napoli
c7eb42b04f Ability to define custom functions with callback + tests 2014-05-15 12:06:21 +02:00
Guilherme Blanco
5c828fc6c8 Merge pull request #1023 from coma/DDC-3027
[DDC-3027] Avoid duplicated mapping using Embedded in MappedSuperclass
2014-05-14 22:37:24 -04:00
Guilherme Blanco
4874070b3f Merge branch 'feature/default-query-hints' of https://github.com/Strate/doctrine2 into Strate-default-query-hints 2014-05-15 01:15:34 +00:00
Steve Müller
c16de21172 Merge pull request #1030 from doctrine/hotfix/DDC-3123-extra-updates-cleanup
DDC-3123 extra updates cleanup
2014-05-15 01:07:34 +02:00
Marco Pivetta
ccc789eadd DDC-3123 - the UoW should clear extra updates immediately 2014-05-15 00:18:50 +02:00
Marco Pivetta
9cdcba3fbc DDC-3123 - verifying that the UoW is not clearing extra inserts 2014-05-15 00:18:22 +02:00
Marco Pivetta
08347cf4f7 Adding PHP 5.6 and HHVM-nightly to build matrix 2014-05-11 17:51:23 +02:00
Marco Pivetta
94837a0105 Merge pull request #1026 from flack/patch-5
Remove some redundant clauses
2014-05-03 01:43:38 +02:00
flack
5cf906d76b Remove some redundant clauses 2014-05-02 21:52:00 +02:00
Steve Müller
7fffba80c3 Merge pull request #1025 from josemalonsom/remove-duplicate-entry-in-toc
Removed duplicate entry in documentation TOC.
2014-05-01 14:23:56 +02:00
Jose M. Alonso M
204b7fe854 Removed duplicate entry in documentation TOC. 2014-05-01 13:02:29 +02:00
Eduardo García Sanz
8a3def097f [DDC-3027] Avoid duplicated mapping using Embedded in MappedSuperclass 2014-04-30 11:46:54 +02:00
Marco Pivetta
7a305475e3 The proxy factory always expects non-null identifier values 2014-04-29 13:25:17 +02:00
Marco Pivetta
27845088e3 Merge branch 'hotfix/DDC-3103-#1020-serialize-isEmbedded-in-class-metadata'
Close #1020
2014-04-29 13:16:02 +02:00
Marco Pivetta
677cea4748 DDC-3103 - minor CS fixes/adjustments 2014-04-29 13:12:17 +02:00
Marco Jantke
f065a5c8b9 fixed bug 2014-04-29 09:30:37 +02:00
Marco Jantke
cf84183c18 created test case to reproduce error 2014-04-29 09:30:10 +02:00
Guilherme Blanco
48172f3a53 Readability update to hydrators. 2014-04-29 05:05:38 +00:00
Guilherme Blanco
9cd16ec56a More optimizations around hydrators. Pretty much same performance, just better memory footprint (-0.25MB). 2014-04-28 13:47:57 +00:00
Guilherme Blanco
be94eb9d1f Made ClassMetadata to be reused during gatherRowData() and also during hydrateRow() to share same fetches instead of recalculating all info again. Performance improvement after 100x runs comparison is around 4%. 2014-04-28 02:38:51 +00:00
Guilherme Blanco
35c8cd7f23 Added type conversion to meta column in case a type is specified (such as a foreign key or discriminator column). 2014-04-25 05:22:33 +00:00
Guilherme Blanco
21437bb276 Heavily simplified code on simple object hydrator. Code cleanup on column information cache; by reference cache variable is no longer needed and protected variable is used in a standardized way everywhere. 2014-04-25 03:41:14 +00:00
Guilherme Blanco
e8e86205f5 Merge pull request #1018 from chandon/master
DBAL-878 Wrong mapping type
2014-04-24 20:52:27 -04:00
Cédric Chandon
9ba31a394a [DBAL-878] Wrong mapping type
the type should be the mapping type, and not the name of the type. This
does the difference for simple_array, as the result should be
simple_array and not simplearray
2014-04-25 01:59:15 +02:00
Guilherme Blanco
f7de00b401 Finalized fix for scalars and newObjects. 2014-04-24 05:21:24 +00:00
Guilherme Blanco
9692fc8c5b Fixed issue if aliases were specific names, you would either get completely misleading results (dql alias: scalars) or a fatal error (dql alias: newObjects). 2014-04-24 04:47:13 +00:00
Guilherme Blanco
a3febd79de Abstract cache information of field result for hydrators. 2014-04-23 18:50:29 +00:00
Guilherme Blanco
a4dac7a292 Highlighted intention of converting scalar types during single scalar or scalar hydration, but leaving it commented and added a note about the BC reason why we cannot do that for 2.X series. 2014-04-23 18:04:06 +00:00
Marco Pivetta
9ec54b8fed Merge pull request #1015 from EvanDotPro/docs/expressionbuilder-contains
Add ExpressionBuilder::contains() to docs
2014-04-23 15:58:06 +02:00
Evan Coury
d2c2067aaf Add ExpressionBuilder::contains() to docs 2014-04-23 06:54:03 -07:00
Guilherme Blanco
9ebce31a46 Made AbstractHydrator::gatherRowData() more understandable without breaking functionality. 2014-04-23 06:08:18 +00:00
Guilherme Blanco
29de3e00ff Added support for NEW operator when using ArrayHydration if user desires to benefit from this funcionality. 2014-04-23 05:10:23 +00:00
Guilherme Blanco
63d21ca4b2 DDC-3085 Verify ResultVariable works in combination with NullComparisonExpression wihle in HAVING clause. 2014-04-21 04:01:32 +00:00
Guilherme Blanco
4185a9ce4b Merge pull request #999 from doctrine/hotfix/DDC-3065-null-value-in-in-criteria-support
DDC-3065 null value in in criteria support
2014-04-20 23:30:14 -04:00
Guilherme Blanco
1e90fd1164 Merge pull request #1014 from bakura10/patch-1
Update second level cache doc
2014-04-20 18:24:01 -04:00
Michaël Gallego
9b847f1a04 Update second-level-cache.rst 2014-04-20 23:52:06 +02:00
Guilherme Blanco
6a8ee87268 Made DQL and EBNF in sync. 2014-04-20 20:27:57 +00:00
Guilherme Blanco
a3f95d919b DDC-3075 Added support for subqueries in NEW operator. 2014-04-20 14:40:51 +00:00
Guilherme Blanco
38b6838386 DDC-2575 Fixed issue with associations when parent is not yet loaded, but child is being created and no link happens. 2014-04-18 05:21:27 +00:00
Guilherme Blanco
df806977c6 Updated fix for HHVM. 2014-04-18 03:05:41 +00:00
Guilherme Blanco
9441e063aa Updated XML Exporter to deal with some HHVM weirdness. 2014-04-18 03:04:04 +00:00
Guilherme Blanco
10a0daf620 DDC-3068 DDC-3069 EntityManager::find accept array of object as id. 2014-04-18 02:03:47 +00:00
Fabio B. Silva
54d9f05e39 Merge pull request #1009 from doctrine/feature/hhvm-tests
HHVM compatibility
2014-04-17 16:21:06 -04:00
Marco Pivetta
e1259098f5 Fixed whitespace around imported classes 2014-04-17 15:37:24 -04:00
Marco Pivetta
9ab6ef723a Removing too eager cache tests 2014-04-17 15:37:24 -04:00
Marco Pivetta
b4933d76c7 HHVM tests are not allowed to fail anymore 2014-04-17 15:37:24 -04:00
Marco Pivetta
abb4671bfc Removing usage of memcache cache in tests (HHVM gets stuck on them on local setups) 2014-04-17 15:37:23 -04:00
Marco Pivetta
e263426cdf Removing eager assertion on error suppression when generating schema via tools 2014-04-17 15:37:23 -04:00
Guilherme Blanco
6af3236ba6 Merge pull request #1012 from FabioBatSilva/DDC-3078-slc-cache-interface-ctor-removal
Ddc 3078 slc cache interface ctor removal
2014-04-17 15:34:36 -04:00
Guilherme Blanco
318f5032db Missing documentation update. 2014-04-17 19:31:06 +00:00
Guilherme Blanco
be1cc14a9c DDC-2890 Fixed pagination with association order by. 2014-04-17 19:29:18 +00:00
fabios
1dc3396ad4 DDC-3078 - Use CacheFactory instead of cache instantiator 2014-04-17 15:20:31 -04:00
Marco Pivetta
fa1cc9269c DDC-3078 - removing unused imports 2014-04-17 15:16:59 -04:00
Marco Pivetta
d57d4b71f9 DDC-3078 - default cache instantiator class name was misstyped 2014-04-17 15:16:59 -04:00
Marco Pivetta
48e227167e DDC-3078 - cache instantiator related exceptions are not needed anymore 2014-04-17 15:16:59 -04:00
Marco Pivetta
df6a411365 DDC-3078 - cache instantiator is used in the ORM instead of callables 2014-04-17 15:16:59 -04:00
Marco Pivetta
4b388b2ce8 DDC-3078 - coverage for the default cache instantiator 2014-04-17 15:16:58 -04:00
Marco Pivetta
a790639167 DDC-3078 - providing a default cache instantiator implementation 2014-04-17 15:16:58 -04:00
Marco Pivetta
6931cd08c4 DDC-3078 - using an explicit CacheInstantiator interface to replace callable cache instantiators 2014-04-17 15:16:58 -04:00
Marco Pivetta
d7f87cdd36 DDC-3078 - removing unused cache class name invalidity exception methods 2014-04-17 15:16:58 -04:00
Marco Pivetta
9b2ee88683 DDC-3078 - removing cache class name setter/getter from cache configuration API 2014-04-17 15:16:58 -04:00
Marco Pivetta
87a907f9dd DDC-3078 - switching cache initialization to use cache instantiator from config 2014-04-17 15:16:57 -04:00
Marco Pivetta
cd0f94dd6c DDC-3078 - removing tests for cache class setter/getter on cache configuration 2014-04-17 15:16:57 -04:00
Marco Pivetta
68f489ecbb DDC-3078 - cache configuration tests for the newly introduced API for cache instantiators 2014-04-17 15:16:56 -04:00
Marco Pivetta
e5f79d1f73 DDC-3078 - adding API for cache instantiation to the configuration object 2014-04-17 15:16:56 -04:00
Marco Pivetta
1b5eb55ed9 DDC-3078 - adding exception methods for invalid cache instantiator 2014-04-17 15:16:56 -04:00
Marco Pivetta
04b52149ab DDC-3078 - constructor should never be interfaced 2014-04-17 15:16:56 -04:00
Guilherme Blanco
841bdd5ca5 DDC-2827 Added support for AggregateExpressions in NullComparisonExpression. 2014-04-17 04:39:26 +00:00
Guilherme Blanco
ceada41b83 DDC-2934 Added support for function declarations in order by. 2014-04-17 04:15:35 +00:00
Guilherme Blanco
54898eca60 Added index by consideration when eagerly loading to-many associations. 2014-04-17 03:53:21 +00:00
Guilherme Blanco
13afde0140 Updated phpunit dependency. 2014-04-17 01:22:17 +00:00
Guilherme Blanco
f5e6044cf5 Provided more decriptive explanation when single scalar hydrator is used and it returns multiple columns. 2014-04-17 01:09:33 +00:00
Guilherme Blanco
1488a509b2 DDC-2937 More informative response when using single scalar hydrator when it returns single row but multiple columns. 2014-04-16 05:44:54 +00:00
Guilherme Blanco
6e9b15a48f Merge pull request #951 from md2perpe/MoreInformationalEntityNotFoundException
More informational entity not found exception
2014-04-16 01:40:02 -04:00
Guilherme Blanco
b28fa9a05a DDC-1632 Optimized query count for one-to-many associations with fetch eager. 2014-04-16 05:36:31 +00:00
Guilherme Blanco
4029dc2ea8 Merge pull request #988 from holtkamp/DDC-3047-Exporter-association-fetch-modes
Exporter support for association fetch modes
2014-04-16 00:52:51 -04:00
Guilherme Blanco
1cd0b26a40 DDC-3068 EntityManager clear() calls now follow cascade detach configuration. 2014-04-16 04:47:57 +00:00
Guilherme Blanco
5ce6dabe9b Fixes DDC-2984. Made DDC-742 more resilient to recurring failures. 2014-04-16 04:20:18 +00:00
Marco Pivetta
68d477a4c6 Merge pull request #1011 from md2perpe/patch-2
Single quotes can't nest
2014-04-15 14:25:24 +02:00
Per Persson
38911076ad Single quotes can't nest
I decided to use "... '...' ...", but perhaps you prefer '... \'...\' ...'?
2014-04-15 13:56:18 +02:00
Guilherme Blanco
2da74e5147 Merge pull request #1006 from Trainmaster/master
Handling invalid discriminator values
2014-04-15 00:07:03 -04:00
Marco Pivetta
3a1e24e680 Merge branch 'feature/#973-index-flags-in-mappings'
Close #973
2014-04-14 01:22:02 +02:00
Marco Pivetta
a87d3e080e Minor CS fixes on top of #973 2014-04-14 01:21:23 +02:00
Adrian Olek
eccd8f85bc cs fixes 2014-04-14 01:21:23 +02:00
Adrian Olek
72bb16173a Added Comment entity mapping for StaticPHPDriver test 2014-04-14 01:21:23 +02:00
Adrian Olek
32ed32cf56 Added index flags test 2014-04-14 01:21:23 +02:00
Adrian Olek
b3a2988d2c CS fixes 2014-04-14 01:21:23 +02:00
Adrian Olek
cc2fb1a070 Added index flags support in annotation, xml & yaml mapping drivers. 2014-04-14 01:21:23 +02:00
Benjamin Eberlei
da24133306 Merge pull request #980 from adrianolek/convert-mapping-options
Added options attribute export to Annotation, Xml & Yaml exporters.
2014-04-13 23:38:30 +02:00
Marco Pivetta
8b6b1c68a0 Merge pull request #1010 from BenMorel/validation-message
Fixed validation message
2014-04-12 01:49:16 +02:00
Benjamin Morel
1b4eafc873 Fixed validation message 2014-04-11 22:27:51 +00:00
Guilherme Blanco
ac956f2b8c Merge pull request #1007 from umpirsky/patch-1
Minor dockblock change
2014-04-09 07:55:12 -04:00
Saša Stamenković
dc10bb69f6 Minor dockblock change 2014-04-09 13:53:56 +02:00
Frank Liepert
8740d54210 [DDC-3076] Add/Improve tests 2014-04-09 11:31:16 +02:00
Frank Liepert
df020e08a0 [DDC-3076] Fix ObjectHydrator 2014-04-09 11:30:11 +02:00
Frank Liepert
a054b59550 [DDC-3076] Add test 2014-04-09 10:19:48 +02:00
Frank
d1c722c1d0 Fix: handle invalid discriminator value 2014-04-09 01:55:54 +02:00
Frank
f7b95c1aa5 Add: invalidDiscriminatorValue method 2014-04-09 01:55:49 +02:00
Guilherme Blanco
73e5bbecbe Merge pull request #1004 from giosh94mhz/removed_useless_testinit
Removed all useless occurrence of require_once TestInit.php
2014-04-07 08:38:39 -05:00
Giorgio Premi
6cb3fa8fb7 Removed all useless occurrence of require_once TestInit.php 2014-04-07 14:43:25 +02:00
Marco Pivetta
4d950a9e10 Merge pull request #1002 from BenMorel/propertyfix
Fixed wrongly initialized property.
2014-04-04 22:42:43 +02:00
Benjamin Morel
b3ec4df8ce Fixed wrongly initialized property. 2014-04-04 20:05:16 +00:00
Guilherme Blanco
bfb66f1d85 Merge pull request #985 from doctrine/hotfix/DDC-3042-sql-alias-collisions-in-dql
[DDC-3042] SQL Alias collisions in DQL
2014-04-03 20:41:36 -05:00
Marco Pivetta
f80fceda0e DDC-3042 - changing SQL generation tests to respect changes in naming strategy 2014-04-04 03:05:48 +02:00
Marco Pivetta
e6bf096583 Prefixing alias counter with _ to fix DDC-3042 and prevent collisions 2014-04-04 03:05:48 +02:00
Marco Pivetta
11b3065fd1 Verifying DDC-3042 - duplicate aliases in DQL SQL generation 2014-04-04 03:05:48 +02:00
Marco Pivetta
3680bb7ccc Stubbing out test for DDC-3042 - DQL aliases cause collisions when selecting from tables with similar properties 2014-04-04 03:05:48 +02:00
Marco Pivetta
733102b4a1 DDC-3065 - applying hotfix that allows NULL in IN() criteria 2014-04-03 17:36:56 +02:00
Marco Pivetta
a8b96803a4 DDC-3065 - persister tests for criteria containing NULL values in IN() conditions 2014-04-03 17:36:56 +02:00
Marco Pivetta
eb6498544f DDC-3065 - splitting tests and checking multiple values support 2014-04-03 17:36:56 +02:00
Marco Pivetta
f54d6157f4 DDC-3065 - hardening test - should support multiple values in IN(), also NULL ones 2014-04-03 17:36:56 +02:00
Marco Pivetta
f2f571e4ab DDC-3065 - failing test - IN()-alike criteria should support NULL search values 2014-04-03 17:36:56 +02:00
Menno Holtkamp
26307a0cee Added 'fetch="EXTRA_LAZY"' to many-to-many association 2014-03-31 11:55:04 +02:00
Menno Holtkamp
8d0a5958eb Code-style improvement 2014-03-31 11:02:36 +02:00
Menno Holtkamp
59842e9bc6 Code-style improvement
Also to trigger Travis CI
2014-03-31 11:00:50 +02:00
Menno Holtkamp
3044009550 Added 'fetch="EAGER"' to one-to-one association 2014-03-30 16:01:46 +02:00
Marco Pivetta
da96f4938a Merge pull request #994 from ThomasLomas/patch-1
Update EntityGenerator comment
2014-03-29 02:51:00 +01:00
Thomas Lomas
7d9630786b Update EntityGenerator comment
fieldVisibility was referred to as a boolean, where it is actually a string.
2014-03-29 01:49:12 +00:00
Marco Pivetta
8f688509c8 Merge pull request #992 from BenMorel/docfix
Fixed typos
2014-03-28 14:05:20 +01:00
Benjamin Morel
b3ec87ab09 Fixed typos 2014-03-28 12:54:49 +00:00
Marco Pivetta
ca19db34d2 Merge pull request #990 from Remper/patch-1
Typo in documentation
2014-03-27 13:51:28 +01:00
Nechaev Yaroslav
46b16a5e10 Update dql-doctrine-query-language.rst 2014-03-27 15:49:04 +03:00
Nechaev Yaroslav
b145ebf955 Typo in documentation
This method from AbstractQuery accepts constants from ClassMetadata rather than string
2014-03-27 15:45:52 +03:00
Menno Holtkamp
798075931a Exporter support for association fetch modes 2014-03-26 01:00:17 +01:00
Steve Müller
048c56bdb0 Merge pull request #987 from baileylo/patch-1
Fixes typo in dql-doctrine-query-language.rst
2014-03-25 19:11:28 +01:00
Logan Bailey
263d9f30f2 Fixes typo in dql-doctrine-query-language.rst
Changes "If you a query" to "If you have a query"
2014-03-25 11:10:43 -07:00
Benjamin Eberlei
927d69b61a Merge pull request #957 from thealjey/master
makes doctrine less dependent upon the symfony yaml component
2014-03-23 15:41:27 +01:00
Benjamin Eberlei
8addb5ffa8 Merge pull request #960 from drealecs/fixes-EntityManagerInterface
allow passing EntityManagerInterface when creating a HelperSet
2014-03-23 15:36:38 +01:00
Benjamin Eberlei
5335b2a2ad Merge pull request #955 from goatherd/patch-1
iteration risk note
2014-03-23 15:35:53 +01:00
Benjamin Eberlei
71fc425902 Merge pull request #963 from mdemo/master
SQLFilter -- allows to check if a parameter was set
2014-03-23 15:33:14 +01:00
Benjamin Eberlei
a03c8da683 Merge pull request #962 from netiul/master
Stop executeDeletions when there is nothing to to delete anymore
2014-03-23 15:32:28 +01:00
Benjamin Eberlei
dd8075ea95 Merge branch 'DDC-3018' 2014-03-23 15:16:15 +01:00
Benjamin Eberlei
2aea3036b6 [DDC-3018] Fix string literals in new operator. 2014-03-23 15:16:09 +01:00
Adrian Olek
0caeb4edbf Initialize table options annotation, fixed condition in AnnotationDriver 2014-03-23 14:37:55 +01:00
Benjamin Eberlei
24d4fd17f3 Merge branch 'DDC-2996' 2014-03-23 13:19:04 +01:00
Benjamin Eberlei
d473824279 [DDC-2996] Fix bug in UnitOfWork#recomputeSingleEntityChangeSet
When calling UnitOfWork#recomputeSingleEntityChangeSet on an entity
that didn't have a changeset before, the computation was ignored.
This method however is suggested to be used in "onFlush" and "preFlush"
events in the documentation.

Also fix a bug where recomputeSingleEntityChangeSet was used
before calculating a real changeset for an object.
2014-03-23 13:16:33 +01:00
Benjamin Eberlei
e415da7f47 Merge branch 'DDC-3033' 2014-03-23 12:38:06 +01:00
Benjamin Eberlei
ecc2857e2d [DDC-3033] Clarify restrictions in events. 2014-03-23 12:37:56 +01:00
Benjamin Eberlei
396337bd0d [DDC-3033] Fix bug in UnitOfWork#recomputeSingleEntityChangeSet.
The fix for DDC-2624 had a side effect on recomputation of
changesets in preUpdate events. The method wasn't adjusted
to the changes in its sister method computeChangeSet() and
had wrong assumptions about the computation.

Especially:
1. Collections have to be skipped
2. Comparison was changed to strict equality only.
2014-03-23 12:35:54 +01:00
Benjamin Eberlei
fb2d2bce45 Merge pull request #984 from holtkamp/patch-1
Use boolean values for 'unique' attribute
2014-03-23 10:16:04 +01:00
Benjamin Eberlei
0621b5a161 Merge branch 'DDC-3045' 2014-03-23 09:58:38 +01:00
Benjamin Eberlei
c8836a008d [DDC-3045] Check that EntityRepository APIs prevent SQL injection through field names. Improve EntityManager#find() error handling when invalid identifier fields are passed. 2014-03-23 09:58:31 +01:00
Menno Holtkamp
6e651b13c9 Added test to ensure boolean metadata is properly exported/serialized to XML 2014-03-20 21:29:52 +01:00
Guilherme Blanco
fdb9f90848 Merge pull request #983 from holtkamp/patch-new-dql-in-expression-builder
Added MEMBER OF and INSTANCE OF to ExpressionBuilder
2014-03-20 08:28:32 -05:00
Menno Holtkamp
ef4e73f987 Use boolean values for 'unique' attribute
As defined in: https://github.com/doctrine/doctrine2/blob/master/doctrine-mapping.xsd#L294

Same as 'nullable' attribute. 

It was being exported as a "1" for TRUE and "0" for false
2014-03-20 11:08:29 +01:00
Menno Holtkamp
262e465e39 Processed code-review feedback 2014-03-20 09:02:39 +01:00
Menno Holtkamp
56e879b7aa Removed double linebreaks 2014-03-19 13:03:26 +01:00
Menno Holtkamp
400f420925 Added MEMBER OF and INSTANCE OF helpers to ExpressionBuilder 2014-03-19 13:00:45 +01:00
Thomas Lallement
6bbc07ddbf Update DDC3033Test.php 2014-03-18 22:10:15 +01:00
Thomas Lallement
7bf2bcb017 Update DDC3033Test.php 2014-03-18 15:04:48 +01:00
Thomas Lallement
263822fd19 Failing Test (since commit 53a5a48aed)
Hi,

It seems to be a regression since the commit 53a5a48aed

Doctrine\ORM\PersistentCollection can be populated in $changeSet if you set a PreUpdate and PostUpdate event.

Original issue: http://www.doctrine-project.org/jira/browse/DDC-3033
2014-03-18 15:00:43 +01:00
Marco Pivetta
9b4ae6d556 Removing note on m2m association filtering as of #885 2014-03-16 17:41:19 +01:00
Guilherme Blanco
383604d4b8 Merge pull request #978 from AntonStoeckl/embedded-empty-prefix
[DDC-2987] Enable empty prefixes for inlined embeddable
2014-03-16 11:35:25 -05:00
Guilherme Blanco
44c1dae1b9 Merge pull request #885 from bakura10/criteria-many-to-many
Add support for ManyToMany Criteria
2014-03-16 11:33:10 -05:00
Adrian Olek
49587776fa Renamed _exportOptions method 2014-03-16 17:31:15 +01:00
Adrian Olek
e403bf207c cs fix 2014-03-16 16:56:46 +01:00
Adrian Olek
553883bdd1 Added options attribute export to Annotation, Xml & Yaml
exporters.
2014-03-16 16:50:41 +01:00
Anton Stoeckl
83ef47c8d0 This fixes ticket DDC-3028
Enables columnPrefix to be "false" so no prefix is added.
Changed the structure a bit (to if/else) to be more readable with the additional condition.
2014-03-14 12:34:22 +01:00
Anton Stoeckl
871dc5d186 Test are for fix of ticket DDC-3028
Added 3 tests that check regression for:
- columnPrefix is empty
- columnPrefix is a string
- columnPrefix is false

Added some small entity / embeddable classes to support the test cases.
2014-03-14 12:32:49 +01:00
Anton Stoeckl
cd2043915c columnPrefix must support string and boolean, so changing to mixed 2014-03-14 12:29:01 +01:00
Anton Stöckl
fa79de6ea4 Enable empty prefixes for inlined embeddable
This fixes http://www.doctrine-project.org/jira/browse/DDC-2987

This makes it possible to map a field from an embeddable to a database field with the same name, without any prefix added.

Example:
- an embeddable object "Id" with a property "id"
- per default this would map inline to id_id
- supplying null or '' as columnPrefix does not work due to the ! empty() check
- with my little change, if columnPrefix : false is supplied in the mapping config this will now map to a db column "id"

To build Ids as ValueObjects is a very common approach in DDD, so ihmo this is a must have.
2014-03-13 16:47:22 +01:00
Marco Pivetta
b30b1a5999 Merge pull request #977 from mvrhov/patch-2
Fix wrong annotation
2014-03-11 14:52:49 +01:00
Miha Vrhovnik
d888d7d1c0 Fix wrong annotation
Without above fix I'm getting 
"[Semantical Error] The annotation "@array" in method Doctrine\ORM\Mapping\ClassMetadataInfo::mapEmbedded() was never imported. Did you maybe forget to add a "use" statement for this annotation?"
2014-03-11 14:44:42 +01:00
Marco Pivetta
02daf0049a Merge branch 'docs/DDC-3020' 2014-03-11 11:30:18 +01:00
Marco Pivetta
fea200043e Adding note about DDC-3020 - external XML entities may or may not work 2014-03-11 11:30:08 +01:00
Marco Pivetta
87505c8716 Merge pull request #975 from tkleinhakisa/doc-automatic-discriminator-map
Added info about automatic discriminator map
2014-03-11 10:08:58 +01:00
Klein Thomas
832127a0d6 Added info about automatic discriminator map
see https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php#L257
2014-03-11 09:54:46 +01:00
Guilherme Blanco
f197a9c9f1 Merge pull request #974 from FabioBatSilva/resolve-association-entry
[SLC] Resolve association cache entry
2014-03-06 22:38:26 -05:00
Fabio B. Silva
e9ec0a24da [SLC] resolve association cache entry 2014-03-06 20:44:59 -05:00
Fabio B. Silva
ecf242f6d4 Merge pull request #971 from FabioBatSilva/slc-query-assoc-proxy
[SLC] Fix query association proxy
2014-03-06 15:43:58 -05:00
Marco Pivetta
8d4821b4dc Merge pull request #972 from hallabro/patch-1
Capitalize @GeneratedValue (annotations-reference.rst)
2014-03-05 11:03:30 +01:00
Marco Pivetta
7843eed8bc Merge pull request #969 from aitboudad/patch-2
[Doc] added note about Criteria limits on PersistentCollection
2014-03-05 10:59:10 +01:00
Robin Hallabro
a395921fdc Capitalize @GeneratedValue (annotations-reference.rst) 2014-03-05 10:57:31 +01:00
Fabio B. Silva
cbdd8bc041 [SLC] Fix query association proxy 2014-03-05 04:10:07 -05:00
Abdellatif AitBoudad
5f429a5418 [Doc] added note Criteria limits. 2014-03-04 21:36:07 +00:00
Guilherme Blanco
15432fc55f Merge pull request #967 from FabioBatSilva/slc-query-builder
[SLC] Add query builder options
2014-03-03 21:10:48 -05:00
fabios
6e64cc101a [SLC] Add query builder options 2014-03-03 15:28:35 -05:00
Benjamin Eberlei
63d849b6f0 Merge pull request #966 from FabioBatSilva/simplify-build
Simplify build matrix
2014-03-02 12:36:50 +01:00
Fabio B. Silva
a91e05db9e Simplify build matrix 2014-03-01 17:13:28 -05:00
Benjamin Eberlei
a522aa0a81 Merge pull request #965 from FabioBatSilva/slc-criteria
[SLC] Add support for criteria
2014-03-01 12:47:57 +01:00
Benjamin Eberlei
f0a6eb8723 Merge pull request #964 from FabioBatSilva/DDC-2943
[SLC][DDC-2943] Disable slc for pagination queries
2014-03-01 12:46:52 +01:00
Fabio B. Silva
8c2aef3f14 [DDC-2943] Disable slc for pagination queries 2014-03-01 01:15:09 -05:00
Fabio B. Silva
f4c63f8238 [SLC] Support criteria 2014-03-01 00:59:34 -05:00
Miro Demovic
1921c2f74a Allow if parameter exists in SQLFilter 2014-02-26 08:55:47 +01:00
Zacharias Luiten
8a168bb2ce stop executing executeDeletions when there is nothing to to delete anymore 2014-02-25 16:02:02 +01:00
Alexandru Patranescu
1fe6dbc1f2 allow passing EntityManagerInterface when creating a HelperSet 2014-02-23 20:01:14 +02:00
Benjamin Eberlei
f5897d4b0b Merge branch 'master' of github.com:doctrine/doctrine2 2014-02-21 16:14:57 +01:00
Benjamin Eberlei
51e5db86b7 Add SECURITY.md and a chapter on security assumptions in Doctrine ORM. 2014-02-21 16:12:32 +01:00
Eugene Kuzmenko
c06201303d makes doctrine less dependent upon the symfony yamp component 2014-02-20 09:28:44 +00:00
Marco Pivetta
dfe7a68053 Removing notice about public properties support (included since 2.4)
see doctrine/doctrine2#406
2014-02-19 22:02:07 +01:00
Marco Pivetta
5a2497d482 Merge pull request #935 from da-eto-ya/remove_public_validation
Remove incorrect (outdated) validation for public fields in SchemaValidator
2014-02-19 21:21:59 +01:00
Marco Pivetta
0797feeb0f Travis must use --prefer-source because of Github API limitations 2014-02-18 10:28:13 +01:00
Michaël Gallego
b550d44cb9 CS fix 2014-02-18 10:26:26 +01:00
Michaël Gallego
a45ecb5733 Fix bug with hydrators 2014-02-18 10:26:25 +01:00
Michaël Gallego
6cbd643d4b Add test 2014-02-18 10:26:25 +01:00
Michaël Gallego
f03f991a25 Functional test 2014-02-18 10:26:25 +01:00
Michaël Gallego
0d5de64c0f Fix CS 2014-02-18 10:26:25 +01:00
Michaël Gallego
a55f2c48ca Fix test 2014-02-18 10:26:25 +01:00
Michaël Gallego
e5ba28676d fallback to persister count 2014-02-18 10:26:25 +01:00
Michaël Gallego
fbbe922cb6 Fix tests 2014-02-18 10:26:25 +01:00
Michaël Gallego
c69b7562ab Remove useless exception 2014-02-18 10:26:25 +01:00
Michaël Gallego
bb1f71f1f9 Fix docblock 2014-02-18 10:26:25 +01:00
Michaël Gallego
be39afa2f4 Add method to interface 2014-02-18 10:26:24 +01:00
Michaël Gallego
9385a600cf Fix wrong logic 2014-02-18 10:26:24 +01:00
Michaël Gallego
738cc250f8 Revert docblock 2014-02-18 10:26:24 +01:00
Michaël Gallego
07654ddd3f Revert tab changes 2014-02-18 10:26:24 +01:00
Michaël Gallego
160b07d1e3 Rebase to master 2014-02-18 10:26:24 +01:00
Guilherme Blanco
0dbd742588 Merge pull request #886 from Strate/bugfix/join-with-condition-placement-fix
[DDC-1256] Fix applying ON/WITH conditions to first join in Class Table Inheritance
2014-02-17 12:12:05 -05:00
Maik Penz
0677423d14 iteration risk note
> instead of loading the whole result into memory at once
is not the full truth.

There is a certain risk of processes getting killed due to memory allocation with large iteration. This is caused by result buffering of the client not being visible to PHP and thus not from 'within' the process.

It is not certain that this occurs with all database clients but seems rather likely to at this point.

This is only a proposal for discussion as I am not certain how to best add the information or if to add it at all (was it obvious before?). Personally I got confused by the existing description and didn't notice the memory implication until further investigation using `top` reported the process to run at 3+GB memory while PHP reported 400M real peak usage.
2014-02-17 10:33:10 +01:00
Marco Pivetta
4382304e77 Merge pull request #953 from goetas/patch-1
Update doc with latest news about extra lazy assoc
2014-02-12 23:56:00 +01:00
Asmir Mustafic
e27d963784 Update extra-lazy-associations.rst 2014-02-12 23:42:52 +01:00
Asmir Mustafic
1f0d4197a9 Update doc with latest news about extra lazy assoc 2014-02-12 23:42:13 +01:00
Fabio B. Silva
a3b4104612 Merge pull request #950 from goetas/patch-1
[SLC] Cache empty collections
2014-02-12 04:26:27 -05:00
Asmir Mustafic
94896ce552 Typo fix on many-to-many assocaition cascade test 2014-02-12 08:18:34 +01:00
Asmir Mustafic
8cdbcf1263 Merge remote-tracking branch 'origin/master' into patch-1 2014-02-12 05:15:00 -02:00
Per Persson
3543ccea7f Pass class name to constructor. 2014-02-11 23:48:31 +01:00
Per Persson
7ef1063007 Pass class name to constructor. 2014-02-11 23:44:24 +01:00
Per Persson
4b061a0e4c Add class name as argument. 2014-02-11 23:40:38 +01:00
Marco Pivetta
9b0d7dde91 Merge pull request #952 from simshaun/patch-1
Add DB-level onDelete CASCADE example
2014-02-11 23:24:38 +01:00
Shaun
57ac3bd4be Add DB-level onDelete CASCADE example
This adds `onDelete: CASCADE` to the `address` 1-1 relationship just to show how you would map a db-level cascade.
2014-02-11 17:23:19 -05:00
Asmir Mustafic
4a6d6e34f8 Test empty collections second level cache 2014-02-11 17:39:16 +01:00
Asmir Mustafic
a5fbb20fbb Can cache many to many empty relations 2014-02-11 15:08:49 +01:00
Asmir Mustafic
1c94c16234 Can cache empty collections
I should be able to cache an "empty" collection.

I have a some objects, where 90% of these have on-to-many relations with zero associated elements.
This causes doctrine to run a query each time, instead of cache it as empty relation.
2014-02-11 14:59:31 +01:00
Marco Pivetta
e8f51acdb2 Merge pull request #947 from BenMorel/unused-imports
Cleaned up further unused imports.
2014-02-10 05:48:56 +01:00
Strate
324f200f1b Merge branch 'master' into bugfix/join-with-condition-placement-fix 2014-02-10 08:22:11 +04:00
Benjamin Morel
08f6291350 Cleaned up further unused imports. 2014-02-09 23:45:22 +00:00
Marco Pivetta
c4b1d4fa28 Merge pull request #946 from BenMorel/unused-imports
Cleaned up unused imports
2014-02-09 23:33:26 +01:00
Benjamin Morel
412e4ab9da Cleaned up unused imports 2014-02-09 22:12:51 +00:00
Steve Müller
6cd0861fa3 Merge pull request #945 from raziel057/patch-1
Fix CS
2014-02-09 16:54:22 +01:00
Thomas Lallement
2a77a739dc Fix CS 2014-02-09 16:37:32 +01:00
Benjamin Eberlei
4c4e4f6d3d Merge pull request #939 from doctrine/DDC-1985
[DDC-2939] Order Preservation
2014-02-09 15:43:57 +01:00
Benjamin Eberlei
288953aa6d Merge pull request #944 from WouterJ/patch-1
Fixed InputOption modes
2014-02-09 15:43:14 +01:00
Wouter J
d7b917aa49 Fixed InputOption modes 2014-02-09 15:10:00 +01:00
Benjamin Eberlei
53a5a48aed [DDC-2624] Fix bug when persistent collection is cloned and used in a new entity. 2014-02-09 14:27:42 +01:00
Benjamin Eberlei
3c2b626102 Merge pull request #943 from jankramer/handle-embeddables-in-embeddables
Validate embeddables do not contain other embeddables.
2014-02-09 11:06:43 +01:00
Jan Kramer
43e37d4f2f Throw exception on embeddables in embeddables. 2014-02-09 10:09:28 +01:00
Marco Pivetta
496fa85641 Merge pull request #940 from WouterJ/patch-1
Fixed typo & horizontal scrolling
2014-02-08 20:22:39 +01:00
Wouter J
24feae84cd Fixed typo & horizontal scrolling 2014-02-08 20:19:54 +01:00
Benjamin Eberlei
d31f7ebf57 [DDC-1985] Fix ordering preservation in SQL limit subquery output walker. 2014-02-08 17:01:55 +01:00
Benjamin Eberlei
1a08b52ab4 Cleanup test output. 2014-02-08 17:00:21 +01:00
Benjamin Eberlei
35511db4da Merge pull request #898 from USvER/patch-1
Added note to STI
2014-02-08 16:34:30 +01:00
Benjamin Eberlei
50ba19d91b Merge pull request #937 from goetas/contains-key
Extra-lazy for containsKey on collections
2014-02-08 16:28:44 +01:00
Benjamin Eberlei
8a0901c92b Merge pull request #835 from schmittjoh/ValueObjects
Value objects (Based on #634)
2014-02-08 16:24:47 +01:00
Benjamin Eberlei
8e3f4561c0 Merge pull request #858 from schmittjoh/rsmBuilder
lifts an unnecessary restriction on ResultSetMappingBuilder
2014-02-08 16:23:18 +01:00
Benjamin Eberlei
058e024f0e Merge pull request #902 from gwagner/master
Fix Lifecycle Callbacks
2014-02-08 16:01:13 +01:00
Benjamin Eberlei
31a2870c3f Merge pull request #912 from BenMorel/collection-count
Avoid PersistentCollection::isEmpty() to fully load the collection.
2014-02-08 16:00:10 +01:00
Benjamin Eberlei
960fbfc110 Merge pull request #908 from FabioBatSilva/DDC-2862
[DDC-2862][SLC] Fix lazy association load
2014-02-08 15:55:20 +01:00
Benjamin Eberlei
b76e95cbb9 Merge pull request #917 from doctrine/hotfix/DDC-2931
DDC-2931 - one-to-one self-referencing association broken by DCOM-96
2014-02-08 15:46:07 +01:00
Benjamin Eberlei
5fc7e653fe Update UPGRADE.md notes with BC mention. 2014-02-08 15:42:24 +01:00
Benjamin Eberlei
105d9e998b Merge pull request #927 from timdev/timdev-fixes
s/EntityManager/EntityManagerInterface/ in a few places
2014-02-08 15:30:15 +01:00
Benjamin Eberlei
f07c576e5f Merge pull request #932 from deeky666/DDC-2919
[DDC-2919] Make lock mode usage consistent
2014-02-08 15:27:35 +01:00
Benjamin Morel
496f9a0176 Avoid PersistentCollection::isEmpty() to fully load the collection on extra lazy fetch. 2014-02-08 13:49:48 +00:00
Benjamin Eberlei
0c2c5006f8 Merge pull request #934 from shustrik/master
faild test with multiple HINT_CUSTOM_TREE_WALKERS
2014-02-08 14:34:35 +01:00
Asmir Mustafic
5475d616e3 more tests 2014-02-07 14:30:17 +01:00
shustrik
b167a64544 remove doc 2014-02-06 20:08:07 +03:00
Strate
ffe5bf1fe3 Merge pull request #2 from shustrik/multiplie_tree_walker
Multiplie tree walker bugfix
2014-02-06 20:04:24 +03:00
shustrik
12985b7811 add iterator to tree walker chain 2014-02-06 19:39:40 +03:00
Marco Pivetta
7ceb9b0b50 Merge pull request #938 from HermanPeeren/master
Missing join-tables added in example
2014-02-06 16:31:17 +01:00
HermanPeeren
128e83909b Update working-with-associations.rst
removed some spaces that had come into it while editing last commit
2014-02-06 16:09:27 +01:00
HermanPeeren
9c19d1e5c4 Update working-with-associations.rst
There are 2 many-to-many associations between the users and comments. Both use another join-table. The join-tables user_favorite_comments and user_read_comments must be specified. Otherwise the default "user_comment" is taken twice. See https://groups.google.com/forum/#!topic/doctrine-user/Kti36_n6490 and https://groups.google.com/forum/#!topic/doctrine-user/TYwafhgYiSU
2014-02-06 15:59:56 +01:00
Asmir Mustafic
1d40c85c3c Right owning side column selection 2014-02-06 14:26:06 +01:00
shustrik
6fe40b055f fix return walker 2014-02-06 16:18:35 +03:00
shustrik
a6b43b93ac fix TreeWalkerChain.
Create walker object in foreach.
2014-02-06 16:06:00 +03:00
Asmir Mustafic
2eb428df79 code style 2014-02-06 12:55:33 +01:00
Asmir Mustafic
724e69146c typos and removed confusing ternary 2014-02-06 12:44:13 +01:00
Asmir Mustafic
557686aa0a Entra-lazy for containsKey on collections 2014-02-06 12:27:12 +01:00
Ilya Pleshakov
1f3290faae Remove incorrect (outdated) validation for public fields in SchemaValidator 2014-02-06 13:02:41 +04:00
shustrik
543ab500da rename test 2014-02-06 10:53:34 +03:00
shustrik
7107a85041 faild test with multiple HINT_CUSTOM_TREE_WALKERS
failed test when we have more than 1 walker HINT_CUSTOM_TREE_WALKERS ,
because walkSelectStatement in TreeWalkerChain saves the last hint _queryComponents result.
2014-02-06 01:27:17 +03:00
Steve Müller
a6c8ab8a5f make lock mode usage consistent 2014-02-05 15:13:53 +01:00
Strate
5c44dd3823 Allow to use object as a hint value. 2014-02-04 15:51:53 +01:00
Strate
352f38a77e Fix comment 2014-02-04 15:51:53 +01:00
Strate
e8d47fa9a3 Added a new configuration option: defaultQueryHints, which allows to populate all queries by default set of hints. 2014-02-04 15:51:53 +01:00
Benjamin Eberlei
626efdafd4 Delete old phing build leftover. 2014-02-04 08:49:08 +01:00
Benjamin Eberlei
9653213914 Add warning about non scalar use in Criteria. 2014-02-04 00:02:09 +01:00
Tim Lieberman
25d71462e3 Make SchemaTool and SchemaValidator use EntityManagerInterface instead of EntityManager 2014-02-01 05:11:20 +00:00
Marco Pivetta
e322ab4deb DDC-2931 - Removing previous broken fix for DDC-2931 - hardened 2014-02-01 02:00:10 +01:00
Marco Pivetta
7a32eca039 DDC-2931 - Safe comparison between proxies and entities when refreshing objects 2014-02-01 01:57:51 +01:00
Tim Lieberman
bf9fbd896b Substitute EntityManagerInterface for EntityManager in Console EntityManagerHelper 2014-02-01 00:23:23 +00:00
Marco Pivetta
8c92e0f19f DDC-2931 - adding test that verifies that fetch-joined entities get refreshed with hints 2014-02-01 01:05:34 +01:00
Tim Lieberman
43d94e7b5e Console EntityManagerHelper now accepts EntityManagerInterface as constructor argument, instead of insisting on an EntityManager 2014-01-31 15:32:31 -08:00
Benjamin Eberlei
310afdf5d7 Merge pull request #910 from deeky666/DDC-2310
[DDC-2310] [DDC-2675] Fix SQL generation on table lock hint capable platforms
2014-01-31 11:33:30 -08:00
Fabio B. Silva
7e5a1c6b0d Fix lazy association load 2014-01-28 12:26:10 -05:00
Fabio B. Silva
9b7e949025 Merge pull request #915 from mnapoli/patch-1
Improved DQL's "new" operator documentation
2014-01-25 08:36:54 -08:00
Marco Pivetta
b815a4b2d3 DDC-2931 - removing old comments 2014-01-24 02:52:30 +01:00
Marco Pivetta
596d2070ed DDC-2931 - Removing refresh hints when fetching association data in hydrators 2014-01-24 02:45:28 +01:00
Marco Pivetta
9eafb11a02 DDC-2931 - Detailed explanation 2014-01-24 02:43:14 +01:00
Marco Pivetta
22bcfef523 DDC-2931 - cleaning up code formatting/simplifying test case 2014-01-23 20:19:36 +01:00
root
fabef48ca2 [DDC-2931] testcase to reproduce Jira 2931 2014-01-23 17:31:08 +00:00
Matthieu Napoli
30c3eb0465 Improved DQL's "new" operator documentation 2014-01-21 17:34:54 +01:00
Matthieu Napoli
330c66559c Improved DQL's "new" operator documentation
I had to dig through the pull requests and issues to figure that out, so I believe it's best documented explicitly.
2014-01-21 10:54:13 +01:00
Strate
04e6061584 Added an exception when invalid case.
Fixes after code review.
2014-01-20 20:06:53 +04:00
Benjamin Eberlei
bba5ec27fb Remove badges 2014-01-20 09:36:15 +01:00
Marco Pivetta
a83f5df47c Merge pull request #913 from WouterJ/patch-1
Added exception class names
2014-01-19 22:02:34 -08:00
Marco Pivetta
0e5146b06b Merge pull request #914 from liuggio/patch-2
added license badge
2014-01-19 21:36:50 -08:00
Strate
41ec5fd56d Fix applying ON/WITH conditions to first join in Class Table Inheritance
Now we build nested joins for CTI when using ON/WITH clause.
2014-01-19 20:56:24 +04:00
Strate
b69481b639 Merge branch 'master' into bugfix/join-with-condition-placement-fix 2014-01-19 15:06:01 +04:00
Giulio De Donato
65f002d62c added license badge 2014-01-18 23:44:44 +01:00
Wouter J
996499e6fc Added exception class names 2014-01-18 11:09:22 +01:00
Steve Müller
b9ff877f14 fix SQL generation on table lock hint capable platforms 2014-01-15 22:46:09 +01:00
Steve Müller
cf43edd6a1 Merge pull request #911 from goatherd/fix-foreach-as-style
fix foreach coding style
2014-01-14 14:50:33 -08:00
goatherd
a485e791bb fix foreach coding style 2014-01-14 23:44:38 +01:00
Benjamin Eberlei
b0736b5b6c Merge pull request #909 from deeky666/fix-sqlserver-database-driver-test
Fix DatabaseDriverTest on SQL Server
2014-01-13 09:52:17 -08:00
Steve Müller
3eced21a01 add missing use statement for SQL Server testsuite to work 2014-01-13 15:57:18 +01:00
Geoffrey Wagner
b863b9b957 Fix some code standard things 2014-01-12 17:14:32 -06:00
Marco Pivetta
771da768ac Merge pull request #906 from KevinBrogan/master
removed erroneous tip
2014-01-12 08:10:20 -08:00
Benjamin Eberlei
12556e2dfe Add MyISAM limitation 2014-01-12 11:33:37 +01:00
Kevin Brogan
5989c0cb54 removed erroneous tip
I'm working through the tutorial myself and got to this point.

Don’t forget to add a require_once call for this class to the bootstrap.php

This advice is wrong. The class is located in the src directory and so is autoloaded when required. No require statement is necessary.
2014-01-10 20:28:41 -08:00
Geoffrey Wagner
e9739f8591 Fix some code standard things 2014-01-09 10:48:38 -06:00
Geoffrey Wagner
4772cbfae6 Add a test
addLifecycleCallback now only allows a callback once so we do not hook them twice
2014-01-08 20:58:50 -06:00
Geoffrey Wagner
db31c58102 Fix Lifecycle Callbacks
Remove a bit of code that breaks lifecycle callbacks of parent MappedSuperclasses
2014-01-08 17:17:47 -06:00
Benjamin Eberlei
93c1106735 Merge pull request #901 from deeky666/disable-travis-hhvm-unsupported-drivers
Exclude HHVM + PostgreSQL and HHVM + Mysqli from travis build matrix
2014-01-08 11:22:29 -08:00
Steve Müller
f4c30dcd1c exclude unsupported HHVM + PostgreSQL and HHVM + Mysqli from travis build matrix for now 2014-01-08 20:19:10 +01:00
Guilherme Blanco
4e824ac6e1 Merge pull request #900 from deeky666/fix-connection-mock
Fix connection mock fetchColumn signature
2014-01-06 12:27:50 -08:00
Steve Müller
5f93c83059 fix connection mock fetchColumn signature 2014-01-06 21:24:01 +01:00
USvER
b23d0bec33 Added note to STI
http://www.doctrine-project.org/jira/browse/DDC-2886
2014-01-06 00:44:51 +02:00
Guilherme Blanco
b65d9e6c83 Merge pull request #896 from holtkamp/patch-2
Ensure <cascade/> elements preceed <join-columns/>
2014-01-05 11:32:31 -08:00
Guilherme Blanco
7f30c31e98 Merge pull request #897 from holtkamp/patch-3
Respected 'inheritanceType' at Entity level
2014-01-05 11:31:25 -08:00
Menno Holtkamp
fc2b9980ae Exclude exporting inheritanceType for INHERITANCE_TYPE_NONE 2014-01-05 18:53:31 +01:00
Menno Holtkamp
797fb9c34a Respected 'inheritanceType' at Entity level
It was (incorrectly) fetched from Table-level.
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#annref-inheritancetype
2014-01-05 18:41:55 +01:00
Menno Holtkamp
85a16f9f28 Ensure <cascade/> elements preceed <join-columns/>
When converting annotations based metadata to XML, the position of the <cascade/> elements resulted in XSD validation errors caused by the definitions of the association ComplexTypes:
- https://github.com/doctrine/doctrine2/blob/master/doctrine-mapping.xsd#L463
- https://github.com/doctrine/doctrine2/blob/master/doctrine-mapping.xsd#L482
- https://github.com/doctrine/doctrine2/blob/master/doctrine-mapping.xsd#L495
- https://github.com/doctrine/doctrine2/blob/master/doctrine-mapping.xsd#L517

Since changing the XSD might result in validation problems in existing mappings, changing the XmlExporter seems a better approach.

Note that the '<cache/>' element is not yet generated by the XmlExporter, but according to the XML Schema, it should precede the '<cascade/>' element.
2014-01-05 15:34:59 +01:00
Johannes Schmitt
7020f4135f skips DQL UPDATE/DELETE tests with SLC enabled 2014-01-04 18:32:06 +01:00
Johannes Schmitt
87b4155665 adds test for ResultSetMappingBuilder restriction 2014-01-04 18:06:16 +01:00
Johannes Schmitt
e879626d73 Merge branch 'master' of github.com:doctrine/doctrine2 into rsmBuilder 2014-01-04 17:57:39 +01:00
Johannes Schmitt
946419459c fixes bad merge 2014-01-04 17:54:46 +01:00
Johannes Schmitt
4f585a3d63 Merge branch 'master' of github.com:doctrine/doctrine2 into ValueObjects
Conflicts:
	UPGRADE.md
	lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php
2014-01-04 17:52:32 +01:00
Benjamin Eberlei
69cad4079d Merge pull request #820 from apancutt/master
Added support for field options to FieldBuilder
2014-01-03 14:03:25 -08:00
Benjamin Eberlei
8de37de4f7 Merge branch 'DDC-2792' 2014-01-03 23:01:12 +01:00
Benjamin Eberlei
2a9351b8dc [DDC-2792] Fix fatals 2014-01-03 23:01:05 +01:00
Vyacheslav Ganzin
1edf6b65b1 joinColumn is not required in manyToMany
annotation behavior copied
2014-01-03 22:27:27 +01:00
Benjamin Eberlei
c8c7cf0528 Fix tests after merge of QueryBuilder#addCriteria changes. 2014-01-03 21:28:06 +01:00
Steve Müller
5828e4c67c Merge pull request #894 from piotrantosik/patch-2
Fix typos - QueryBuilder
2014-01-03 09:23:48 -08:00
Piotr Antosik
eb45690e10 Fix typos - QueryBuilder 2014-01-03 17:28:42 +01:00
Adam Pancutt
352f5394e5 Removed FieldBuilder::unsigned() method as it is only supported by MySQL 2014-01-03 09:48:38 +00:00
Benjamin Eberlei
9a3cf77919 [DDC-2128] Fix PR according to comments. 2014-01-03 00:15:14 +01:00
catalin
93c018668d checking preg result. Should I raise an error
throw new ORMException("Error regular expression: " . $filter);
2014-01-03 00:15:14 +01:00
catalin
0d8f572661 added space after type cast (I could not find any rule in psr1/2 standard, but I modified in PhpStorm) 2014-01-03 00:15:14 +01:00
catalin
2326033e79 added preg_quote to $filter input 2014-01-03 00:15:13 +01:00
catalin
57e7559c1b - Applied Phpstorm PSR format
- Changed RegExp format
2014-01-03 00:15:13 +01:00
Catalinux
6963bf6028 Now MetaDataFilter takess also regexp. For example whern you want to
extract metadata if you would filter like this: --filter="Article"
would extract also for "ArticleItems" (article_items table). Now you
can use --filter="Article$" if you want only that table (articl)
2014-01-03 00:15:13 +01:00
Benjamin Eberlei
8118dddc6a Merge pull request #674 from TorbenBr/master
Shortcut for force
2014-01-02 15:02:46 -08:00
Benjamin Eberlei
0a2b5b8efd Merge pull request #734 from caponica/patch-1
Cleaned up documentation
2014-01-02 15:00:11 -08:00
Benjamin Eberlei
22d4d2e812 Merge branch 'DDC-2700' 2014-01-02 23:50:21 +01:00
Benjamin Eberlei
53ed898684 [DDC-2700] Add test and fix CS. 2014-01-02 23:50:15 +01:00
Benjamin Eberlei
2feffe164a Merge branch 'DDC-2732' 2014-01-02 23:33:56 +01:00
Benjamin Eberlei
b1e031a1b4 [DDC-2732] Add tests for XML id options fix. 2014-01-02 23:33:49 +01:00
Benjamin Eberlei
96ec3c1613 Merge pull request #830 from sandermarechal/sort-alias
[DDC-2764] Prefix criteria orderBy with rootAlias
2014-01-02 14:15:01 -08:00
Benjamin Eberlei
41581847b2 Merge pull request #833 from ronanguilloux/patch-console-entity-generator
Generate-Entities-Console-Command: Adding an 'avoid backup' flag
2014-01-02 14:13:27 -08:00
Benjamin Eberlei
e91ed74b25 [DDC-2775] cleanup test. 2014-01-02 23:11:35 +01:00
Benjamin Eberlei
17809abd29 Merge pull request #837 from mnapoli/DDC2775
DDC-2775 Tests and fix
2014-01-02 14:07:14 -08:00
Benjamin Eberlei
05576d3e1c Merge pull request #844 from terite/orm-validate-skip
Teach orm:validate-schema to --skip-mapping and --skip-sync
2014-01-02 14:00:22 -08:00
Benjamin Eberlei
ea84cfbdd1 Merge pull request #845 from flack/avoid-update-on-delete
Don't compute changeset for entities that are going to be deleted
2014-01-02 13:59:25 -08:00
Benjamin Eberlei
10576286b8 [DDC-2803] Fix error in documentation. 2014-01-02 22:54:46 +01:00
Benjamin Eberlei
7a4a46a95c [GH-855] fix CS 2014-01-02 22:50:36 +01:00
ptarjan
27c9074b71 don't rely on gc_collect_cycles for HHVM 2014-01-02 22:50:36 +01:00
Benjamin Eberlei
3a8aaea14a Merge pull request #794 from stefankleff/patch-1
Multiple invokation of listeners on PreFlush event
2014-01-02 13:16:21 -08:00
Benjamin Eberlei
a2cdc7a1c7 Merge pull request #893 from yktd26/master
autoGenerate arg from bool to int
2014-01-02 13:03:33 -08:00
yktd26
c9e06a6854 Format code 2013-12-31 12:25:14 +01:00
yktd26
bee74f898d autoGenerate arg from bool to int
For using all four modes of proxies generation, change the 4th arg of
ProxyFactory's constructor to integer
2013-12-31 11:58:36 +01:00
Guilherme Blanco
a7b9140d2f Merge pull request #890 from deeky666/DBAL-563
[DBAL-563] Add general IDENTITY generator type support for sequence emulating platforms
2013-12-30 21:34:20 -08:00
Benjamin Eberlei
58c57c50bf Merge pull request #891 from spolischook/patch-2
Allow to not generate extra use
2013-12-30 00:33:03 -08:00
Sergey Polischook
07f67c5d1a Allow to not generate extra use
For case when we not generate annotation (by default at doctrine orm:generate-entities) allow to not generate extra use for it - 
```php
use Doctrine\ORM\Mapping as ORM;
```
For example if generate entities for my project that use only dbal in pord but use orm for generate entities in dev mode.
2013-12-30 04:43:35 +02:00
Steve Müller
337857dc8a add general IDENTITY generator type support for sequence emulating platforms 2013-12-29 05:55:16 +01:00
Marco Pivetta
7360231b4b Merge pull request #888 from entering/docs-yaml-mapping-improve-example
Add an example to doc of YAML mapping
2013-12-25 14:12:38 -08:00
entering
2f0b4a5d81 Add an example to doc of YAML mapping 2013-12-25 22:11:15 +00:00
Matthieu Napoli
c9791fe97f Inlined the model for the DCC2775 test case inside the test class 2013-12-23 09:55:10 +01:00
Strate
c6810861ca Fix applying ON/WITH conditions to first join in Class Table Inheritance 2013-12-22 21:02:14 +04:00
Guilherme Blanco
5439a613d6 Merge pull request #884 from FabioBatSilva/slc-patch1
[SLC] Fix cache misses using one-to-one inverse side
2013-12-20 15:23:21 -08:00
fabios
cf4c805427 Fix cache misses using one-to-one inverse side 2013-12-20 15:37:07 -05:00
Guilherme Blanco
8554b04053 Merge pull request #883 from FabioBatSilva/hotfix-slc
[DDC-2862] Fix non initialized association proxy
2013-12-20 10:43:56 -08:00
fabios
22e3a76327 Fix non initialized association proxy 2013-12-20 10:39:03 -05:00
Benjamin Eberlei
f0546455d5 Remove left over ElementCollection code. 2013-12-20 15:01:10 +01:00
Guilherme Blanco
423ea00539 Merge pull request #590 from michaelperrin/feature/process-collection-value
DQL Query: process ArrayCollection values to ease development
2013-12-17 10:39:36 -08:00
Michaël Perrin
1032a16db2 Simpler way to handle Collection parameters in DQL queries (refs #DDC-2319) 2013-12-17 11:37:17 +01:00
Benjamin Eberlei
ad9366a1fc Merge pull request #871 from elmariachi111/patch-1
XCache cannot be flushed on the CLI -> for pretty much the same reason as APC
2013-12-16 15:47:09 -08:00
Benjamin Eberlei
48ea45fad0 Add note about experimental nature of SLC feature 2013-12-17 00:05:43 +01:00
Guilherme Blanco
b081e5681d Merge pull request #808 from FabioBatSilva/slc
Second level cache
2013-12-16 14:59:56 -08:00
fabios
4e0e1b8061 CS/Typo Fixes 2013-12-16 15:55:54 -05:00
fabios
0a66a2bc09 CS/Doc Fixes 2013-12-16 11:05:05 -05:00
fabios
71903c28a8 Region cache clear commands 2013-12-16 11:05:05 -05:00
fabios
fb98277783 Fix docs 2013-12-16 11:05:05 -05:00
fabios
d135e402bb handle update/delete queries 2013-12-16 11:05:05 -05:00
Fabio B. Silva
61bff7d5f6 Fix CS and update docs 2013-12-16 11:05:04 -05:00
Fabio B. Silva
1438a59c00 Fix persister query cache invalidation 2013-12-16 11:05:04 -05:00
fabios
1bfa8f0fc3 Extract cache config 2013-12-16 11:05:04 -05:00
Fabio B. Silva
3140593e9b Second level cache 2013-12-16 11:05:04 -05:00
Benjamin Eberlei
86ae6f18ab Merge branch 'DDC-2645' 2013-12-15 23:31:49 +01:00
Pouyan Savoli
a5b7069fd7 [DDC-2645] Apply patch to fix issue 2013-12-15 23:31:35 +01:00
Matthieu Napoli
602c3be3fc Cleaned up tests for DDC-2775 2013-12-14 19:57:53 +01:00
Aaron Muylaert
aa5df1dbac Create failing test for DDC-2645.
Merge not dealing correctly with composite primary keys.
2013-12-14 15:59:10 +01:00
Marco Pivetta
6f1642b35d Merge pull request #877 from aaronmu/DDC-1787
Hotfix for DDC-1787
2013-12-14 06:22:20 -08:00
Marco Pivetta
5fa1b10506 Merge pull request #832 from mnapoli/patch-4
Added "readOnly: true" to YAML reference
2013-12-14 05:41:27 -08:00
Marco Pivetta
bd4d27eabf Merge pull request #842 from TheFrozenFire/tests/query-tests
Added EntityManager query creation tests
2013-12-14 05:26:46 -08:00
Marco Pivetta
ce914bef3f Merge pull request #875 from doctrine/DDC-2844
Adding tests that confirm that DDC-2844 is fixed
2013-12-14 05:13:24 -08:00
Aaron Muylaert
3cc630798b Fix DDC-1787.
Credit goes to Jack van Galen for fixing this issue.
Fix for JoinedSubclassPersister, multiple inserts with versioning throws
an optimistic locking exception.
2013-12-14 13:50:46 +01:00
Marco Pivetta
d20b136270 Adding tests to verify that dql aliases in criteria are correctly converted 2013-12-14 13:42:18 +01:00
Marco Pivetta
72e6de9417 Adding tests that confirm that DDC-2844 is fixed 2013-12-14 13:42:18 +01:00
Aaron Muylaert
600af3e617 Add failing test for DDC-1787.
Using joined table inheritance, when persisting multiple new entities
that are subclasses of a baseclass that has the @Version attribute set,
only the last persisted entity will have it's version set.
2013-12-14 13:24:47 +01:00
Marco Pivetta
8a38534be4 Merge pull request #876 from doctrine/hotfix/hhvm-allow-failures
Fixing wrong key for allowing HHVM failures
2013-12-14 04:22:59 -08:00
Marco Pivetta
940c1f3b1c Fixing wrong key for allowing HHVM failures 2013-12-14 12:40:59 +01:00
Benjamin Eberlei
4ed96e2ab6 Update CONTRIBUTING.md 2013-12-14 11:29:07 +01:00
Benjamin Eberlei
d820c25eda Merge branch 'GH-873' 2013-12-13 22:13:37 +01:00
Benjamin Eberlei
40f9facfd1 Add allowed failures for HHVM. 2013-12-13 22:13:28 +01:00
Paul Tarjan
b6a0c8b1ad Try running unit tests on HHVM 2013-12-13 11:43:53 -08:00
Benjamin Eberlei
94a3e6c42b Add missing LICENSE of documentation 2013-12-12 00:30:15 +01:00
Marco Pivetta
b461c9cf23 Merge pull request #872 from matheo/patch-1
Doctrine 2.4 now supports SQLite ALTER TABLE
2013-12-10 21:08:22 -08:00
Mateo Tibaquirá Palacios
3669321161 Doctrine 2.4 now supports SQLite ALTER TABLE 2013-12-11 00:07:07 -05:00
Stefan A
eded05d415 XCache cannot be cleared on CLI (like APC) 2013-12-10 19:51:41 +01:00
Stefan A
88a56ee8f8 XCache cannot be cleared on CLI (like APC) 2013-12-10 19:51:02 +01:00
Stefan A
53fbb0b2d1 XCache cannot be cleared on CLI (like APC) 2013-12-10 19:48:30 +01:00
Marco Pivetta
2cccb3cc62 Merge pull request #870 from lcobucci/master
Documenting interface methods (based on entity manager)
2013-12-10 06:36:44 -08:00
Luís Otávio Cobucci Oblonczyk
6d58824ac5 Use docblox from EntityManagerInterface 2013-12-10 12:09:36 -02:00
Luís Otávio Cobucci Oblonczyk
67135e5d6f Fixing FQCN on docblox 2013-12-10 12:08:53 -02:00
Luís Otávio Cobucci Oblonczyk
877ba9bf17 Documenting interface methods (based on entity manager) 2013-12-10 11:18:27 -02:00
Johannes
f7f7c460f2 Merge pull request #1 from jankramer/ValueObjects
Update xml mapping driver and schema to work with embeddables
2013-12-07 08:44:09 -08:00
Jan Kramer
fbb7b5ad8e Fix XmlDriver to accept embeddables 2013-12-07 16:40:54 +01:00
Jan Kramer
928c32d616 Update XML schema to reflect addition of embeddables 2013-12-07 16:38:32 +01:00
Guilherme Blanco
90a0d29b2b Merge pull request #868 from mnapoli/patch-1
Added documentation section for Memcached
2013-12-02 07:00:40 -08:00
Matthieu Napoli
38c59ce5a4 Added documentation section for Memcached 2013-12-02 14:59:04 +01:00
Marco Pivetta
3caf1fdfa6 Merge pull request #866 from bountin/doc_refresh
Mentioning the 'refresh' cascading property in the documentation list
2013-12-01 14:07:21 -08:00
Martin Prebio
2828d7b5cd Mentioning the 'refresh' cascading property in the documentation list 2013-12-01 22:43:06 +01:00
Johannes M. Schmitt
e5cab1db2d adds embedded classes to cache 2013-11-28 17:32:47 +01:00
Marco Pivetta
606ae2e03d Merge pull request #862 from stof/patch-2
Added a note about changing the fetch mode for to-many relations
2013-11-26 05:22:39 -08:00
Christophe Coevoet
dfbf996a50 Added a note about changing the fetch mode for to-many relations 2013-11-26 14:20:51 +01:00
Guilherme Blanco
0e3c57dbd3 Merge pull request #849 from bsahlhof/master
Error with Same Field, Multiple Values, Criteria and QueryBuilder
2013-11-25 21:20:14 -08:00
Guilherme Blanco
d63820755d Merge pull request #860 from deeky666/add-sql-anywhere-documentation
Mention SQL Anywhere in basic mapping documentation
2013-11-25 09:44:04 -08:00
Steve Müller
45118a2811 mention SQL Anywhere in basic mapping docs 2013-11-25 18:24:54 +01:00
Guilherme Blanco
c460344994 Merge pull request #850 from FabioBatSilva/attach-entity-listeners
Event listener to programmatically attach entity listeners.
2013-11-25 08:21:36 -08:00
Johannes M. Schmitt
8ae48ad9db lifts an unnecessary restriction on ResultSetMappingBuilder 2013-11-23 19:47:56 +01:00
Steve Müller
75d7ac2783 Merge pull request #854 from ptarjan/master
fix relative path to doctrine/common
2013-11-23 05:14:44 -08:00
Marco Pivetta
642d6e3033 Merge pull request #856 from ptarjan/reference_proxy_test
Fix dependency for tests/Doctrine/Tests/ORM/Functional/ReferenceProxyTest.php
2013-11-22 05:34:41 -08:00
ptarjan
1fe8ff756e Fix dependency for tests/Doctrine/Tests/ORM/Functional/ReferenceProxyTest.php 2013-11-22 01:15:13 -08:00
ptarjan
a8ad9069c9 fix relative path to doctrine/common 2013-11-21 20:38:39 -08:00
fabios
9e3ad91225 Version 2.5.0-DEV 2013-11-19 11:50:43 -05:00
Guilherme Blanco
0fe6d75211 Merge pull request #851 from naitsirch/doc/instance_of
Documentation about how to use INSTANCE OF in inheritance
2013-11-19 08:12:29 -08:00
Brad Sahlhoff
96fb0d7e14 Changed logic to allow joining games, and becoming friends
Added Spacing
2013-11-19 11:09:23 -05:00
Christian Stoller
393b3d37f5 Documentation about how to use INSANCE OF in inheritance 2013-11-19 09:18:33 +01:00
fabios
e69cd37226 Event listener to programmatically attach entity listeners. 2013-11-18 15:03:00 -05:00
Brad Sahlhoff
c2997b3961 Add ability to test same parameter name for multiple values. 2013-11-18 10:36:46 -05:00
flack
3d12920cd4 Add note about changed behaviour 2013-11-17 12:06:47 +01:00
flack
88ae5883f3 Add testcase 2013-11-17 11:51:09 +01:00
flack
ffd858b238 Merge remote-tracking branch 'upstream/master' into avoid-update-on-delete 2013-11-17 11:36:06 +01:00
flack
9807718100 Also skip entities scheduled for deletion when committing multiple entities 2013-11-17 11:31:21 +01:00
Fabio B. Silva
3529cd4282 Merge pull request #797 from peterkokot/patch-1
CS fixes
2013-11-16 10:52:09 -08:00
Benjamin Eberlei
2925fea7bd Make tests forward compatible with DBAL 2.5 2013-11-14 12:36:52 +01:00
Johannes M. Schmitt
0ee7b688c3 small fix 2013-11-13 00:07:20 +01:00
Johannes M. Schmitt
2a73a6f1f7 some cs fixes 2013-11-13 00:05:55 +01:00
Johannes M. Schmitt
fb3a06b9e7 adds support for XML/Yaml drivers 2013-11-13 00:03:21 +01:00
Johannes M. Schmitt
9ad376c006 adds docs 2013-11-12 23:49:25 +01:00
Benjamin Eberlei
6cdd65762f Add 2.4 branch [ci skip] 2013-11-12 13:37:20 +01:00
David Stensland
e6be52af3a Teach orm:validate-schema to --skip-mapping and --skip-sync
Use --skip-mapping to not check if the current mapping informaiton
is valid or not.

Use --skip-sync to not check if the database schema is in line with
the current schema mapping.
2013-11-11 18:12:28 -05:00
flack
9016a5a854 don't compute changeset for entities that are going to be deleted 2013-11-12 00:11:50 +01:00
Benjamin Eberlei
0edf2bc585 Add missing link to batch processing chapter 2013-11-07 16:43:36 +01:00
Justin Martin
8b4b8e7268 Test EntityManager::createNamedQuery.
Test EntityManager::createNamedNativeQuery.
2013-11-06 20:07:48 -08:00
Marco Pivetta
141213915e Merge pull request #838 from flack/patch-2
Spelling fix
2013-11-04 10:21:49 -08:00
Marco Pivetta
271f952c4a Merge pull request #839 from flack/patch-3
Spelling fix
2013-11-04 10:20:12 -08:00
flack
8ad6853e84 Spelling fix 2013-11-04 19:17:04 +01:00
flack
dc476b62d1 Spelling fix 2013-11-04 19:16:04 +01:00
Guilherme Blanco
c7d4077219 Merge pull request #834 from carlosbuenosvinos/patch-1
Add example use of repositoryClass in YAML
2013-11-04 07:46:42 -08:00
Guilherme Blanco
f3b8fe5255 Merge pull request #836 from Dragonrun1/master
Update annotations-reference.rst
2013-11-04 07:05:16 -08:00
Matthieu Napoli
1899bcf000 Fixed tests failing in pgsql because of used of a reserved keyword 2013-11-04 16:01:05 +01:00
Matthieu Napoli
791ec3bc6e Fixed tests for pgsql: was using reserved keyword as table name 2013-11-04 12:53:18 +01:00
Matthieu Napoli
e018bb83f0 [DDC-2775] Bugfix 2013-11-04 12:42:23 +01:00
Matthieu Napoli
8bd54be4ec [DDC-2775] Tests reproducing DDC-2775 2013-11-04 12:40:51 +01:00
Michael Cummings
01dc0e8273 Update annotations-reference.rst
@JoinTable because of mapping defaults does NOT have required attributes. Updated annotations reference to show them as optional.
2013-11-03 09:20:15 -08:00
Johannes M. Schmitt
17e0a7b2f8 makes column prefix configurable 2013-11-02 14:07:14 +01:00
Johannes M. Schmitt
2b2f4894cb fixes declaring class 2013-11-02 13:55:19 +01:00
Johannes M. Schmitt
0cd6061fc2 fixes a bad merge 2013-11-02 13:35:41 +01:00
Johannes M. Schmitt
5586ddd6b7 removes restrictions on constructors of embedded objects 2013-11-02 13:31:44 +01:00
Johannes M. Schmitt
ece62d6ad7 adds support & tests for embeddables in inheritance schemes 2013-11-02 13:23:56 +01:00
Johannes M. Schmitt
d4e6618b28 Merge remote-tracking branch 'schmittjoh/ValueObjects' 2013-11-02 11:20:44 +01:00
Johannes M. Schmitt
97836ef8c6 some consistency fixes 2013-11-01 22:37:59 +01:00
Johannes M. Schmitt
f86abd81dd fixes annotation context 2013-11-01 22:33:59 +01:00
Johannes M. Schmitt
4f6c15099a fixes coding style 2013-11-01 21:47:56 +01:00
Johannes M. Schmitt
20fb8270dc make use of NamingStrategy for columns of embedded fields 2013-11-01 21:44:57 +01:00
Johannes M. Schmitt
fd8b5bd045 removes outdated todos 2013-11-01 21:16:02 +01:00
Johannes M. Schmitt
41c937b983 adds test for non-existent field 2013-11-01 20:54:45 +01:00
Johannes M. Schmitt
30897c3115 adds tests for update/delete DQL queries 2013-11-01 20:46:08 +01:00
Johannes M. Schmitt
c67ac8a11b adds support for selecting based on embedded fields 2013-11-01 20:38:19 +01:00
Johannes M. Schmitt
38b041d909 Merge remote-tracking branch 'origin/ValueObjects'
Conflicts:
	lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php
2013-11-01 20:17:43 +01:00
Sander Marechal
35a62e9a05 Add rootAlias to Criteria where clauses 2013-11-01 13:43:03 +01:00
Sander Marechal
202039e853 Set rootAlias outside loop 2013-11-01 13:19:33 +01:00
Carlos Buenosvinos
6eac308ca3 Add example use of repositoryClass in YAML 2013-11-01 12:11:01 +01:00
Ronan Guilloux
48d078a856 no-backup instead of nobackup 2013-10-31 12:25:43 +01:00
Ronan Guilloux
5c01e8e99e Generate-Entities-Console-Command: Adding an 'avoid creating backup files' flag 2013-10-31 12:00:32 +01:00
Matthieu Napoli
f3f9fe9daa Added "readOnly: true" to YAML reference
The readOnly configuration is documented nowhere except in the annotations reference.

I added it to the example, for a lack of a better place. But at least it will be documented somewhere.

Can you also confirm that this is correct? I'm starting to use it, and I can't find a way to have doctrine validate it is really working. Even with the metadata validation tool, it won't raise an error if I put an invalid entry (`readOnlyFOOBAR: true`) or an invalid value (`readOnly: FOOBAR`), so I'm kind of blind here.
2013-10-31 10:50:44 +01:00
Sander Marechal
b6f8d53ff1 [DDC-2764] Prefix criteria orderBy with rootAlias 2013-10-29 11:11:46 +01:00
Benjamin Eberlei
514dd4e852 [DDC-2757] Update documentation with regard to manually closing the EntityManager when an Exception occurs. 2013-10-26 12:32:53 +02:00
Benjamin Eberlei
cedcac225f Merge branch 'DDC-2759' 2013-10-26 11:16:21 +02:00
Benjamin Eberlei
9a3298347c [DDC-2759] Fix regression in ArrayHydrator introduced in DDC-1884 at SHA c7b4c9bf0f 2013-10-26 11:16:07 +02:00
Chris Collins
7249804e3f Added a failing test case for DDC-2759. 2013-10-24 13:02:42 +01:00
Marco Pivetta
b7cb1e98ee Merge pull request #825 from flack/patch-1
Spelling fix
2013-10-23 02:32:45 -07:00
flack
195b1169ae Spelling fix 2013-10-23 11:32:04 +02:00
Marco Pivetta
0a31ecb283 Merge pull request #824 from brikou/patch-3
s/PostgreSQLPlatform/PostgreSqlPlatform/
2013-10-21 00:45:51 -07:00
Brikou CARRE
84b980227f s/PostgreSQLPlatform/PostgreSqlPlatform/ 2013-10-21 09:44:48 +02:00
Marco Pivetta
a96fe8770c Merge pull request #815 from nicolas-bastien/patch-2
Remove unused use statement
2013-10-18 03:46:09 -07:00
Marco Pivetta
d2e731174c Merge pull request #821 from mnapoli/patch-4
Fixed documentation rendering
2013-10-17 07:18:12 -07:00
Matthieu Napoli
a90311cb44 Fixed documentation rendering
The 2 lists I've fixed render as citation in the docs: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/index.html

If I didn't make any mistake, now they should render as simple lists.
2013-10-17 15:53:45 +02:00
Marco Pivetta
1e10fca66a Merge pull request #818 from mfdj/master
Clarified tutorial context in section introducing `orm:scehma-tool:*` commands
2013-10-16 17:23:09 -07:00
Adam Pancutt
553086ae3d Removed check for instantiated options array 2013-10-15 13:17:07 +01:00
Adam Pancutt
db5274113a Code style fix 2013-10-15 12:49:34 +01:00
Adam Pancutt
25342b706d Added support for field options to FieldBuilder 2013-10-15 12:37:06 +01:00
Guilherme Blanco
95ad926c95 Merge pull request #819 from vbourdeix/master
Fixes a Fatal Error when using a subexpression in parenthesis
2013-10-14 11:01:51 -07:00
Vincent BOURDEIX
5506d7adce Fixes a Fatal Error when using a subexpression in parenthesis
When some dql contains a subselect with expression in parenthesis, the
expression of the $simpleSelectExpression parameter given to
walkSimpleSelectExpression is an instance of AST\ParenthesisExpression.
Before this commit, this case defaulted to
$this->walkEntityIdentificationVariable($expr) where $expr is supposed
to be a string. A fatal error was then yielded.
2013-10-14 15:04:52 +02:00
Guilherme Blanco
0d58e82b76 Merge pull request #817 from mfdj/patch-1
Removed "minimum-stability" : "dev" from composer.json
2013-10-11 19:34:57 -07:00
Mark Fox
2f8b0801cc further tweaking of last commit pt.2 2013-10-11 15:22:39 -07:00
Mark Fox
126cd0bac2 further tweaking of last commit 2013-10-11 15:20:53 -07:00
Mark Fox
c5adfca0ed Clarified tutorial context around introduction of orm:schema-tool:* commands
See: http://stackoverflow.com/questions/17473225/doctrine2-no-metadata-classes-to-process for evidence of this confusion
2013-10-11 15:16:46 -07:00
Mark Fox
006dac13a9 Removed "minimum-stability" : "dev" from composer.json 2013-10-11 14:34:49 -07:00
Guilherme Blanco
bb63058410 Merge pull request #780 from terite/DDC-2655
[DDC-2655] Don't let getOneOrNullResult throw NoResultException
2013-10-11 13:43:27 -07:00
Guilherme Blanco
be81b46d8e Merge pull request #791 from myclabs/CriteriaContains
Implemented "contains" operator for Criteria expressions
2013-10-11 06:33:40 -07:00
Eduardo
333177da00 Options not respected for ID Fields in XML Mapping Driver (XSD update)
XSD update.

The same bug of the yaml driver: see http://www.doctrine-project.org/jira/browse/DDC-2661
2013-10-09 23:49:39 +02:00
Eduardo
aabb34f853 Options not respected for ID Fields in XML Mapping Driver
Same bug of the YAML driver, see: http://www.doctrine-project.org/jira/browse/DDC-2661
2013-10-09 22:40:29 +02:00
David Stensland
089006927e [DDC-2655] Don't let getOneOrNullResult throw NoResultException 2013-10-09 11:38:33 -04:00
Guilherme Blanco
ded3d20630 Merge pull request #787 from flip111/patch-1
Update DDC719Test.php to be compatible with MsSQL
2013-10-07 11:22:14 -07:00
Nicolas Bastien
33ddb9c0ca Remove unused use statement 2013-10-07 15:58:41 +02:00
Guilherme Blanco
3f883d57a6 Merge pull request #811 from flip111/patch-6
Update SingleScalarHydrator error message
2013-10-02 06:07:59 -07:00
flip111
62ae8dc81e Update SingleScalarHydrator error message
bummed into this one. Now more developer friendly :)
2013-10-02 14:12:35 +02:00
Benjamin Eberlei
fc53bc8909 Fix some LGPL occurances to MIT 2013-10-02 12:07:37 +02:00
Guilherme Blanco
2021d12df8 Merge pull request #809 from FabioBatSilva/DDC-1514
Fix DDC-1514 test
2013-10-01 22:02:22 -07:00
fabios
dd4bdd776a Fix DDC-1514 test 2013-10-01 12:00:52 -04:00
flip111
4282fa4787 Used ternary operator to reduce LOC 2013-10-01 17:25:49 +02:00
Guilherme Blanco
2c4c26c5d6 Merge pull request #801 from flip111/patch-4
Update SqlWalker.php fixed wrong GROUP BY clause on SQL Server platform
2013-10-01 08:21:20 -07:00
flip111
228a501014 Made the code prettier :) 2013-10-01 16:53:53 +02:00
Guilherme Blanco
4051d0da86 Merge pull request #807 from janbster/fix-optimisticlock
Fix for OptimisticLockingException
2013-10-01 07:41:57 -07:00
jan brunnert
f64d6695ce Removed unnecessary is_object() check 2013-10-01 13:00:37 +02:00
Guilherme Blanco
0e8e5c9ba5 Merge pull request #788 from flip111/patch-3
Update DatabaseDriverTest.php
2013-09-30 11:08:41 -07:00
Guilherme Blanco
d8335eee7b Merge pull request #793 from flip111/patch-2
Improved error messages in Paginator: LimitSubqueryOutputWalker
2013-09-30 11:07:49 -07:00
Guilherme Blanco
f02d18f465 Merge pull request #804 from diego-mazzaro/master
[bugfix] if BIGINT or SMALLINT version field was not incremented.
2013-09-30 07:46:35 -07:00
jan brunnert
a4e3921090 When the OptimisticLockingException is generated with the static function lockFailedVersionMismatch and the passed parameters are DateTime instances, the exception could not be thrown because the DateTime object is not implicitly converted to a string. 2013-09-30 11:32:46 +02:00
flip111
72ae7f5497 Changed GroupBy alias to real column name for all platforms and adjusted failing test accordingly. Has fallback in cases where real column name is not possible (example: Doctrine\Tests\ORM\Query\SelectSqlGenerationTest::testGroupBySupportsIdentificationVariable) 2013-09-30 11:08:42 +02:00
Diego Mazzaro
bd0e0c3fcf [bugfix] if BIGINT or SMALLINT version field was not incremented.
Made version field accepted type coherent between ClassMetadataInfo and BasicEntityPersister
2013-09-29 16:17:10 +02:00
Marco Pivetta
1414cc315e Merge pull request #803 from cleentfaar/patch-1
Appended newline to (newly) generated files for PSR2 compatibility
2013-09-28 10:46:09 -07:00
Cas
1fda797c8f Appended newline to (newly) generated files for PSR2 compatibility
Appended newline to (newly) generated files for PSR2 compatibility
Additionally, slightly improved styling of concatenating return value
2013-09-28 17:47:35 +02:00
Benjamin Eberlei
008187982d Merge pull request #792 from FabioBatSilva/DDC-2668
[DDC-2668] Fix trim leading zero string
2013-09-26 14:23:07 -07:00
Benjamin Eberlei
b7cffbde37 Merge pull request #802 from fasmide/patch-1
Respect unsigned fields when tables get converted to entities.
2013-09-26 14:12:24 -07:00
Kristian Mide
0326731348 Respect unsigned fields when tables get converted to entities.
This is working on our mysql setup, however i have no idea of the consequences of this change when using other RDBMSes.
2013-09-26 14:41:06 +02:00
flip111
76fda9562c Update SqlWalker.php fixed wrong GROUP BY clause on SQL Server platform
Without this patch a query would like like:
```
SELECT c0_.Country AS sclr0
FROM Continent c0_ WITH (NOLOCK)
WHERE c0_.Country = 38
GROUP BY sclr0
```
Using the column alias in the GROUP BY clause. However this is not allowed on SQL Server. References:
1. http://stackoverflow.com/a/3841804
2. http://technet.microsoft.com/en-us/library/ms189499.aspx (Logical Processing Order of the SELECT statement)

The correct query should be:
```
SELECT c0_.Country AS sclr0
FROM Continent c0_ WITH (NOLOCK)
WHERE c0_.Country = 38
GROUP BY c0_.Country
```
2013-09-26 14:11:56 +02:00
Guilherme Blanco
bd7c7ebaf3 Merge pull request #799 from FabioBatSilva/leftover-test
remove unused test case
2013-09-23 18:10:22 -07:00
Fabio B. Silva
614eed7f86 remove unused test case 2013-09-23 19:29:50 -04:00
Alex Pogodin
a75d73b889 Identifier can be empty for MappedSuperclasses
When MappedSuperclass is inspected without identifier column been assigned, always return false. Solves "Undefined offset" notice.
2013-09-22 17:19:51 +03:00
Peter Kokot
dca09148ca CS fixes 2013-09-22 02:12:30 +02:00
Marco Pivetta
2089df36e3 Merge pull request #795 from sabzeta/patch-1
Update query-builder.rst
2013-09-20 11:05:38 -07:00
sabzeta
a419c7c93b Update query-builder.rst
expresion substr changed to substring as of
http://www.doctrine-project.org/jira/browse/DDC-382
2013-09-20 15:27:05 +03:00
Stefan Kleff
adf2b7cce7 Listener class prefix 2013-09-20 09:20:58 +02:00
Stefan Kleff
619c6a03ce removed unused use statements, fixed typo and group tag 2013-09-19 15:16:51 +02:00
Stefan Kleff
d4a08f7ab7 Added unit test 2013-09-19 14:16:33 +02:00
Stefan Kleff
1ec5632a18 Multiple invokation of listeners on PreFlush event
Only lifecycle callbacks and entity listeners should be triggered here. The preFlush listener event is already triggered at the beginning of commit()
2013-09-19 12:13:12 +02:00
flip111
a18aba1bb6 Improved error messages in Paginator: LimitSubqueryOutputWalker
The already existing follow-up check throwing "Not all identifier properties can be found in the ResultSetMapping: %s" is a much more technical description.

If $sqlIdentifier is empty (count 0) it can be concluded that there are no mapped results. An alternative error message could thus be "The Paginator does not support queries without mapped results." (line 153).

Possibly '!=' on line 154 could be replaced by '>' because i think this is the only situation that can occur. But since i don't know this for sure, i left it like i found it.

Didn't use elseif in this commit as per Stof his suggestion.
2013-09-17 21:01:09 +02:00
flip111
b803f06c8f Improved error messages in Paginator: LimitSubqueryOutputWalker
The already existing follow-up check throwing "Not all identifier properties can be found in the ResultSetMapping: %s" is a much more technical description.

If $sqlIdentifier is empty (count 0) it can be concluded that there are no mapped results. An alternative error message could thus be "The Paginator does not support queries without mapped results." (line 153).

Possibly '!=' on line 154 could be replaced by '>' because i think this is the only situation that can occur. But since i don't know this for sure, i left it like i found it.
2013-09-17 15:07:08 +02:00
Fabio B. Silva
689da2f36b [DDC-2668] Fix trim leading zero string 2013-09-16 21:36:19 -04:00
Matthieu Napoli
6f538c509c Implemented "contains" operator for Criteria expressions 2013-09-16 14:56:04 +02:00
Benjamin Eberlei
fe78977973 Merge pull request #790 from javer/hhvm-func_get_args
HHVM compatibility: func_get_args
2013-09-15 11:05:01 -07:00
javer
64a0161935 HHVM compatibility: func_get_args
All func_get_args() calls have been moved to the top of the methods
because HHVM doesn't keep a copy of the original args for performance
reasons.

See facebook/hiphop-php#1027 for details.
2013-09-15 20:57:30 +03:00
flip111
67dd32d9fb A nicer way of detecting the platform
Inspired by https://github.com/doctrine/doctrine2/blob/master/tests/Doctrine/Tests/ORM/Functional/DatabaseDriverTest.php#L188
2013-09-13 16:35:34 +02:00
flip111
e49a673a01 Update DatabaseDriverTest.php
SQL Server does not support unsigned integers
2013-09-13 16:29:31 +02:00
flip111
a190dad0b1 Update DDC719Test.php to be compatible with MsSQL
Apparently Doctrine adds "with (nolock)" now for the mssql platform, but the test has not been updated yet.
2013-09-13 15:11:35 +02:00
Marco Pivetta
c72698a997 Merge pull request #786 from weaverryan/patch-1
Minor updates while reading the basic-mapping page
2013-09-12 19:11:37 -07:00
Ryan Weaver
1fcef3321e Changes thanks to @Ocramius 2013-09-12 20:52:12 -05:00
Ryan Weaver
36d7d60c3b Minor updates while reading the basic-mapping page
The only arguable changes involve a few spots where I either removed something I thought was too technical and not valuable (e.g. talking about the metadata mapping pattern).
2013-09-12 17:08:48 -05:00
Benjamin Eberlei
067ed7b1c6 Fix master dependening on DBAL 2.5-dev 2013-09-12 08:00:08 +02:00
Benjamin Eberlei
b6e624b6bf Delete some very old, leftover code. 2013-09-11 22:43:38 +02:00
Marco Pivetta
237c1e24e6 Merge pull request #785 from Hawkeye0203/patch-1
Update dql-custom-walkers.rst
2013-09-11 07:32:58 -07:00
Daniel VanMullen
ef722066e3 Update dql-custom-walkers.rst
Fixed typo of "customer" to "custom"
2013-09-11 09:25:52 -04:00
Marco Pivetta
bb7f18ced7 Merge pull request #784 from eventhorizonpl/fix_docs
fix documentation warnings p1
2013-09-10 15:54:40 -07:00
Michal Piotrowski
bc37ceb58b fix warnings p1
fix warnings p2

fix warnings p3

fix warnings p4
2013-09-10 23:57:41 +02:00
Benjamin Eberlei
9983fcbac3 Fix some more details in basic-mapping.rst 2013-09-10 23:15:43 +02:00
Benjamin Eberlei
a948cb49b8 Small fixes in basic-mapping.rst 2013-09-10 22:36:03 +02:00
Benjamin Eberlei
546c817f64 Move Custom Mapping Types into cookbook, restructure the chapter more. 2013-09-10 22:09:22 +02:00
Benjamin Eberlei
caf6ba65e8 Refactor Basic Mapping chapter to focus on the actual topic more. Rearrange apperance of topics. Introduce a sane example entity as example. 2013-09-10 22:09:22 +02:00
Benjamin Eberlei
f7108b40c3 Move Annotations introduction to the reference. 2013-09-10 22:09:22 +02:00
Marco Pivetta
4d51a0290b Merge pull request #782 from mnapoli/patch-4
#DDC-2664 Document new Proxy factory flags usage as of DCOM-210
2013-09-09 03:35:17 -07:00
Marco Pivetta
0d246f7e9e Merge pull request #783 from mnapoli/DDC-2664
#DDC-2664 Improving and fixing documentation for new Proxy factory flags usage as of DCOM-210
2013-09-09 03:13:56 -07:00
Matthieu Napoli
8875462241 #DDC-2664 Improving and fixing documentation for new Proxy factory flags usage as of DCOM-210 2013-09-09 11:30:18 +02:00
Matthieu Napoli
26e1ac6afd #DDC-2664 Improving and fixing documentation for new Proxy factory flags usage as of DCOM-210 2013-09-09 11:20:12 +02:00
Matthieu Napoli
4a0a4094da #DDC-2664 Document new Proxy factory flags usage as of DCOM-210
[Document new Proxy factory flags usage as of DCOM-210](http://www.doctrine-project.org/jira/browse/DDC-2664)
2013-09-09 10:49:37 +02:00
Marco Pivetta
87d2ff8665 Merge pull request #781 from shieldo/patch-2
fixed English grammar
2013-09-08 13:47:39 -07:00
Douglas Greenshields
85f227372d fixed English grammar 2013-09-08 21:40:35 +01:00
Benjamin Eberlei
4a50493ab7 [DDC-2608][DDC-2662] Fix SequenceGenerator requiring "sequenceName" and now throw exception. Fix a bug in quoting the sequenceName. 2013-09-08 15:59:58 +02:00
Benjamin Eberlei
c6760e0375 Merge pull request #762 from naitsirch/yaml_reference_ext
YAML mapping documentation of uniqueConstraint
2013-09-08 06:22:42 -07:00
Benjamin Eberlei
3770019e0b Merge branch 'DDC-2660' 2013-09-08 14:39:10 +02:00
Benjamin Eberlei
5c2157219d [DDC-2660] Fix error with NativeSQL, ResultSetMappingBuilder and Associations as Primary Key. 2013-09-08 14:38:59 +02:00
Benjamin Eberlei
f2fa47dedb Fix RST bug 2013-09-08 13:04:08 +02:00
Benjamin Eberlei
275724fb46 Add missing documentation for 2.4 features 2013-09-08 12:13:47 +02:00
Benjamin Eberlei
6fcc091f88 Merge branch 'DDC-2661' 2013-09-08 10:37:23 +02:00
Benjamin Eberlei
3719a6f2f2 [DDC-2661] Fix bug in YamlDriver not passing options from id to mapField() 2013-09-08 10:37:13 +02:00
Benjamin Eberlei
fab3f5e146 More excludes 2013-09-07 18:27:27 +02:00
Benjamin Eberlei
90c89b3881 Travis should prefer dist. 2013-09-07 13:21:02 +02:00
Benjamin Eberlei
6139a61ff0 New Build process
- Switch from Phing to Ant
- Remove PEAR packaging
- Add Composer archiving
2013-09-07 12:56:49 +02:00
Benjamin Eberlei
490b501679 Fix tests running against Oracle not comparing SQL case-insenstive 2013-09-07 08:52:50 +02:00
Guilherme Blanco
da7146c4d5 Merge pull request #779 from Blazinn/patch-4
Fixed grammar in custom data types
2013-09-05 07:31:19 -07:00
Guilherme Blanco
7ed22819b5 Merge pull request #778 from Blazinn/patch-3
Fixed typo in property mapping
2013-09-05 07:29:43 -07:00
Nick Hazen
e808865e6f Fixed grammar in custom data types
Changed 'are apply' to 'are applied'
2013-09-05 10:09:53 -04:00
Nick Hazen
1d247fbeaa Fixed typo in property mapping
Changed 'pecify' to 'specify' line # 246
2013-09-05 09:48:00 -04:00
Guilherme Blanco
0a07207f59 Merge pull request #777 from Blazinn/patch-2
Fixed typo in mapping documentation
2013-09-05 06:43:28 -07:00
Nick Hazen
982840ac3c Fixed typo in mapping documentation
"Classthat" to "Class that" line #69
2013-09-05 09:32:36 -04:00
Marco Pivetta
0a9ff77303 Merge pull request #775 from Blazinn/patch-1
Update create bug script
2013-09-04 15:18:36 -07:00
Nick Hazen
528fe40839 Update create bug script
This script is using the first argument twice and ignoring the second argument completely.
2013-09-04 16:55:06 -04:00
Benjamin Eberlei
340ae15ba7 Merge branch 'Docs' 2013-09-01 19:04:22 +02:00
Benjamin Eberlei
c603fe7ab9 Simplify Working with Associations a little 2013-08-31 16:38:00 +02:00
Benjamin Eberlei
aa369b4212 Cleanup Association Mapping chapter 2013-08-31 16:25:53 +02:00
Benjamin Eberlei
cf2580d284 Cleanup of Configuration and Mapping reference chapters. 2013-08-31 15:46:10 +02:00
Guilherme Blanco
6f025f78ec Merge pull request #772 from pine3ree/patch-1
DO NOT OVERRIDE CUSTOM TREE WALKERS IN getIterator()
2013-08-29 07:27:35 -07:00
Maks Feltrin
f98dfc4758 DO NOT OVERRIDE CUSTOM TREE WALKERS IN getIterator() 2013-08-29 08:36:39 +02:00
Guilherme Blanco
fc7719d5fa Merge pull request #771 from caponica/cqb-indexby
Added indexBy option to createQueryBuilder
2013-08-28 20:15:55 -07:00
Christian Morgan
b0513a7517 Added indexBy option to createQueryBuilder
Added way to access the underlying QueryBuilder#from() method's 'indexBy' parameter when using EntityRepository#createQueryBuilder()
2013-08-28 22:35:29 +01:00
Guilherme Blanco
78c3016f95 Merge pull request #770 from fulopattila122/master
Fix for entity generator discriminator column
2013-08-28 09:15:08 -07:00
Attila Fulop
5669aaf4a3 Fix for entity generator discriminator column 2013-08-28 18:26:16 +03:00
Marco Pivetta
f634ba343c Merge pull request #759 from mfdj/patch-1
Fixed out of sync code examples in getting-started.rst
2013-08-25 07:23:20 -07:00
Marco Pivetta
e2a67c2f1c Merge pull request #742 from caponica/patch-2
Cleaned up events.rst
2013-08-25 07:10:26 -07:00
Guilherme Blanco
c399c77dbe Merge pull request #767 from doctrine/DDC-2627
Fixing missing table aliases when using Many2Many persister.
2013-08-21 20:56:18 -07:00
Guilherme Blanco
09d51f9df5 Fixing missing table aliases when using Many2Many persister. 2013-08-21 23:39:40 -04:00
Guilherme Blanco
44f9952063 Merge pull request #763 from Padam87/entgenparenttrait
Entity generator - trait in parent class
2013-08-20 05:38:02 -07:00
Adam Prager
b041c22814 Entity generator - trait in parent class 2013-08-20 12:15:17 +02:00
Christian Stoller
a765f2e3b6 added yaml mapping documentation of uniqueConstraint 2013-08-20 11:17:04 +02:00
Guilherme Blanco
cc83ac6ce8 Centralize InputParameter SQL generation. 2013-08-19 00:33:45 -04:00
Guilherme Blanco
43fc8bafa7 DDC-1858 Added missing support to ResultVariable in LikeExpression. 2013-08-18 23:52:32 -04:00
Mark Fox
29366bb9c7 Updated require version and my earlier errors dissolved
As stated, the tutorial was written for 2.4.x, but the composer.json settings proffered would install 2.3.4, which has a different enough API that basic parts of the tutorial code would fail.
2013-08-17 21:15:03 -07:00
Mark Fox
c89258a0ea fixed spelling mistake "bootsrapped" 2013-08-17 14:25:37 -07:00
Mark Fox
3405659eba Update getting-started.rst
The inline cli-config.php, bootstrap.php examples were out of sync with Doctrine 2.4.x — I referenced https://github.com/doctrine/doctrine2-orm-tutorial/ for correct examples
2013-08-17 14:07:29 -07:00
Guilherme Blanco
605c32dbb3 Merge pull request #758 from doctrine/DDC-2235
Fixed DDC-2235.
2013-08-15 21:36:22 -07:00
Guilherme Blanco
f674445486 Fixed DDC-2235. 2013-08-16 00:07:06 -04:00
Marco Pivetta
b038e6b083 Merge pull request #757 from mnapoli/patch-3
Update resolve-target-entity-listener.rst
2013-08-14 04:22:50 -07:00
Matthieu Napoli
ad2ae4c4b4 Update resolve-target-entity-listener.rst
Another syntax highlighting fix
2013-08-14 12:14:02 +02:00
Guilherme Blanco
eaeeee7740 Merge pull request #756 from peterjmit/master
Make yaml/xml configuration for  "AttributeOverride" and "AssociationOverride" more discoverable
2013-08-13 14:43:22 -07:00
Guilherme Blanco
6e265686ec Merge pull request #755 from shieldo/patch-2
corrected English grammar in docblocks
2013-08-13 14:42:52 -07:00
Peter Mitchell
c933ac1a4a Update override field mapping tut
* Added reference to override section of inheritance-mapping.rst
* Added link to yaml/xml examples in override-field-association-mappings-in-subclasses.rst
2013-08-13 16:08:42 -04:00
Douglas Greenshields
494ab1fc2b corrected English grammar in docblocks 2013-08-13 20:45:04 +01:00
Marco Pivetta
6372e60086 Merge pull request #754 from mnapoli/patch-3
Fixed syntax highlighting in working-with-associations.rst
2013-08-13 05:40:48 -07:00
Matthieu Napoli
036547e956 Update working-with-associations.rst
Fixed syntax highlighting
2013-08-13 14:39:17 +02:00
Guilherme Blanco
7f1c1d2b4a Fixed DDC-2506 by manually updating code. Closes PR #708. 2013-08-13 01:07:34 -04:00
Guilherme Blanco
0ae8aa36d7 Merge pull request #753 from 51systems/master
JoinedSubclassPersister doesn't properly bind on some versions of php
2013-08-11 20:11:11 -07:00
Dustin Thomson
27bae51fa0 Modified executeInserts method in JoinedSubclassPersister to only check for the presence of columns in a composite primary key 2013-08-11 19:41:10 -06:00
Benjamin Eberlei
b6bf47a148 Merge pull request #716 from Lumbendil/append-paginator-tree-walker
Appending the Paginator tree walker hint
2013-08-10 13:02:16 -07:00
Benjamin Eberlei
acb7dfb320 Merge pull request #729 from dbu/not-lifecycle-callback-hint
add missing hint about lifecycle callback
2013-08-10 13:00:00 -07:00
Benjamin Eberlei
1c8fa12b64 Merge branch 'DDC-2542' 2013-08-10 17:01:13 +02:00
Roger Llopart Pla
5a7efa2895 Fixed name colision. 2013-08-10 16:58:07 +02:00
Roger Llopart Pla
e755fe7842 Added a test which verifies that the tree walkers are kept. 2013-08-10 16:58:07 +02:00
Roger Llopart Pla
1bc6140394 Added docblock. 2013-08-10 16:58:07 +02:00
Roger Llopart Pla
7f1becf283 Appending the Paginator tree walker hint, instead of removing all the other hints. 2013-08-10 16:58:07 +02:00
Benjamin Eberlei
95af021ed9 Merge pull request #737 from Koc/fix-schema-validator-master
Skip not mapped public properties in SchemaValidator
2013-08-10 07:27:45 -07:00
Benjamin Eberlei
610e18949b Merge pull request #744 from jbruni/patch-1
Corrected PHP type for "decimal" mapping type
2013-08-10 07:23:50 -07:00
Guilherme Blanco
5f5c0ffc32 Fixing pgsql test. 2013-08-08 23:57:41 -04:00
Guilherme Blanco
7853fb8529 Merge pull request #752 from doctrine/PgSqlSchemaFix
ORM side fixes.
2013-08-08 19:43:53 -07:00
Guilherme Blanco
b314476599 ORM side fixes. 2013-08-08 22:01:26 -04:00
Guilherme Blanco
0cb89435b5 Merge pull request #751 from doctrine/PostLoadCanQuery
Added coverage for querying support during postLoad.
2013-08-08 18:57:42 -07:00
Guilherme Blanco
3ec267e8a6 Added coverage for querying support during postLoad. 2013-08-08 20:53:11 -04:00
Fabio B. Silva
0a42401a43 [DDC-2572] Fix ResolveTargetEntityListener subscription example 2013-08-08 19:13:13 -04:00
Konstantin.Myakshin
3c1fd9a3a9 Skip not mapped public properties in SchemaValidator 2013-08-07 01:18:15 +03:00
Guilherme Blanco
34b855e253 Merge pull request #748 from makhov/master
Add hour to DATE_ADD and DATE_SUB
2013-08-06 14:50:14 -07:00
J. Bruni
14bc65bae7 Updated EntityGeneratorTest::testEntityTypeAlias 2013-08-06 11:23:15 -03:00
amakhov
d8fcdc0c54 Add hour to DATE_ADD and DATE_SUB. Excepcion message fix 2013-08-06 12:40:30 +04:00
amakhov
dd975fe53d Add hour to DATE_ADD and DATE_SUB 2013-08-06 12:20:22 +04:00
Marco Pivetta
97762d21a4 Merge pull request #747 from bronze1man/pr-file-mode
fix some file mode 755->644
2013-08-05 23:41:30 -07:00
bronze1man
97d9ba62bb fix some file mode 755->644 2013-08-06 14:12:05 +08:00
Guilherme Blanco
094236d4e0 Merge 2013-08-06 01:49:00 -04:00
Guilherme Blanco
7ec59878a1 Added postLoad behavioral event coverage as a set of functional test. 2013-08-06 01:47:42 -04:00
Guilherme Blanco
354d7050dc Merge pull request #720 from bakura10/fix-paginator
Allow to have non-distinct queries
2013-08-05 20:59:12 -07:00
Guilherme Blanco
ea44ee1d55 Merge pull request #745 from jbruni/patch-2
Update basic-mapping.rst
2013-08-05 20:57:26 -07:00
Guilherme Blanco
e0fd377828 Removed ticket that was breaking the build. DDC-2524 is a circular dependency that is impossible to be fixed with our current codebase. 2013-08-03 19:03:10 -04:00
Guilherme Blanco
36e7e3ccde Updated documentation. 2013-08-03 17:40:48 -04:00
Guilherme Blanco
d9c1782a4f Properly fixed DDC-1858. Added support for ResultVariable in NullComparisons while using HavingClause. 2013-08-03 17:38:55 -04:00
J Bruni
13c1efb240 Update basic-mapping.rst
The attribute name is "name", not "column", isn't it?
2013-08-03 11:26:37 -03:00
J. Bruni
15c2c4dd23 Updated EntityGeneratorTest::testEntityTypeAlias 2013-08-03 10:44:02 -03:00
J Bruni
3c613b9c02 Corrected PHP type for "decimal" mapping type
"Basic Mapping" documentation says:
"decimal: Type that maps a SQL DECIMAL to a PHP string."
2013-08-03 05:44:15 -03:00
Christian Morgan
c715d91dc7 Updates based on feedback from Ocramius
Addresses all comments made so far, except the one about persists/updates
2013-08-01 17:56:45 +01:00
Guilherme Blanco
a19106b03d Merge pull request #731 from austinsmorris/PersistentCollection-initialize-coll
[DDC-2564] - PersistentCollection - initialize coll
2013-07-30 22:36:15 -07:00
Guilherme Blanco
b070676797 Merge pull request #743 from doctrine/DDC-2524
Added coverage to DDC-2524. Updated DDC-1719 to fix related DBAL bug.
2013-07-30 22:29:44 -07:00
Guilherme Blanco
b3d0ad7a87 Added coverage to DDC-2524. Updated DDC-1719 to fix related DBAL bug. 2013-07-31 01:24:02 -04:00
Guilherme Blanco
08e38858ed Merge pull request #741 from doctrine/DDC-1884
Fixed DDC-1884.
2013-07-30 10:48:37 -07:00
Guilherme Blanco
157588f6dc CS fixes. 2013-07-30 12:11:08 -04:00
Christian Morgan
d5bc48623a Cleaned up events.rst
Was a mix-up between TestEventSubscriber and EventTest (e.g. the definition of TestEventSubscriber referenced TestEvent::preFoo, which did not exist). To clarify this I've renamed EventTest to TestEvent.

Tried to clarify the text in the Naming Convention section.

Added note that onClear is not a lifecycle callback.

Tried to clarify the definition of Lifecycle Callbacks.

Separated key/value descriptions into XML and YAML parts since the details are different

Added note in Implementing Event Listeners section that since 2.4 you do have access to EntityManager and UnitOfWork from lifecycle callbacks.

Added example about how to use the computed changeset to modify a primitive value in preUpdate section

Added naming convention example to Entity listeners class section

The other changes are typos and small fixes.
2013-07-30 14:00:17 +01:00
Guilherme Blanco
c7b4c9bf0f Fixed DDC-1884. 2013-07-30 01:29:34 -04:00
Guilherme Blanco
0e010994a7 Merge pull request #740 from doctrine/FilterCollectionEnhancement
Synchronized support of FilterCollection with ODM by adding missing method
2013-07-29 18:44:10 -07:00
Guilherme Blanco
d4814dec42 Synchronized support of FilterCollection with ODM by adding missing method. 2013-07-29 21:24:08 -04:00
Guilherme Blanco
7055ccbf9b Merge pull request #739 from FabioBatSilva/DDC-2579
Fix DDC-2579
2013-07-29 16:54:30 -07:00
Fabio B. Silva
1fbe1ffc5a fix DDC-2579 2013-07-29 19:31:44 -04:00
Guilherme Blanco
a53fe14fa2 Merge pull request #717 from hackedd/patch-1
Allow query parameters starting with an underscore
2013-07-29 13:37:51 -07:00
Guilherme Blanco
8d13601e39 Merge pull request #738 from doctrine/VolatileQueryHydrators
Modified Hydrators to be per-query instances instead of a singleton-like approach
2013-07-29 08:31:38 -07:00
Guilherme Blanco
2dd73d4def Kept BC. 2013-07-29 10:46:47 -04:00
Christian Morgan
7535e9664e Update getting-started.rst
Replaced ``class::$field`` with ``class#field`` to match Doctrine style

Cleaned up three paragraphs mentioned in https://github.com/doctrine/doctrine2/pull/734
2013-07-29 10:42:10 +01:00
Guilherme Blanco
c28b457221 Modified Hydrators to be per-query instances instead of a singleton-like approach. 2013-07-28 20:30:42 -04:00
Guilherme Blanco
eea8572238 Merge pull request #735 from FabioBatSilva/fix-proxy-performance-test
Fix proxy performance test
2013-07-27 07:53:18 -07:00
fabios
69d4fdda1b Fix proxy performance test 2013-07-26 17:59:50 -04:00
Christian Morgan
bc7d06fe59 Updated method documentation to use # for instance methods instead of :: 2013-07-26 22:21:27 +01:00
Christian Morgan
7bc18d7888 Cleaned up documentation
Cleaned up documentation, tweaked some of the grammar, changed class#method() references to class::method(), added warning about performance impact of lazy loading
2013-07-26 16:16:24 +01:00
Marco Pivetta
d7881a1ec2 Merge pull request #733 from Lumbendil/master
Update Parser.php
2013-07-24 04:13:12 -07:00
Roger Llopart Pla
9b574ad53b Update Parser.php
Fix the docummentation for Parser::Literal()
2013-07-24 13:07:06 +02:00
Austin Morris
5fc1184a49 convert PersistentCollection functional tests to unit tests 2013-07-23 09:40:46 -04:00
Austin Morris
0083cb8ca6 remove redundant require_once for TestInit.php 2013-07-23 09:01:01 -04:00
Guilherme Blanco
6f39a426a7 Merge pull request #732 from trsteel88/patch-1
Update working-with-associations.rst
2013-07-22 20:22:37 -07:00
trsteel88
23cc3ea4bc Update working-with-associations.rst
Always use the constant for sorting. If you use 'asc' it will not work.
2013-07-23 12:30:33 +10:00
Austin Morris
1c8ae50557 do not initialize coll on add() 2013-07-22 18:54:02 -04:00
Austin Morris
6bae2eac29 Initialize coll when using Collection methods inside PersistentCollection 2013-07-22 14:42:03 -04:00
Austin Morris
5fd844d73e PersistentCollection - initialize coll - create failing tests 2013-07-22 14:39:00 -04:00
Marco Pivetta
4bc8f7be16 Merge pull request #728 from armetiz/patch-1
Color message like the update tools
2013-07-22 08:19:50 -07:00
Thomas Tourlourat
4882ff1ef5 Add info tag around ATTENTION 2013-07-22 17:11:53 +02:00
Marco Pivetta
8d2826c633 Merge pull request #730 from NicolasN/patch-1
To avoid "SpacingAfterParams" error with PHPCS Symfony2 coding standard
2013-07-22 02:17:53 -07:00
Nicolas Nutten
eba933bb47 To avoid "SpacingAfterParams" error with PHPCS Symfony2 coding standard
Hello,
I added two blank lines in comments two avoid the following error with PHPCS Symfony2 coding standard :
Error Code: SpacingAfterParams
Error Description: Last parameter comment requires a blank new line after it.
2013-07-22 10:56:18 +02:00
David Buchmann
b4e9dafd10 add missing hint about lifecycle callback 2013-07-22 10:23:47 +02:00
Thomas Tourlourat
0c3581a1f8 Color message like the update tools 2013-07-19 11:33:35 +02:00
Guilherme Blanco
fbbb161987 Merge pull request #719 from tristanlins/fix/entity-generator-extensibility
Access properties via static:: instead of self::.
2013-07-17 17:18:01 -07:00
Guilherme Blanco
2a5652c807 Merge pull request #723 from morganprecision/patch-1
Remove extra semicolon before ->setParameter() calls
2013-07-15 16:38:05 -07:00
Eugene Morgan
0a151f2474 Remove extra semicolon before ->setParameter() calls 2013-07-15 15:01:33 -05:00
Marco Pivetta
0aed9595c3 Merge pull request #721 from alex88/patch-1
Updated batch-processing link extension
2013-07-11 04:56:13 -07:00
Alessandro Tagliapietra
d249a22f74 Updated batch-processing link extension
I've changed the batch processing link adding .html else the link is broken
2013-07-11 11:52:26 +02:00
Michaël Gallego
3f112db725 Allow to have non-distinct queries 2013-07-09 17:31:30 +02:00
Guilherme Blanco
78fc129614 Merge pull request #632 from Padam87/entgentrait
entity generator - ignore trait properties and methods
2013-07-07 12:37:55 -07:00
Tristan Lins
641774630b Access properties via static:: instead of self::.
The properties of EntityGenerator are now protected instead of private.
But this does not make sense until they are accessed with static::.
Otherwise the templates cannot be overwritten within a sub class.
2013-07-05 13:40:57 +02:00
Paul Hooijenga
b5394fc5a0 Add test for query paremeters starting with underscore 2013-07-05 09:21:50 +02:00
Roger Llopart Pla
9f2994f462 Fixed name colision. 2013-07-04 08:29:46 +00:00
Paul
6aa58d9939 Allow query parameters starting with an underscore 2013-07-04 10:12:36 +02:00
Roger Llopart Pla
91638aadcf Added a test which verifies that the tree walkers are kept. 2013-07-03 11:18:19 +00:00
Roger Llopart Pla
981fcb2c21 Added docblock. 2013-07-03 12:24:57 +02:00
Roger Llopart Pla
90a41fba8b Appending the Paginator tree walker hint, instead of removing all the other hints. 2013-07-03 12:14:16 +02:00
Marco Pivetta
dc2be816a8 Merge pull request #713 from dave1010/grammar-fix
Quick grammar fix
2013-07-02 10:20:28 -07:00
Dave Hulbert
5e700db6d3 Fix grammar in CreateCommand 2013-07-02 16:29:36 +01:00
Dave Hulbert
c57f2c39f6 Fix grammar in DropCommand 2013-07-02 16:28:58 +01:00
Benjamin Eberlei
29d6da0fa0 Merge pull request #703 from shulcsm/patch-1
Clear visitedCollections
2013-06-30 01:38:02 -07:00
Benjamin Eberlei
69fe5c48f4 Merge pull request #710 from sandermarechal/extra-lazy-get-fix
Fix extra lazy get
2013-06-30 01:37:26 -07:00
Benjamin Eberlei
8e1111c8d3 Merge pull request #711 from FabioBatSilva/coveralls
Coveralls code coverage
2013-06-27 23:52:15 -07:00
Fabio B. Silva
e4bccdc7b3 coveralls code coverage 2013-06-27 20:18:21 -04:00
Sander Marechal
06ed21e883 Remove extra-lazy-get for ManyToMany relation 2013-06-27 14:19:39 +02:00
Sander Marechal
5635fa60a4 Check owning entitiy on extra lazy get with OneToMany relation 2013-06-27 14:17:41 +02:00
Benjamin Eberlei
4d93a4950b Merge branch 'DDC-2530' 2013-06-25 19:34:22 +02:00
Benjamin Eberlei
a91050e7f4 [DDC-2350] Eager Collections are not marked as initialized, leading to multiple queries being executed. 2013-06-25 19:34:12 +02:00
Guilherme Blanco
20e5d98b7b Merge pull request #640 from denkiryokuhatsuden/patch-1
[Paginator]Add hidden field ordering for postgresql
2013-06-24 19:23:36 -07:00
Benjamin Eberlei
2f6e914d64 Dont allow failures in 5.5 anymore 2013-06-24 08:42:17 +02:00
Guilherme Blanco
457036aacb Merge pull request #702 from FabioBatSilva/DDC-2459
[DDC-2459]ANSI compliant quote strategy
2013-06-23 14:26:49 -07:00
Guilherme Blanco
2ce72f38a2 Merge pull request #705 from FabioBatSilva/DDC-2519
[DDC-2519] Partial association identifier
2013-06-23 14:25:58 -07:00
Fabio B. Silva
1cff8b4d98 Fix DDC-2519 2013-06-21 16:07:09 -04:00
Fabio B. Silva
a165f63c8c ANSI compliant quote strategy 2013-06-21 16:05:59 -04:00
Benjamin Eberlei
eaf8fd3c34 Merge pull request #706 from sandermarechal/extra-lazy-get
[DDC-1398] Extra-lazy get for indexed associations
2013-06-20 05:26:52 -07:00
Sander Marechal
70427871ce Extra test for indexBy identifier versus indexBy other fields 2013-06-20 14:20:00 +02:00
Sander Marechal
2879162015 No need to lookup metadata 2013-06-20 14:00:58 +02:00
Sander Marechal
3b92cfac5a Use find() if the indexBy field is the identifier 2013-06-20 13:45:38 +02:00
Sander Marechal
53c9ffda30 Get rid of variable 2013-06-20 10:20:16 +02:00
Sander Marechal
647c5e2cad Test actual data returned by get() 2013-06-20 10:18:08 +02:00
Sander Marechal
3555007f08 Return NULL for non-existent keys
The load() function already returns just one entity or NULL, so
the current() is not needed and the result can be returned directly.
2013-06-20 10:09:52 +02:00
Sander Marechal
523697d0b6 [DDC-1398] Extra-lazy get for indexed associations
If an association is EXTRA_LAZY and has an indexBy, then
you can call get() without loading the entire collection.
2013-06-20 09:29:56 +02:00
Benjamin Eberlei
1382d766b0 Merge pull request #704 from liuggio/patch-1
added badges stable release and total downloads
2013-06-19 09:02:33 -07:00
Giulio De Donato
c743bb938b added badges 2013-06-19 16:40:57 +02:00
shulcsm
3340234785 Clear visitedCollections
Visited collections are cleared only in commit(). Commit clears up only if it actually has something to do. Processing large amounts of records without changing them cause visitedCollections to grow without any way of clearing.
2013-06-19 16:34:44 +03:00
Marco Pivetta
a39ceb3159 Merge pull request #701 from rbroen/patch-2
list_bugs.php needs to call to getters for protected vars
2013-06-17 02:41:29 -07:00
Robert Broen
6ff5043ce8 list_bugs.php needs to call to getters for protected vars
list_bugs.php needs to call to getters for protected vars. This was changed in the "getting-started" code repository, but not in the "getting-started" tutorial.
2013-06-17 11:36:09 +02:00
Marco Pivetta
1a958f70fd Merge pull request #700 from rbroen/patch-2
Update getting-started.rst
2013-06-17 01:39:43 -07:00
Robert Broen
184e8eb26c Update getting-started.rst
The tutorial assumes Doctrine 2.4
2013-06-17 10:31:06 +02:00
Guilherme Blanco
7903a2b513 Merge pull request #695 from doctrine/RepositoryFactory
Implemented support for RepositoryFactory.
2013-06-14 09:19:43 -07:00
Guilherme Blanco
52b3fc1fc3 Updated since php doc tag. 2013-06-14 12:07:28 -04:00
Guilherme Blanco
09d67b10b0 Merge pull request #697 from michaelperrin/patch-1
Fix phpDoc syntax in ClassMetadataInfo.php
2013-06-14 06:57:14 -07:00
Adam Prager
73e2aa54ef moved php version check 2013-06-14 10:07:05 +02:00
Michaël Perrin
37d7df6ac4 Fix phpDoc syntax in ClassMetadataInfo.php 2013-06-14 11:00:17 +03:00
Guilherme Blanco
3488049c18 Reduced granularity of DefaultRepositoryFactory reference to ObjectRepository instances, in cases where consumers are completely rewrote EntityRepository. 2013-06-13 23:59:08 -04:00
Guilherme Blanco
a66fc03441 Reducing dependency on RepositoryFactory by providing EntityManager as a getRepository argument. 2013-06-13 23:53:53 -04:00
Guilherme Blanco
37e7e841c3 Fixed wrong interface. 2013-06-13 23:31:18 -04:00
Guilherme Blanco
f2f1d8986c Merge pull request #694 from FabioBatSilva/DDC-2478
[DDC-2478] Support null association comparison
2013-06-13 20:12:48 -07:00
Guilherme Blanco
7eb744126b Implemented support for RepositoryFactory. 2013-06-13 21:47:40 -04:00
Fabio B. Silva
f16c8e3efe Fix DDC-2478 2013-06-13 16:44:02 -04:00
Guilherme Blanco
6ef48561ba Merge pull request #688 from sellingsource/master
Implement QuoteStrategy on SqlWalker walkRangeVariableDeclaration
2013-06-12 12:03:24 -07:00
Guilherme Blanco
0a90279a99 Merge pull request #693 from doctrine/hotfix/DDC-2214
Adding failing test for DDC-2214
2013-06-12 12:00:31 -07:00
Marco Pivetta
a1355d0bb9 Adding failing test for DDC-2214
Parameters being bound to an SQL query should have the same type as
the identifier of the objects being bound to the placeholders of a
DQL query - this is currently broken with proxies, as this test
demonstrates.
2013-06-12 20:51:45 +02:00
Guilherme Blanco
6937061b23 Merge pull request #690 from FabioBatSilva/DDC-2494
[DDC-2494] Apply type conversion to meta columns
2013-06-12 11:47:26 -07:00
Fabio B. Silva
c1e688fc81 drop useless support for associations 2013-06-12 10:30:51 -04:00
Fabio B. Silva
d961028b14 small optimization 2013-06-12 10:30:51 -04:00
Fabio B. Silva
d685f592fe Fix DDC-2494 2013-06-12 10:30:51 -04:00
Guilherme Blanco
b15758bb42 DDC-2476 Commented check under PostgreSQL. 2013-06-12 02:29:08 -04:00
Guilherme Blanco
3d86c82a7f DDC-2476 Better approach for reverse engineer. Some refactoring done to driver. 2013-06-12 02:00:36 -04:00
Guilherme Blanco
0d834d0bd4 DDC-2489 Added missing semicolon when dump-sql on schema update. 2013-06-12 00:31:25 -04:00
Guilherme Blanco
0248f743ba Merge pull request #691 from 51systems/master
IDENTITY function fix for Joined Inheritance
2013-06-11 21:04:27 -07:00
Dustin Thomson
ed7a4bdcf3 Fix typo in test name 2013-06-11 18:38:05 -06:00
Dustin Thomson
529064aff2 Modified identity function to work with joined inheritance tables.
Added regression tests
2013-06-11 18:09:49 -06:00
Guilherme Blanco
4e99c5c127 DDC-1858 Added coverage to ticket. Functionality already implemented. 2013-06-11 01:21:47 -04:00
Guilherme Blanco
462173ad71 Merge pull request #689 from FabioBatSilva/DDC-1995
[WIP][DDC-1995 ] Support metadata class as parameter for instance of expression
2013-06-07 14:42:59 -07:00
Fabio B. Silva
710d0d1109 Fix DDC-1995 2013-06-07 17:24:05 -04:00
John Brown
4ef043fc3b updating sql walker to use quote strategy in joins 2013-06-07 08:56:58 -07:00
John Brown
afb9c829e2 updating sql walker to use quote strategy in joins 2013-06-07 08:49:49 -07:00
John Brown
9bea612d74 Adding simple test to ensure quoting of table names still functions. Note: the funtionality of this change won't be noticiable unless a custom quote strategy is implemented 2013-06-06 15:51:23 -07:00
John Brown
77b905eaa8 Implement QuoteStrategy on SqlWalker walkRangeVariableDeclaration
Based on:
http://www.doctrine-project.org/jira/browse/DDC-1845
cb72219b11
2013-06-06 15:08:22 -07:00
Marco Pivetta
5c7b98b2a9 Merge pull request #687 from mnapoli/patch-3
Fixed rendering
2013-06-06 01:51:49 -07:00
Matthieu Napoli
424793c263 Fixed rendering
Fixed some broken rendering on http://docs.doctrine-project.org/en/latest/reference/yaml-mapping.html
2013-06-06 11:36:02 +03:00
Guilherme Blanco
753d63c2d4 Merge pull request #686 from FabioBatSilva/DDC-2475
[DDC-2475] Replace OrderBy mapping when OrderByClause is given
2013-06-04 22:03:53 -07:00
Fabio B. Silva
27511374ec Fix DDC-2475 2013-06-04 23:50:43 -04:00
Marco Pivetta
3d6436c2f3 Merge pull request #683 from greg0ire/error_message_improvement
Explicitely state what the problem is
2013-06-03 03:37:38 -07:00
Grégoire Paris
a986fe013e Explicitely state what the problem is
People like me think the problem is that there is no association
mapping, when the problem in fact could be that there also is a field
mapping on the property.
This message makes it clearer why we are getting an error message.
2013-06-03 12:07:08 +02:00
Marco Pivetta
4e8b787d07 Merge pull request #679 from ajgarlag/getting-started
Fix getting started doc to work with current version
2013-05-28 00:36:17 -07:00
Antonio J. García Lagar
c64c149ebf Fix getting started doc to work with current version 2013-05-28 08:57:17 +02:00
Benjamin Eberlei
f269ecc3ac Bump dev version to 2.4.0 2013-05-27 21:47:16 +02:00
Benjamin Eberlei
6bc18402e2 Release 2.4.0-RC1 2013-05-27 21:47:16 +02:00
Marco Pivetta
3d0ac62059 Merge pull request #678 from jbafford/duplicate-words-fix
Fix an instance of doubled words in the docs
2013-05-27 08:51:38 -07:00
John Bafford
0e29fe871a Fix an instance of doubled words 2013-05-27 11:20:26 -04:00
Alexander
e5de0dad7e Merge remote-tracking branch 'asm89/ddc-2417'
* asm89/ddc-2417:
  [DDC-2471] Fix EQ/NEQ null handling of criteria
2013-05-26 09:10:18 +02:00
Alexander
66a842c143 [DDC-2471] Fix EQ/NEQ null handling of criteria 2013-05-26 09:04:19 +02:00
Benjamin Eberlei
6548947df5 Merge pull request #666 from FabioBatSilva/DDC-2429
[DDC-2429] Fix xsd definition
2013-05-25 23:01:13 -07:00
Benjamin Eberlei
20b5ab26e7 Merge pull request #669 from hason/many_to_many
Fixed generating column names for self referencing entity.
2013-05-25 22:16:48 -07:00
Benjamin Eberlei
a36f84eeb5 Merge pull request #672 from hell0w0rd/simplification_example
Simplification example
2013-05-25 22:00:59 -07:00
Benjamin Eberlei
e8b3598751 Merge pull request #673 from hell0w0rd/namespace_base_commands_names
Namespace based command names
2013-05-25 21:59:32 -07:00
Gusakov Nikita
1f4a65f3e0 add debug variable and check for loader 2013-05-20 17:08:20 +04:00
Torben
997f22fbb9 add shortcut for force 2013-05-20 10:06:11 +02:00
Gusakov Nikita
384dfa87ab add docs 2013-05-18 04:00:28 +04:00
Gusakov Nikita
6bb3184dbf fix bc 2013-05-18 02:40:18 +04:00
Gusakov Nikita
4c1869dca0 ready 2013-05-18 02:09:07 +04:00
Gusakov Nikita
ec57306efe remove comment about cli-config 2013-05-18 01:44:47 +04:00
Gusakov Nikita
dca0881d94 forget add changes 2013-05-18 01:42:55 +04:00
Gusakov Nikita
7430320bac ready 2013-05-18 01:40:05 +04:00
Benjamin Eberlei
c9d9b68fa9 Merge pull request #671 from FabioBatSilva/DDC-2435
[DDC-2435] Fix column name with numbers and non alphanumeric characters.
2013-05-17 09:34:00 -07:00
Fabio B. Silva
f92214997f [DDC-2435] Fix column name with numbers and non alphanumeric characters. 2013-05-17 13:02:46 -03:00
Benjamin Eberlei
65886fdfea Merge pull request #670 from FabioBatSilva/DDC-2451
[DDC-2451] Fix entity listeners serialization
2013-05-17 08:09:28 -07:00
Fabio B. Silva
1e95110b08 Add missing mapping files 2013-05-17 11:59:28 -03:00
Fabio B. Silva
1d7c72cc06 [DDC-2451] Fix test assert 2013-05-17 11:55:36 -03:00
Fabio B. Silva
4d6cef1ff6 [DDC-2451] Fix entity listeners serialization 2013-05-17 11:42:11 -03:00
Martin Hasoň
bef5b585cb Fixed generating join column names for self referencing entity. 2013-05-17 16:28:45 +02:00
Fabio B. Silva
b147c472be [DDC-2429] Fix xsd definition 2013-05-13 11:04:36 -03:00
Benjamin Eberlei
eb1a162cbc Fix regression in DDC-2430. 2013-05-10 23:31:27 +02:00
Benjamin Eberlei
bf9673203c Merge pull request #639 from goetas/indexby-metadata
Added abillity to use metacolumn as indexBy
2013-05-09 23:53:26 -07:00
Benjamin Eberlei
fa75856d5f Merge pull request #663 from doctrine/hotfix/DDC-2432
Hotfix for DDC-2432
2013-05-09 14:37:55 -07:00
Marco Pivetta
22c9f6ebec applying required fixes for DDC-2432 2013-05-09 21:14:58 +02:00
Marco Pivetta
07c207081e Adding failing test to demonstrate DDC-2432
Loading proxies with invalid identifiers will currently mark them as initialized regardless of the failure
2013-05-09 21:11:10 +02:00
Benjamin Eberlei
762f43c3dc Merge branch 'DDC-2280' 2013-05-09 18:15:48 +02:00
Benjamin Eberlei
b53f4fd4cc [DDC-2280] length attribute in <id> was not converted. 2013-05-09 18:15:41 +02:00
Benjamin Eberlei
665efad039 Merge branch 'master' of github.com:doctrine/doctrine2 2013-05-09 16:55:38 +02:00
Benjamin Eberlei
540af2fd2a Merge pull request #662 from jakzal/code-block-fix
Fixed a code block.
2013-05-09 07:27:35 -07:00
Benjamin Eberlei
1a0adecf29 [DDC-2335] Add note about filtering schema by regexp expression to relevant commands help output. 2013-05-09 16:24:19 +02:00
Jakub Zalas
97622b57bd Fixed a code block.
Sphinx does not like the way code was indented. Building the documentation raises the following error:
en/cookbook/resolve-target-entity-listener.rst:121: ERROR: Unexpected indentation.
2013-05-09 15:19:58 +01:00
Benjamin Eberlei
b9a0a19607 Merge pull request #661 from HarmenM/patch-1
Update annotations-reference.rst
2013-05-09 05:10:26 -07:00
HarmenM
f8efd85ae6 Update annotations-reference.rst
Added missing @JoinColumns in the index
2013-05-09 14:49:38 +03:00
Benjamin Eberlei
dc674f809f Mention BC BREAK in PersistentCollection#matching() more prominently. 2013-05-09 13:40:14 +02:00
Benjamin Eberlei
30f90a6f49 Merge branch 'DDC-2430' 2013-05-09 13:24:45 +02:00
Benjamin Eberlei
6d5afb18bc [DDC-2430] Prevent Criteria queries using the ID of an assocation on PersistentCollections, as the in-memory ArrayCollection does not work with this kind of query. Attention this is a BC-BREAK, that is necessary to fix potentially very hard to debug bugs. Therefore it is not merged back into 2.3 2013-05-09 13:24:36 +02:00
Benjamin Eberlei
d3cd10d926 Merge branch 'DDC-2387' 2013-05-09 12:10:45 +02:00
Benjamin Eberlei
7220c3c125 [DDC-2387] Fix DatabaseDriver not working with combinations of composite/association keys. 2013-05-09 12:10:37 +02:00
Benjamin Eberlei
86277def7e Merge branch 'DDC-2437' 2013-05-09 11:03:21 +02:00
Benjamin Eberlei
abe8ef6778 Merge branch 'DDC-2423' 2013-05-09 10:55:20 +02:00
Benjamin Eberlei
e3b8ce7737 [DDC-2423] Fixed bug with EntityGenerator not generating fetch="" attribute in association annotations. 2013-05-09 10:55:12 +02:00
Benjamin Eberlei
acbafd081b Add documentation to EntityManager about instantiation, decoration over inheritance, and some generic introduction. 2013-05-09 10:23:12 +02:00
Vladislav Vlastovskiy
3997d0df87 Added test complex inner join with indexBy 2013-05-09 03:32:28 +04:00
Vladislav Vlastovskiy
33888f1b08 Swapped places indexBy and condition in accordance with EBNF 2013-05-09 03:30:48 +04:00
Benjamin Eberlei
c8bcdb4b61 Merge pull request #524 from lstrojny/feature/entity-manager-decorator
EntityManagerDecorator base class as an extension point for EntityManager
2013-05-04 06:02:39 -07:00
Benjamin Eberlei
8e8560b276 Merge pull request #537 from Powerhamster/joined-composite-keys
fixed problems with joined inheritance and composite keys
2013-05-04 05:59:02 -07:00
Benjamin Eberlei
937473329f Merge branch 'DDC-2267' 2013-05-04 13:38:42 +02:00
Benjamin Eberlei
5e19e1bed3 [DDC-2267] Allow EntityManager#flush($entity) to be called on entities scheduled for removal. 2013-05-04 13:38:30 +02:00
Benjamin Eberlei
3c74491720 Merge branch 'DDC-2426' 2013-05-04 12:58:25 +02:00
Benjamin Eberlei
9adc45767d [DDC-2426] Missing length attribute in doctrine-mapping.xsd for <id> tag. 2013-05-04 12:58:06 +02:00
Benjamin Eberlei
59fff4ddef Fix Docs build 2013-05-03 13:32:42 +02:00
Benjamin Eberlei
6d02c7e1a5 [DDC-2136] Fix exporting to YAML and XML with assocation keys. 2013-05-01 23:10:13 +02:00
Benjamin Eberlei
d33e0a3488 Merge branch 'DDC-1998' 2013-05-01 20:33:49 +02:00
Benjamin Eberlei
0864ab8ada [DDC-1998] Pass types to Connection#delete() to allow custom conversions to happen. 2013-05-01 20:30:45 +02:00
Benjamin Eberlei
7d53cb2aeb Merge branch 'DDC-1984' 2013-05-01 19:39:30 +02:00
Benjamin Eberlei
131164b7f6 [DDC-1984] Throw exception if passing null into UnitOfWork#lock() - which can happen when EntityManager#find() tries to lock entity that was just deleted by another process. 2013-05-01 19:39:21 +02:00
Benjamin Eberlei
6c889eee64 Merge branch 'DDC-2106' 2013-05-01 18:46:54 +02:00
Benjamin Eberlei
640a8e58c7 [DDC-2106] Fix entity as parameter value when its managed but not yet with identifier. 2013-05-01 18:46:41 +02:00
Benjamin Eberlei
6505c96ec4 Simplify condition of previous commit (5cdc73e) 2013-05-01 10:58:44 +02:00
Benjamin Eberlei
760aaa67c4 Merge pull request #655 from FabioBatSilva/DDC-2409
[DDC-2409] Fix merge association STATE_NEW
2013-05-01 01:49:25 -07:00
Benjamin Eberlei
325387a6f2 Merge branch 'DBAL-483' 2013-05-01 10:42:35 +02:00
Benjamin Eberlei
1f08acb576 [DBAL-483] Pass default values to DBAL mapping layer correctly to fix default comparision bug. 2013-05-01 10:42:28 +02:00
Asmir Mustafic
7abf46af70 cascade remove persist on links 2013-04-29 11:03:55 +02:00
Asmir Mustafic
2ca24375e4 no lang 2013-04-29 10:32:40 +02:00
Asmir Mustafic
34adb16ee8 indexby ddc117 tests 2013-04-29 10:29:58 +02:00
Fabio B. Silva
5cdc73e13b Fix DDC-2409 2013-04-28 16:54:44 -03:00
Benjamin Eberlei
d513e0f084 Merge pull request #653 from FabioBatSilva/DDC-2415
[DDC-2415] Fix CustomIdGenerator inheritance
2013-04-27 00:40:57 -07:00
Fabio B. Silva
7c2da2d5b8 Fix DDC-2415 2013-04-26 16:11:04 -03:00
Marco Pivetta
cc24ac496d Merge pull request #652 from dannykopping/patch-1
Fixed entities path
2013-04-26 02:11:52 -07:00
Danny Kopping
408eef1356 Fixed entities path
In the tutorial, the user is told to create a new file in the '/src' folder, and the 'entities' folder is never referenced. Updating the SQLite schema according to the tutorial fails with the 'No Metadata Classes to process.' message. Changing the folder to '/src' fixes this, ostensibly.
2013-04-26 12:05:50 +03:00
Marco Pivetta
9791b2eb00 Merge pull request #651 from EuKov/patch-1
Fixed typo in SQLFilter (use statement ClassMetadata)
2013-04-23 10:50:01 -07:00
EuKov
99ec4dc72c Fixed typo in SQLFilter (use statement ClassMetadata) 2013-04-23 20:46:19 +03:00
Marco Pivetta
3aae50cb59 Merge pull request #649 from calumbrodie/patch-1
Update coding standards in change tracking cookbook entry
2013-04-21 12:07:31 -07:00
Calum Brodie
a0a133b02c Removed unneeded escape character
Removed backslash
2013-04-21 20:55:54 +02:00
Calum Brodie
c2967b35ff Update coding standards
Removing underscores from property/method names and change use statements to PSR-2
2013-04-21 20:43:48 +02:00
Benjamin Eberlei
92b41e017a [DDC-2407] Fix missing support for UUID and CUSTOM id generators in Exporter 2013-04-20 10:25:36 +02:00
Adam Prager
bf92a40171 skip test if php 5.3 2013-04-19 14:49:32 +02:00
Benjamin Eberlei
52b2e066c5 Merge pull request #611 from stefankleff/fix-eagerloading
Fixed typo in hints. Caused slow loading of eager entities.
2013-04-14 00:43:42 -07:00
Guilherme Blanco
e835175865 Merge pull request #646 from raykolbe/master
Oracle Pagination bug when ordering is present
2013-04-10 10:49:26 -07:00
Raymond Kolbe
27e23faa5a Accompanying tests for PR #646 2013-04-10 13:07:09 -03:00
Raymond Kolbe
4bafcc5b31 Fix Oracle subquery ordering
See http://www.doctrine-project.org/jira/browse/DDC-1800 and http://www.doctrine-project.org/jira/browse/DDC-1958#comment-19969
2013-04-09 17:30:54 -03:00
Raymond Kolbe
b8b7afe576 Fix Oracle subquery ordering lost bug
See http://www.doctrine-project.org/jira/browse/DDC-1800 for a full description.
2013-04-09 17:00:06 -03:00
Benjamin Eberlei
142c20aad1 Work on the Tutorial 2013-04-09 00:00:16 +02:00
Stefan Kleff
e561f47cb2 Added constant 2013-04-08 11:27:22 +02:00
Adam Prager
b7b107b08a moved test entities from sandbox 2013-04-07 16:26:05 +02:00
Benjamin Eberlei
d1f8e18d02 Enhance documentation on NEW() keyword. (ref DDC-1574) 2013-04-07 14:05:42 +02:00
Benjamin Eberlei
34374db56e Enhance documentation on IDENTITY() for composite keys (ref DDC-2202) 2013-04-07 14:02:47 +02:00
Benjamin Eberlei
b2e29eaf97 Rework NativeSQL doc chapter and document SELECT clause generation (ref DDC-2055). 2013-04-07 14:01:27 +02:00
Fabio B. Silva
2ad6565632 Fix parenthesis example 2013-04-06 14:53:36 -03:00
Benjamin Eberlei
cef20890dc Merge pull request #616 from FabioBatSilva/DDC-2252
[DDC-2252] Fix delete many-to-many composite key
2013-04-06 10:37:16 -07:00
Fabio B. Silva
8109db02b5 Document Parenthesis BC break. 2013-04-06 13:02:43 -03:00
Benjamin Eberlei
3fef8d7285 Merge pull request #621 from dbu/event-subscribers
[doc] adding some more doc and examples for lifecycle event listeners and subscribers
2013-04-06 08:04:24 -07:00
Benjamin Eberlei
fe238d03c8 Merge pull request #618 from FabioBatSilva/DDC-2188
[DDC-2188] Fix arithmetic priority
2013-04-06 07:56:36 -07:00
Benjamin Eberlei
3c4a9c8efa Merge pull request #644 from pborreli/typos
Fixed typos
2013-04-06 07:49:04 -07:00
Pascal Borreli
30b050b44c Fixed typos 2013-04-06 14:31:27 +00:00
Benjamin Eberlei
64b2ecfefc [DDC-2224] Rewrite instanceof feature with parameter needle ClassMetadata breaks caching of queries. 2013-04-04 20:22:48 +02:00
Adam Prager
3b7b457d35 minor fixes 2013-04-04 20:07:21 +02:00
Marco Pivetta
edca8c88ea Merge pull request #641 from bksunday/patch-1
Added yml example in ordered-associations.rst
2013-04-03 09:36:19 -07:00
Anthony
1278b79c79 Added yml example in ordered-associations.rst
And modified it to be in a configuration-block instead of separate code-block
2013-04-03 13:31:07 -03:00
denkiryokuhatsuden
7af84e79e5 Fixed postgresql hidden scalar sort 2013-04-03 17:22:31 +09:00
denkiryokuhatsuden
e54c11e3bb Add test for postgresql hidden scalar sorting 2013-04-03 17:21:51 +09:00
denkiryokuhatsuden
786d904328 Revert "Add hidden field ordering for postgresql"
This reverts commit 3e8796f781.
2013-04-03 17:14:31 +09:00
denkiryokuhatsuden
3e8796f781 Add hidden field ordering for postgresql
In postgresql environment, when some hidden fields are used in orderBy clause,
they're not property added because $rsm->scalarMappings don't have information about them.
2013-04-02 18:54:55 +09:00
Asmir Mustafic
3196b0c05a missing new line 2013-04-02 10:14:24 +02:00
Asmir Mustafic
6fc18e330d indexby metadata column 2013-04-02 10:04:15 +02:00
Adam Prager
b3414e3c1a added unit test 2013-03-31 00:47:45 +01:00
Adam Prager
937ba6385e fixed code duplication issue 2013-03-31 00:47:24 +01:00
Guilherme Blanco
9b0f252aff Merge pull request #637 from choomz/patch-1
Update association-mapping.rst
2013-03-30 06:48:06 -07:00
Valentin Ferriere
2e8272e18f Update association-mapping.rst 2013-03-29 16:39:55 +01:00
Guilherme Blanco
484d03a5bc Merge pull request #636 from dustinmoorman/rst-file-documentation-fixes
Fixed typos in documentation.
2013-03-27 21:26:24 -07:00
Dustin Moorman
51bcda51c5 Fixed typos in documentation. 2013-03-27 22:43:58 -05:00
Benjamin Eberlei
9613f1d8cb [DDC-93] Rename ReflectionProxy to ReflectionEmbeddedProperty, Add DQL test with Object and Array Hydration. 2013-03-27 21:45:16 +01:00
Benjamin Eberlei
879ab6e52b [DDC-93] Show CRUD with value objects with current change tracking assumptions. 2013-03-27 07:44:47 +01:00
Adam Prager
9797177193 check if ReflectionClass::getTraits() method exists 2013-03-27 02:48:35 +01:00
Benjamin Eberlei
011776f02f [DDC-93] Add some TODOs in code. 2013-03-27 00:18:21 +01:00
Benjamin Eberlei
0204a8b69a [DDC-93] Implement first working version of value objects using a ReflectionProxy object, bypassing changes to UnitOfWork, Persisters and Hydrators. 2013-03-27 00:10:30 +01:00
Benjamin Eberlei
32988b3cdf [DDC-93] Parse @Embedded and @Embeddable during SchemaTool processing to make parsing work. 2013-03-26 21:45:15 +01:00
Adam Prager
8898c91dfc only check for traits when class exists 2013-03-26 21:28:09 +01:00
Adam Prager
8e3e2e770a Revert "only use already existing reflections"
This reverts commit bb5bdcf0f4.
2013-03-26 21:17:59 +01:00
Adam Prager
bb5bdcf0f4 only use already existing reflections 2013-03-26 21:14:52 +01:00
Benjamin Eberlei
02d34bbba6 [DDC-93] Started ValueObjectsTest 2013-03-26 20:55:55 +01:00
Adam Prager
521276f1ed entity generator - ignore trait properties and methods 2013-03-26 20:52:57 +01:00
Guilherme Blanco
a4db7c8b42 Merge pull request #631 from aaronmu/master
Fix typo in one of the orderBy examples.
2013-03-26 09:18:01 -07:00
Aaron Muylaert
3e8dd1e45c Update query-builder.rst
Fix typo in one of the orderBy examples.
2013-03-26 16:47:41 +01:00
Benjamin Eberlei
5ea9cf418a Merge pull request #627 from chuanma/master
update document on Doctrine cache provider
2013-03-24 13:22:20 -07:00
Benjamin Eberlei
b7e09ecf98 Merge pull request #630 from Ocramius/hotfix/DDC-2359
Hotfix for DDC-2359
2013-03-24 12:23:34 -07:00
Benjamin Eberlei
7f26e9ac27 Bump dev version to 2.4.0 2013-03-24 19:58:19 +01:00
Benjamin Eberlei
827f1f84cb Release 2.4.0-BETA1 2013-03-24 19:58:19 +01:00
Marco Pivetta
7afe5af73a Fix for DDC-2359 2013-03-24 19:42:50 +01:00
Marco Pivetta
57020322cb Adding failing test for DDC-2359
Doctrine\ORM\Mapping\ClassMetadataFactory#wakeupReflection is called twice
2013-03-24 19:40:53 +01:00
Guilherme Blanco
1f89d8ce2f Merge pull request #629 from dustinmoorman/typo-fixes-in-basic-mapping-rst
Fixed typos in Doctrine Mapping Types section.
2013-03-24 09:28:16 -07:00
Guilherme Blanco
99a15377be Merge pull request #628 from franmomu/patch-2
[Docs] Fix field name in inversedby parameter
2013-03-24 09:27:48 -07:00
Dustin Moorman
d4061ff41b Fixed typos in Doctrine Mapping Types section. 2013-03-24 03:16:00 -05:00
Fran Moreno
10c48bad7b [Docs] Fix field name in inversedby parameter 2013-03-24 02:07:05 +01:00
Chuan Ma
94ceb0e410 Document: delete the doc for a number of cache provider methods that don't exist 2013-03-22 17:53:47 -04:00
Guilherme Blanco
24c1b00963 Merge pull request #622 from hrubi/master
Import EntityManager from proper namespace
2013-03-21 09:31:17 -07:00
Jan Hruban
3866472459 Import EntityManager in ConsoleRunner 2013-03-21 15:49:00 +01:00
David Buchmann
204c1afe9a cleanup event subscriber note 2013-03-21 10:43:01 +01:00
David Buchmann
220f367658 adding some more doc and examples for lifecycle event listeners and subscribers 2013-03-20 00:46:11 +01:00
Benjamin Eberlei
60b8bc63a1 Merge pull request #619 from FabioBatSilva/DDC-2090
[DDC-2090] Fix MultiTableUpdateExecutor with query cache
2013-03-17 13:35:34 -07:00
Fabio B. Silva
39ea24675d Fix DDC-2090 2013-03-17 16:59:33 -03:00
Benjamin Eberlei
acae1aeaaa Fix link in docs 2013-03-17 19:43:09 +01:00
Benjamin Eberlei
c399dcfe58 Add simpler section for 2.4 CLI integration 2013-03-17 19:18:49 +01:00
Benjamin Eberlei
ea19a0063f Huge refactoring of the Getting Started Tutorial to allow for an earlier success with the simple Product entity. 2013-03-17 13:43:16 +01:00
Benjamin Eberlei
4ef8e8c7aa Move all classes to src/ in tutorial rather than in entities/ 2013-03-17 12:45:49 +01:00
Benjamin Eberlei
bd964411e8 Remove models/database first tutorials for now 2013-03-17 12:39:04 +01:00
Benjamin Eberlei
5941d0267d Worked on the Getting Started Guide 2013-03-17 12:26:34 +01:00
Benjamin Eberlei
a7d764f6c0 Moved tools to Advanced topic, included simple setting up tools in Installation. Reworked CLI tool to print a template when no cli-config.php is defined. 2013-03-17 12:16:42 +01:00
Benjamin Eberlei
bdfe6098a4 Reworked parts of the tutorial 2013-03-16 23:36:36 +01:00
Benjamin Eberlei
e0d706219b Start reorganizing documentation with focus on simplicity. 2013-03-16 20:36:09 +01:00
Fabio B. Silva
685c96a1b9 Fix arithmetic priority 2013-03-16 14:33:19 -03:00
Fabio B. Silva
1effd38043 Fix DDC-2252 2013-03-16 01:15:54 -03:00
Benjamin Eberlei
6ee9e2284a Merge branch 'DDC-1666' 2013-03-14 23:41:40 +01:00
Benjamin Eberlei
559303430a [DDC-1666] Fix bug where orphan removal on one-to-one associations lead to unique constraint errors when replacing an entity with a new one. 2013-03-14 23:41:31 +01:00
Benjamin Eberlei
d0419782bd [DDC-2300] Fix version xml mapping and serialization of ClassMetadata. 2013-03-14 23:20:23 +01:00
Benjamin Eberlei
4982e2b6b0 Merge pull request #593 from norzechowicz/hydrator-fix
Fix SimpleObjectHydrator behavior when column not exists in fieldMappings, relationMappings and metaMappings
2013-03-14 14:58:52 -07:00
Benjamin Eberlei
b53fffe252 Fix YAML EntityListener definition in tests 2013-03-14 21:18:54 +01:00
Benjamin Eberlei
622ddd8d05 Refix test 2013-03-14 20:12:20 +01:00
Benjamin Eberlei
e128728105 Fix bugs in tests 2013-03-14 20:09:41 +01:00
Benjamin Eberlei
cf2cd549c8 Fix change in signature for hydrator statement mock. 2013-03-14 19:33:21 +01:00
Stefan Kleff
057e86eb27 Added test based on e468ced00b 2013-03-13 12:29:17 +01:00
Benjamin Eberlei
eca468b9d1 [DDC-2340] Fix bug with dirty collection matching + ordering. 2013-03-12 22:49:30 +01:00
Benjamin Eberlei
dba63c5a61 Merge pull request #579 from BenMorel/cleanup
Unit tests: cleanup of outdated / unused / commented out code
2013-03-12 12:00:47 -07:00
Rajesh Sharma
4841a068be [DDC-2304] accept more than 2 parameters in CONCAT function
- Tested and parser validates at least 2 parameters given
- test added for CONCAT function and indentation fixed
- calling getConcatExpression using call_user_func_array as number of arguments is not known removing dependency to patch DBAL
- maintaining backward compatibility
2013-03-12 19:59:45 +01:00
Benjamin Eberlei
fc86a31c10 Merge pull request #591 from Aitboudad/master
Remove dead code
2013-03-12 11:52:23 -07:00
Benjamin Eberlei
ba4705176e Merge pull request #601 from jankramer/add-contains-comparison
Add 'contains' comparison
2013-03-12 11:38:18 -07:00
Benjamin Eberlei
610e1a96f0 Merge pull request #595 from mnapoli/patch-1
Fixed broken code block in documentation
2013-03-12 11:31:52 -07:00
Benjamin Eberlei
0c4f48766a Merge pull request #602 from alex88/patch-1
Added $isIdentifierColumn documentation
2013-03-12 11:30:36 -07:00
Jean-Guilhem Rouel
8b8d1a5aaa Don't add empty expression to another one 2013-03-12 19:17:11 +01:00
Benjamin Eberlei
ce0dd1c4f4 Merge pull request #610 from afoeder/patch-1
[BUGFIX] Correct link to Functions, Operators, Aggregates
2013-03-12 11:13:11 -07:00
Benjamin Eberlei
3ba0562006 Merge branch 'GH-572' 2013-03-12 19:04:27 +01:00
Norbert Orzechowicz
6a69b4700c [DDC-2282] Fix pagination problem with SQL Server.
ORDER BY removed from all count queries when on SQL Server
Fixed SQLServer ORDER BY problem in paginator CountOutputWalker
Added test to check query with ORDER BY and SQLServerPlatform
2013-03-12 19:03:27 +01:00
Benjamin Eberlei
b6c3fc5b1a Mention flush cannot be called inside postFlush 2013-03-12 18:50:45 +01:00
Stefan Kleff
d937d1fc82 Fixed typo in hints. Caused slow loading of eager entities. 2013-03-12 16:17:14 +01:00
Adrian Föder
ca268c9da6 [BUGFIX] Correct link to Functions, Operators, Aggregates
This fixes the in-page link to the Functions, Operators, Aggregates
section.
2013-03-12 15:56:54 +01:00
Guilherme Blanco
905c0b9d91 Merge pull request #609 from haroldb/patch-1
Fixed typo.
2013-03-11 15:42:09 -07:00
Harold Barker
363df46006 Fixed typo. 2013-03-11 22:11:50 +00:00
Guilherme Blanco
d808c5d895 Merge pull request #608 from pborreli/patch-1
Fixed typo
2013-03-10 17:55:41 -07:00
Pascal Borreli
87e06993d6 Fixed typo 2013-03-11 00:31:50 +00:00
Guilherme Blanco
6d85779f4d Merge pull request #607 from pborreli/typos
Fixed typos
2013-03-10 17:25:31 -07:00
Pascal Borreli
a2cd0f5804 Fixed typos 2013-03-11 00:08:58 +00:00
Jan Kramer
9d5e7eb6e9 Added composer.lock to .gitignore 2013-03-07 14:12:10 +01:00
Jan Kramer
760623346c Added 'contains' comparison 2013-03-07 13:32:56 +01:00
Lars Strojny
acc8b61cd1 Adding EntityManagerDecorator base class as an extension point for EntityManager 2013-03-06 23:30:47 +01:00
Alessandro Tagliapietra
9ce4f9806e Added $isIdentifierColumn documentation
I've added the documentation of the argument $isIdentifierColumn since in case of foreign composite keys it doesn't
2013-03-06 10:48:47 +01:00
Benjamin Eberlei
399584db4c Merge pull request #599 from alexcarol/fix/docs
Removed unnecessary "<?php" from the docs
2013-03-04 14:39:01 -08:00
Benjamin Eberlei
a07c9dfbbd Merge pull request #596 from mnapoli/patch-2
Missing link to a cookbook in the docs
2013-03-04 14:18:33 -08:00
Alex Carol
e809f9c266 Removed unnecessary <?php from the docs 2013-03-03 23:14:58 +01:00
Guilherme Blanco
b30d6dfd8e Merge pull request #597 from MDrollette/fix-proxy-interface
use the extended proxy interface in the same namespace
2013-03-03 09:14:30 -08:00
Johannes M. Schmitt
b4b9709090 adds a new output format 2013-03-03 11:01:43 +01:00
Matthieu Napoli
2eff096ddd Typo 2013-03-02 18:42:38 +01:00
Matthieu Napoli
159daa9985 Reverted incorrect typo fix -_- 2013-03-02 18:40:58 +01:00
MDrollette
1846f5845c alias the proxy class on import to avoid "already exists" error 2013-03-01 11:58:51 -06:00
Matthieu Napoli
32dd7f1a0e Missing link to a cookbook in the docs
The cookbook existed in the docs but there was no link to it in the docs.
2013-03-01 15:16:59 +01:00
Matthieu Napoli
20b46fe17f Fixed broken code block in documentation 2013-03-01 15:11:21 +01:00
Guilherme Blanco
2372a85d9f Merge pull request #594 from v3labs/master
Use inflector in EntityGenerator
2013-02-28 16:02:20 -08:00
Vladislav Veselinov
30fd22a260 Use inflector for add/remove methods 2013-02-28 21:05:41 +02:00
Norbert Orzechowicz
f9519479fc Fix SimpleObjectHydrator behavior when column not exists in fieldMappings, relationMappings and metaMappings 2013-02-28 10:10:28 +01:00
Benjamin Eberlei
e5779a0756 Fix versionadded for IDENTITY() 2013-02-27 12:47:02 +01:00
Benjamin Eberlei
61e4413541 Update theme 2013-02-27 12:40:39 +01:00
Benjamin Eberlei
4f46a08d65 Dont mention 2.2 version in headers anymore. 2013-02-27 12:37:26 +01:00
Benjamin Eberlei
f001c31342 Add versionadded tags to many ffeatures in the docs. 2013-02-27 12:34:10 +01:00
Benjamin Eberlei
6b85d5b5ac Clarified versionadded on EntityListeners feature. 2013-02-27 12:19:08 +01:00
Guilherme Blanco
d5dd7d6f8a Merge pull request #589 from Ocramius/hotfix/DDC-2230
Hotfix for DDC-2230
2013-02-25 21:59:04 -08:00
Guilherme Blanco
32c220497c Merge pull request #585 from Ocramius/hotfix/DDC-2306
Hotfix/DDC-2306
2013-02-25 21:55:44 -08:00
Abdellatif Ait boudad
5206566707 Remove dead code 2013-02-26 00:02:34 +00:00
Marco Pivetta
350fa4f15b Applying fix for failing test for DDC-2230 2013-02-23 01:45:40 +01:00
Marco Pivetta
be24439e2f Adding failing test for DDC-2230
Proxies that implement the Doctrine\Common\PropertyChangedListener are getting eagerly
initialized because the UnitOfWork injects itself into them after they are created.
The test currently fails for what described above, and also verifies if the UoW
is correctly injected in the proxy during lazy loading.
2013-02-23 01:44:58 +01:00
Guilherme Blanco
97ff197198 Merge pull request #587 from stof/patch-1
Fixed the license and the added version for NewObjectExpression
2013-02-22 09:10:36 -08:00
Christophe Coevoet
16b407f535 Fixed the license and the added version 2013-02-22 17:57:50 +01:00
Benjamin Eberlei
8cfbe0c032 Merge pull request #586 from jsjohns/patch-1
Fix EntityManager doc
2013-02-21 14:56:59 -08:00
Joshua Johnson
b55d78e119 Fix EntityManager doc 2013-02-21 17:27:55 -05:00
Benjamin Eberlei
04b216426a Merge branch 'DDC-2310' 2013-02-21 19:02:37 +01:00
Benjamin Eberlei
8fce78fbfb [DDC-2310] Fix regression introduced in SQL Server lock handling. 2013-02-21 19:02:21 +01:00
Marco Pivetta
a5ece5063a Fixing DDC-2306 2013-02-21 02:24:48 +01:00
Marco Pivetta
d8dd5129e7 Failing test for DDC-2306
As of DDC-1734, proxies should have null identifier when the UnitOFWork
refreshes entities and replaces them (marking them as un-managed).
The problem here is that refreshes on entities with same identifier
but different type are still considered same, and the UnitOfWork discards
the proxy instance instead of ignoring it.
2013-02-21 02:21:06 +01:00
Benjamin Eberlei
2980d76adb Merge pull request #581 from Ocramius/hotfix/submodules-removal
Removing submodules
2013-02-15 09:41:38 -08:00
Marco Pivetta
3f16ec0d22 Removing submodules as of doctrine/doctrine2#570 2013-02-15 18:33:29 +01:00
Benjamin Eberlei
805bb5ff9f Remove mentions of PEAR installation method, remove code. 2013-02-15 01:04:29 +01:00
Benjamin Eberlei
6b928600ba Add vendor to .gitignore, add composer.lock and some weird submodule change 2013-02-15 00:49:48 +01:00
Benjamin Eberlei
19da1933a6 Fix dropping the theme folder. 2013-02-15 00:34:48 +01:00
Benjamin Eberlei
afee16e56b Merge pull request #406 from Ocramius/DCOM-96
[DCOM-96] Moving proxy generation and autoloading to common
2013-02-14 02:04:32 -08:00
Marco Pivetta
a58d4ae462 Cleaning up logic of the proxy factory by moving closure generation to own private methods 2013-02-14 10:52:13 +01:00
Marco Pivetta
271f5cf033 Adding fix and tests for DDC-1734 2013-02-14 09:57:12 +01:00
Marco Pivetta
8272ffd23f Proxy generation as of doctrine/common#168 - DCOM-96 2013-02-14 09:57:12 +01:00
Benjamin Eberlei
35fda90473 Merge pull request #570 from Ocramius/cleanup/submodules-removal
Deprecation of PEAR/GIT/TAR autoloading
2013-02-14 00:55:08 -08:00
Benjamin Eberlei
ce594fb152 [DDC-2256] Cleanup patch, move dependency on EntityManager out of ResultSetMapping and let AbstractQuery perform the translation. 2013-02-13 09:05:35 +01:00
Benjamin Eberlei
3d9cb9460a Fix test failing when memcache extension is installed, but memcache server isnt. 2013-02-13 08:46:37 +01:00
Fabio B. Silva
719031f2ef Merge pull request #569 from Ocramius/hotfix/pre-flush-event-args-params
Hotfix/pre flush event args params
2013-02-12 15:39:40 -08:00
Guilherme Blanco
39374b7235 Merge pull request #578 from BenMorel/docfix
Fix for wrong return types in documentation.
2013-02-12 09:05:13 -08:00
Benjamin Morel
35562d3a4d Unit tests: cleaned up outdated / unused / commented out code. 2013-02-12 15:51:24 +00:00
Benjamin Morel
cba1c8295c Fixed wrong return types in documentation. 2013-02-12 11:49:44 +00:00
Benjamin Eberlei
d08c010ae1 Merge pull request #576 from acasademont/patch-1
Update docs/en/reference/batch-processing.rst
2013-02-11 07:50:57 -08:00
Benjamin Eberlei
e86419cfa5 Merge pull request #575 from naitsirch/master
Added YAML configuration example for "Simple Derived Identity" in Docs
2013-02-11 07:50:08 -08:00
Alexander
14bc7f75be Add php 5.5 to the build matrix (travis) 2013-02-09 22:44:14 +01:00
Alexander
1a163cd48d [DDC-2019] Add support for expression in QueryBuilder#addOrderBy() 2013-02-09 22:40:34 +01:00
Alexander
9bf501dd25 Revert "allowed to pass filter objects to the configurator"
This reverts commit a9b4debe37. See the
discussion on the original PR:

https://github.com/doctrine/doctrine2/pull/434

Conflicts:
	lib/Doctrine/ORM/Configuration.php
2013-02-09 20:28:52 +01:00
Albert Casademont
4c90d0cedc Update docs/en/reference/batch-processing.rst
If you have only $batchSize - 1 rows (amongst other cases), the entities are never flushed, you need a final flush outside the loop.

In the bulk insert you should also need a final flush if the number of entities inserted is not a multiple of the $batchSize.
2013-02-08 16:32:03 +01:00
Christian Stoller
07616094d2 Added YAML configuration example for "Simple Derived Identity" in "Composite and Foreign Keys as Primary Key" Tutorial 2013-02-08 11:21:21 +01:00
Guilherme Blanco
3b0a242ab3 Merge pull request #573 from EvanK/patch-1
[Documentation] Noted prePersist event only triggers on first persist
2013-02-07 18:27:05 -08:00
Evan Kaufman
e2ac064914 Noted prePersist event only triggers on first persist
While probably obvious to a core doctrine developer, a user of doctrine would not necessarily know this without doing some digging
2013-02-07 12:59:14 -06:00
Marco Pivetta
673323fc67 Adding warnings about deprecation of GIT, TAR and PEAR autoloading 2013-02-04 23:30:02 +01:00
Marco Pivetta
a928ce48da Using composer autoloader for the test suite 2013-02-04 21:30:02 +01:00
Marco Pivetta
f281dbbf54 Fixing incorrect constructor params for PreFlushEventArgs 2013-02-04 20:46:51 +01:00
Marco Pivetta
3ebed101fd Strong typehinting to avoid incorrect constructor params 2013-02-04 20:45:58 +01:00
Guilherme Blanco
f0674ea034 Merge pull request #564 from BenMorel/f834c37f8a465ca3e23ee9ae62ef0bc4a525454c
Fix a wrong return type
2013-02-02 20:06:44 -08:00
Guilherme Blanco
114827a4b3 Merge pull request #565 from BenMorel/unusedvar
Removed an unused local variable.
2013-02-02 20:05:42 -08:00
Guilherme Blanco
d3cbdfcafa Merge pull request #566 from BenMorel/toolreturntype
Added missing return statement to AbstractCommand.
2013-02-02 20:04:30 -08:00
Guilherme Blanco
ef1ed588b5 Merge pull request #567 from BenMorel/uselessmethods
Removed outdated methods in DatabasePlatformMock
2013-02-02 20:03:26 -08:00
Benjamin Morel
ec1b47a3e8 Removed outdated methods in DatabasePlatformMock. 2013-02-03 01:51:05 +00:00
Benjamin Morel
2bfbe03e37 Fixed return statements in SchemaTool. 2013-02-03 01:42:27 +00:00
Benjamin Morel
4b58c6fc41 Removed an unused local variable. 2013-02-03 01:05:43 +00:00
Benjamin Morel
f834c37f8a Fixed a wrong return type. 2013-02-03 00:48:05 +00:00
Benjamin Eberlei
71a68a5c6f Merge pull request #423 from FabioBatSilva/DDC-1955
DDC-1955 - @EntityListeners
2013-02-02 11:47:46 -08:00
Guilherme Blanco
dea37ed9e8 Merge pull request #554 from beregond/hydrator-fix
Fixed ObjectHydrator when namespace alias is given.
2013-02-02 11:18:00 -08:00
Guilherme Blanco
abc3ba0c7e Merge pull request #561 from ftdebugger/master
fix typo in the documentation
2013-02-02 11:15:47 -08:00
Guilherme Blanco
4651d92d63 Merge pull request #562 from vrana/master
Fix error in QueryBuilder example
2013-02-02 11:15:30 -08:00
Guilherme Blanco
1627fc9596 Merge pull request #563 from FabioBatSilva/DDC-2268
DDC-2268 - Regression test
2013-02-02 11:15:14 -08:00
Fabio B. Silva
452e6912b1 DDC-2268 - regression test 2013-02-02 16:57:17 -02:00
Fabio B. Silva
c5aecd43c8 Fix yaml example 2013-02-02 16:19:35 -02:00
Fabio B. Silva
7764ed9a8b Docs for Entity Listener and Entity Listener Resolver 2013-02-02 15:48:40 -02:00
Jakub Vrana
819e5896bf Fix error in QueryBuilder example 2013-01-30 11:11:09 -08:00
Evgeny Shpilevsky
d65ba04c5c Fix typo in docs 2013-01-30 17:59:38 +03:00
Fabio B. Silva
76c4be1b74 Update docs/en/reference/events.rst
Docs for lifecycle-callback event arg
2013-01-29 12:19:47 -02:00
Fabio B. Silva
7177306536 remove extra comma 2013-01-29 12:14:53 -02:00
Fabio B. Silva
ec2d5af2c7 added missing file 2013-01-29 12:14:53 -02:00
Fabio B. Silva
e6d9d1de47 support naming convention for listeners without mapping. 2013-01-29 12:14:53 -02:00
Fabio B. Silva
46fea51622 use '!==' instead of '!=' 2013-01-29 12:14:53 -02:00
Fabio B. Silva
e9c89cafb9 Fix DocBlock 2013-01-29 12:14:53 -02:00
Fabio B. Silva
3f9a4c82b0 Fix typo 2013-01-29 12:14:53 -02:00
Fabio B. Silva
6d7b3863b5 Use bitmask of subscribed event systems. 2013-01-29 12:14:53 -02:00
Fabio B. Silva
7b0f59ed7c split override test 2013-01-29 12:14:53 -02:00
Fabio B. Silva
0d0fc320b4 Fix DocBlock 2013-01-29 12:14:53 -02:00
Fabio B. Silva
0d0f91a807 move listeners invocation from ClassMetadataInfo to ListenerInvoker 2013-01-29 12:14:53 -02:00
Fabio B. Silva
c60e3e4ba4 remove @LifecycleCallback 2013-01-29 12:14:52 -02:00
Fabio B. Silva
ffc8d032c7 Fix typo 2013-01-29 12:14:52 -02:00
Fabio B. Silva
195b639344 change xml driver to use <lifecycle-callback\> 2013-01-29 12:14:52 -02:00
Fabio B. Silva
6b7e588da5 fix CS 2013-01-29 12:14:52 -02:00
Fabio B. Silva
4be25cb330 small refactoring 2013-01-29 12:14:52 -02:00
Fabio B. Silva
8495eca1a4 rename test 2013-01-29 12:14:52 -02:00
Fabio B. Silva
a01d6583d3 implements a entity listener resolver 2013-01-29 12:14:52 -02:00
Fabio B. Silva
27745bb87b Fix some CS 2013-01-29 12:14:52 -02:00
Fabio B. Silva
a265511368 rename subscribers to listeners 2013-01-29 12:14:52 -02:00
Fabio B. Silva
46474bf457 added doctrine-mapping.xsd 2013-01-29 12:14:52 -02:00
Fabio B. Silva
69bfc71b6a test event listeners lifecycle callback 2013-01-29 12:14:52 -02:00
Fabio B. Silva
256cecbefa evaluate as lifecycle callback if the listener class is not given. 2013-01-29 12:14:52 -02:00
Fabio B. Silva
fd6f592430 support @LifecycleCallback in @EntityListeners 2013-01-29 12:14:52 -02:00
Fabio B. Silva
7021f002f2 php driver 2013-01-29 12:14:52 -02:00
Fabio B. Silva
415c2a95f2 php static driver 2013-01-29 12:14:52 -02:00
Fabio B. Silva
f0b04375de yaml driver 2013-01-29 12:14:52 -02:00
Fabio B. Silva
917aa70c97 test invalid class/method 2013-01-29 12:14:52 -02:00
Fabio B. Silva
7e54ae3702 xml driver 2013-01-29 12:14:52 -02:00
Fabio B. Silva
6be7a03b72 fix previous test 2013-01-29 12:14:52 -02:00
Fabio B. Silva
4cfe2294e3 test lifecycle callbacks event args 2013-01-29 12:14:52 -02:00
Fabio B. Silva
c6adcda567 give event to lifecycle callbacks 2013-01-29 12:14:52 -02:00
Fabio B. Silva
dbd0697c2c test @PostLoad 2013-01-29 12:14:51 -02:00
Fabio B. Silva
315f7ba43b call listeners in UoW 2013-01-29 12:14:51 -02:00
Fabio B. Silva
ccc0a2a94f test entity listener calls 2013-01-29 12:14:51 -02:00
Fabio B. Silva
c5d59ab4c7 test entity listener metadata 2013-01-29 12:14:51 -02:00
Fabio B. Silva
3c223a59c4 move call listeners tests to AbstractMappingDriverTest 2013-01-29 12:14:51 -02:00
Fabio B. Silva
0f081d7c45 support short class name 2013-01-29 12:14:51 -02:00
Fabio B. Silva
368cf73f89 entity listeners mapping 2013-01-29 12:14:51 -02:00
Guilherme Blanco
3d1956d260 Merge pull request #559 from Stroitel/fix-paginator
[Paginator] Added support for order by scalar
2013-01-27 08:58:14 -08:00
aleks
206c251090 Add test with mixed sort 2013-01-27 11:40:40 +02:00
aleks
dc190a297d Fix typo 2013-01-27 11:09:26 +02:00
Guilherme Blanco
8eee325db4 Merge pull request #558 from pkruithof/master
Added missing mapping types
2013-01-26 15:32:22 -08:00
aleks
6662096ed3 Fix typo 2013-01-26 23:27:38 +02:00
aleks
5e6bc0847f Added support for order by scalar 2013-01-26 21:31:45 +02:00
aleks
61634950f3 Add test for order by scalar 2013-01-26 21:21:09 +02:00
Peter Kruithof
46f4b00f8d Added missing mapping types 2013-01-26 16:18:45 +01:00
Szczepan Cieślik
92ada246b5 [DDC-2256] Code improvements. 2013-01-26 09:09:21 +01:00
Szczepan Cieślik
935594578a [DDC-2256] Code refactorization. 2013-01-25 13:15:14 +01:00
Szczepan Cieślik
d7f82221d1 [DDC-2256] Moved aliases translation to ResultSetMapping, fixed tests. 2013-01-25 12:06:13 +01:00
Szczepan Cieślik
1949ff8602 [DDC-2256] Added test for hydrator. 2013-01-24 23:10:50 +01:00
Szczepan Cieślik
23e0bb7345 Fixed ObjectHydrator when namespace alias is given. 2013-01-24 15:50:05 +01:00
Benjamin Eberlei
f5f583d1cc Fix .gitmodules 2013-01-24 00:17:32 +01:00
Benjamin Eberlei
cbcc693e36 Add 'docs/' from commit '8fcf2d45019bf38a1df728353a1e417343c69cfb'
git-subtree-dir: docs
git-subtree-mainline: 271bd37ad3
git-subtree-split: 8fcf2d4501
2013-01-24 00:02:03 +01:00
Benjamin Eberlei
8fcf2d4501 Merge pull request #143 from relo-san/patch-1
Update en/reference/query-builder.rst
2013-01-23 14:51:49 -08:00
Benjamin Eberlei
94526ab602 Merge pull request #145 from HoffmannP/master
key for yaml-files was changed, know Idea what it might affect as well
2013-01-23 14:51:12 -08:00
Benjamin Eberlei
a512c7f89a Merge pull request #152 from pkruithof/patch-1
Documented `guid` mapping type
2013-01-23 14:49:27 -08:00
Peter Kruithof
f5ba83cae5 Documented guid mapping type
refs #456a756febb258b52092fa2640c77bb8400114fa
2013-01-21 15:03:46 +01:00
Benjamin Eberlei
271bd37ad3 Merge branch 'DDC-2243' 2013-01-20 20:32:54 +01:00
Benjamin Eberlei
eedf85cbdb [DDC-2243] Fix bug where a bigint identifier would be casted to an integer, causing inconsistency with the string handling. 2013-01-20 20:31:22 +01:00
Benjamin Eberlei
3c157eafd5 Merge branch 'DDC-2246' 2013-01-20 20:11:20 +01:00
Benjamin Eberlei
5298c03fce [DDC-2246] Fix bug with UnitOfWork#getEntityState() and entities with foreign identifier. 2013-01-20 20:11:08 +01:00
Benjamin Eberlei
916424af49 Merge pull request #551 from FabioBatSilva/DDC-2234
[DDC-2234] FUNCTION() IS NULL comparison
2013-01-20 03:30:01 -08:00
Benjamin Eberlei
d0810c7c19 Remove README.markdown from .gitattributes 2013-01-19 20:04:43 +01:00
Benjamin Eberlei
3a4331db89 Merge pull request #543 from carlosbuenosvinos/master
Make doctrine a Light-weight distribution package in Composer
2013-01-19 11:04:16 -08:00
Fabio B. Silva
93fba518a6 keep braces 2013-01-19 13:38:44 -02:00
Fabio B. Silva
1d42a5385b test NOT EXISTS expression 2013-01-18 23:47:31 -02:00
Fabio B. Silva
4dcd5a1286 Fix DDC-2234 2013-01-18 23:18:50 -02:00
Jonathan H. Wage
c4b0bc5adc Merge pull request #150 from shiroyuki/patch-1
Correct the usage for "nullable"
2013-01-16 13:00:42 -08:00
Juti Noppornpitak
ec23961c7d Update en/cookbook/decorator-pattern.rst 2013-01-16 15:48:15 -05:00
Jonathan H. Wage
27ac88fe28 Update theme again. 2013-01-14 20:12:20 -06:00
Jonathan H. Wage
b369158dc6 Upgrade theme. 2013-01-14 20:08:25 -06:00
Jonathan H. Wage
16533299b0 Update en/reference/installation.rst
Remove reference to download page as it does not exist anymore. We are no longer maintaining packages for download in any proprietary Doctrine repository.
2013-01-14 18:47:18 -06:00
Guilherme Blanco
b30b06852b Merge pull request #549 from FabioBatSilva/DDC-1376
[DDC-1376] Support for order by association when using findBy
2013-01-13 17:16:50 -08:00
Fabio B. Silva
6074755b91 Fix DDC-1376 2013-01-13 22:39:59 -02:00
Jonathan H. Wage
8230b270e3 Merge pull request #148 from FabioBatSilva/composite-identity
Docs for IDENTITY() composite primary key
2013-01-13 10:14:43 -08:00
Jonathan H. Wage
66774f8fe0 Merge pull request #149 from FabioBatSilva/new-operator
Docs for “NEW” Operator Syntax
2013-01-13 10:14:32 -08:00
Fabio B. Silva
6a23e6be96 Docs for “NEW” Operator Syntax 2013-01-13 15:56:11 -02:00
Fabio B. Silva
939ca1b85f Docs for IDENTITY() composite primary key 2013-01-13 15:08:25 -02:00
Benjamin Eberlei
47043a54a5 Update en/reference/filters.rst 2013-01-13 09:37:45 +01:00
Benjamin Eberlei
6f572a61c7 Merge branch 'DDC-2231' 2013-01-12 10:29:20 +01:00
Benjamin Eberlei
3ccbbcb0b5 DDC-2231 - Simplify test 2013-01-12 10:29:11 +01:00
Guilherme Blanco
71efe2109a Merge pull request #548 from nemekzg/DDC-2203
Fix for DDC-2203
2013-01-10 11:13:18 -08:00
nemekzg
cfd1b07ffe Fix for DDC-2203 2013-01-10 16:52:19 +01:00
Stefan Kleff
6032e3efd8 Added test 2013-01-10 16:10:29 +01:00
Stefan Kleff
dc925cc9c5 fixed indentation
Restored old way of injection to just inject it during a refresh
Added injection for initialized proxies
2013-01-10 15:19:44 +01:00
Stefan Kleff
151192ae37 The EntityManager was not injected in uninitialized proxys which are ObjectManagerAware.
I ran into that problem while I had two objects in the identitymap while hydrating a collection: one was new a "real" entity and the other one was an uninitialized proxy. For "real" entities the em is injected in line 2427, for new entities it is injected in 2436->2364, but for proxies this is missing. According to the comment "inject ObjectManager into just loaded proxies." the code in line 2427 should do this, but in fact it is just used if it is a "real" entity or an already initialized proxy. Moving the injection to outside of the condition in line 2411 (if the entity is an unitialized proxy) solves this.
2013-01-10 14:54:52 +01:00
Benjamin Eberlei
0b2d3d4f5d DDC-2173 - Correct issue is about "postFlush" not "preFlush" and add test 2013-01-06 19:16:12 +01:00
Benjamin Eberlei
c20cfed6ae Merge branch 'DDC-2173' 2013-01-06 19:12:02 +01:00
Benjamin Eberlei
512a001e8c DDC-2173 - Add Test for new OnFlush or PreFlush behavior and update UPGRADE.md 2013-01-06 19:11:52 +01:00
Francesc Rosàs
1e669132c2 No huge if clause 2013-01-06 19:05:46 +01:00
Francesc Rosàs
9322ca7052 Ensure onFlush and postFlush events are always raised 2013-01-06 19:05:46 +01:00
Benjamin Eberlei
ce290bc99b DDC-1698 - Allow autoload registration from a Configuration instance 2013-01-06 11:07:19 +01:00
Benjamin Eberlei
7dfe0cae08 DDC-1698 - Prepend autoloader to stack and fix CS 2013-01-06 11:03:58 +01:00
Benjamin Eberlei
4210969087 DDC-2192 - Prevent using append flag in case of where and having to avoid user confusion, because this is not allowed. 2013-01-06 10:33:57 +01:00
Benjamin Eberlei
32f4be83b1 Fix composer to only allow DBAL 2.4 DEV and larger 2013-01-06 10:06:03 +01:00
Guilherme Blanco
fbd1e7bc45 Merge pull request #147 from aaronmu/master
Fix syntax error in one of the orderBy examples.
2013-01-04 06:22:22 -08:00
Aaron Muylaert
b0a24c8baa Update en/reference/query-builder.rst
Fix syntax error in one of the orderBy examples.
2013-01-04 11:29:34 +01:00
Carlos Buenosvinos
1b5d4316fe Update .gitattributes
Fix TYPO
2012-12-29 21:08:21 +01:00
Carlos Buenosvinos
2eb4849a69 XSD, license and upgrade should be distributed 2012-12-28 16:55:49 +01:00
Carlos Buenosvinos
9354e70fd3 Make doctrine a light-weight package based in http://getcomposer.org/doc/02-libraries.md#light-weight-distribution-packages 2012-12-28 16:46:41 +01:00
Carlos Buenosvinos
0577f73ef5 Make doctrine light-weight for composer 2012-12-28 16:41:38 +01:00
Benjamin Eberlei
90b6d5e293 Merge branch 'master' of github.com:doctrine/doctrine2 2012-12-24 10:40:52 +01:00
Benjamin Eberlei
59ffbd5f8d Merge branch 'DDC-2175' 2012-12-24 10:40:10 +01:00
Benjamin Eberlei
e2c1ff1a48 [DDC-2175] Fix bug in JoinedSubclassPersister 2012-12-24 10:39:23 +01:00
Benjamin Eberlei
904effcf4e Merge pull request #538 from FabioBatSilva/identity-composite-key
IDENTITY() Support composite primary key
2012-12-24 01:19:05 -08:00
Benjamin Eberlei
7cf26950cc Merge branch 'DDC-2187' 2012-12-24 10:15:47 +01:00
Klein Florian
8443eee628 use base events 2012-12-24 10:15:25 +01:00
Benjamin Eberlei
e319e34783 Merge pull request #528 from BenMorel/master
Documentation fixes
2012-12-23 12:22:09 -08:00
Benjamin Eberlei
d8b94b0527 Some text refactorings in tutorial 2012-12-23 13:05:54 +01:00
Fabio B. Silva
3d99711ac8 fix PHPDoc 2012-12-22 10:36:23 -02:00
Fabio B. Silva
99ab58febd Fix CS 2012-12-22 10:36:23 -02:00
Fabio B. Silva
2e90cd9924 Identity function support composite primary key 2012-12-22 10:36:23 -02:00
Benjamin Eberlei
6f5948746e Merge pull request #540 from FabioBatSilva/DDC-2208
[DDC-2208] Fix DDC-2208
2012-12-22 03:53:14 -08:00
Benjamin Eberlei
015771f10b Merge pull request #541 from PSchwisow/master
Fix DDC-1690
2012-12-22 03:38:03 -08:00
Patrick Schwisow
0b21046fce [DDC-1690] Added an empty line as requested. 2012-12-21 15:35:32 -06:00
Patrick Schwisow
bc6921504a [DDC-1690] Created unit test 2012-12-21 14:32:10 -06:00
Fabio B. Silva
b6b493f450 test parentheses 2012-12-21 10:00:40 -02:00
Fabio B. Silva
eda43c77bb Fix DDC-2208 2012-12-21 10:00:40 -02:00
Guilherme Blanco
a8340cc980 Merge pull request #146 from noginn/patch-1
Added missing "new" keyword for event listener
2012-12-21 03:46:51 -08:00
Guilherme Blanco
8b5e4a9a52 Merge pull request #542 from FabioBatSilva/DDC-2205
[DDC-2205] Fix DDC-2205
2012-12-21 03:45:07 -08:00
Fabio B. Silva
2104ae9935 fix DDC-2205 2012-12-20 23:06:30 -02:00
Patrick Schwisow
5627993827 Fix DDC-1690
Added the lines suggested by the original reporter.
2012-12-20 15:31:46 -06:00
Tom Graham
e17fc6c474 Added missing "new" keyword for event listener 2012-12-20 20:00:50 +00:00
Thomas Rothe
86c33d78d0 inheritance with composite keys
added tests for single table inheritance
2012-12-17 11:01:20 +01:00
Thomas Rothe
fb055ca75d fixed problems with joined inheritance and composite keys
SchemaTool now creates all Id columns not just only the first one.
Insert statement for child entity now contains parameter for additional key columns only once.
2012-12-16 18:20:10 +01:00
Benjamin Eberlei
4bbfe0ce8a Merge pull request #536 from KonstantinKuklin/master
add missed branch
2012-12-16 04:05:57 -08:00
Benjamin Eberlei
b6fd203355 Merge branch 'DDC-2199' 2012-12-16 12:58:01 +01:00
Benjamin Eberlei
7c337748b6 DDC-2199 / DDC-2192 - Versioned fields didnt work in XML/YAML mapping 2012-12-16 12:57:53 +01:00
Benjamin Morel
774bb3fec4 Fixed missed documentation issues in Doctrine\ORM 2012-12-14 20:12:56 +00:00
Benjamin Morel
aadce3c747 Fixed documentation for Doctrine\Tests 2012-12-14 18:55:49 +00:00
Benjamin Morel
c405f6d3f6 Fixed documentation for Doctrine\Tests\Mocks 2012-12-14 18:55:28 +00:00
Benjamin Morel
76f2ba50eb Fixed documentation for Doctrine\Tests\DbalTypes 2012-12-14 18:55:16 +00:00
Konstantin Kuklin
8e2c060fc7 add missed branch 2012-12-14 18:04:19 +04:00
Benjamin Morel
ad967e8e22 Fixed documentation for Doctrine\ORM\Tools\Pagination 2012-12-14 13:13:22 +00:00
Benjamin Morel
2524c878b6 Fixed documentation for Doctrine\ORM\Tools\Export 2012-12-14 13:02:12 +00:00
Benjamin Morel
0122d8d36c Fixed documentation for Doctrine\ORM\Tools\Event 2012-12-14 12:49:59 +00:00
Benjamin Morel
71e78014e5 Fixed documentation for Doctrine\ORM\Tools\Console 2012-12-14 12:49:05 +00:00
Benjamin Morel
e72445b836 Fixed documentation for Doctrine\ORM\Tools 2012-12-13 18:55:44 +00:00
Benjamin Morel
7869ec714d Fixed unused 'use' statements.
Fixed missed documentation issues in Doctrine\ORM
2012-12-13 18:19:21 +00:00
Peter Hoffmann
4c1759eecb Keyname was obviously changed in (latest) 2.3.1, cost me some hours to figure out, NOT cool! 2012-12-13 17:53:44 +01:00
Benjamin Morel
ba16789843 Fixed documentation for Doctrine\ORM\Query 2012-12-13 16:36:14 +00:00
Benjamin Morel
28966e2087 Fixed documentation for Doctrine\ORM\Query\Expr and Doctrine\ORM\Query\Filter 2012-12-13 12:05:34 +00:00
Benjamin Morel
d4357801a2 Fixed documentation for Doctrine\ORM\Query\Exec 2012-12-13 11:57:46 +00:00
Benjamin Morel
98ac6b5fec Fixed documentation for Doctrine\ORM\Query\AST 2012-12-13 11:52:19 +00:00
Benjamin Morel
f743da0e02 Fixed documentation for Doctrine\ORM\Query\AST\Functions 2012-12-13 10:42:25 +00:00
Benjamin Morel
42e83a2716 Fixed documentation for ORM\Proxy 2012-12-13 10:28:55 +00:00
Mykola Zyk
ca1c6498ec Update en/reference/query-builder.rst
Adding note for $append parameter of QueryBuilder::add() method.
2012-12-07 19:44:47 +02:00
Benjamin Eberlei
df1336dd26 Merge pull request #529 from francisbesset/options_join_columns
[DDC-2182] Options join columns
2012-12-04 04:29:01 -08:00
Francis Besset
657a54da84 Passed column options to the join column 2012-12-04 12:26:40 +01:00
Francis Besset
df2bfbb636 Fixed trailing spaces on SchemaTool 2012-12-04 12:23:55 +01:00
Benjamin Morel
43b301f22b Fixed English mistakes 2012-12-03 11:02:29 +00:00
Benjamin Morel
159ece8943 Fixed documentation for ORM\Persisters 2012-12-03 10:15:43 +00:00
Benjamin Morel
46e6ada4f9 Fixed documentation for ORM\Mapping 2012-12-03 09:36:08 +00:00
Guilherme Blanco
4b4126dfa6 Merge pull request #142 from pborreli/typos
Fixed typos
2012-12-02 12:41:07 -08:00
Benjamin Morel
4714a53c32 Fixed documentation for ORM\Internal 2012-12-02 19:46:34 +00:00
Pascal Borreli
8717088ed1 Fixed typos 2012-12-02 17:58:15 +00:00
Benjamin Morel
fad22d1e60 Fixed documentation for ORM\Event and ORM\Id 2012-12-02 12:37:56 +00:00
Francis Besset
56b230a1f0 Fixed typo 2012-12-01 19:41:51 +01:00
Benjamin Morel
dacdd6cd89 Documentation (docblock) fixes. 2012-12-01 16:28:06 +00:00
Guilherme Blanco
4bb6ff637c Merge pull request #527 from BenMorel/master
Fix documentation for Doctrine\ORM\Query\AST\Node::dispatch()
2012-11-30 12:43:49 -08:00
Benjamin Morel
26d6f5ce4e Fixed coding standard issue, as per @stof's request. 2012-11-30 19:10:53 +00:00
Benjamin Morel
5edc287848 Fixed documentation for Doctrine\ORM\Query\AST\Node::dispatch(). 2012-11-30 11:41:03 +00:00
Benjamin Eberlei
95334e9764 Clarify BC break in DDC-2156 2012-11-27 22:25:58 +01:00
Guilherme Blanco
29f0b678cf Merge pull request #526 from FabioBatSilva/DDC-2172
[DDC-2172] Fix EntityGenerator get literal type
2012-11-27 12:14:12 -08:00
Guilherme Blanco
f4c0fd1744 Added support to subselects in update item. 2012-11-27 14:36:56 -05:00
Fabio B. Silva
bac92f4d3e Fix CS 2012-11-27 16:58:48 -02:00
Fabio B. Silva
d1dc72b65a refactoring tests 2012-11-27 14:38:18 -02:00
Fabio B. Silva
41b907606f Fix DDC-2172 2012-11-27 14:29:02 -02:00
Benjamin Eberlei
46e6753649 Merge pull request #523 from jankramer/DDC-2074
[DDC-2074] Bugfix regarding clearing cloned PersistentCollections
2012-11-25 11:13:28 -08:00
Jan Kramer
5b3f54429a [DDC-2074] Fixed bug regarding clearing PC's without owner
When calling clear on a PC that has no owner (e.g. because it was
cloned), it can't be deleted as there is no metadata available.
In these cases, it shouldn't be scheduled for deletion.
2012-11-25 19:27:39 +01:00
Jan Kramer
9b78100378 [DDC-2074] Added test for PersistentCollection#clear. 2012-11-25 19:27:24 +01:00
Benjamin Eberlei
05e5ae8bfa Merge pull request #413 from FabioBatSilva/refactory-persisters
code refactorings on persister
2012-11-25 03:50:52 -08:00
Benjamin Eberlei
173333c861 Merge pull request #517 from nemekzg/DDC-1765
Fix for DDC-1765
2012-11-25 03:38:39 -08:00
Benjamin Eberlei
072d8a8a13 Merge pull request #515 from tranver/master
Fixes sandbox cli: The helper "em" is not defined.
2012-11-25 03:38:03 -08:00
Benjamin Eberlei
8457a9e77e Merge pull request #518 from Fran6co/fix-double-on
regression fix for left joins (double ON)
2012-11-25 03:27:17 -08:00
Benjamin Eberlei
390fbd8493 Merge pull request #87 from FabioBatSilva/patch-6
docs for association/attribute override
2012-11-24 02:34:56 -08:00
Benjamin Eberlei
1f2050f20d Merge pull request #101 from merk/rtel
Initial ResolveTargetEntityListener cookbook entry
2012-11-24 02:34:36 -08:00
Benjamin Eberlei
7f0ff6a079 Merge pull request #104 from shieldo/missing_joincolumn_in_yaml
added missing JoinColumn node for xml and yaml for many-to-one unidirect...
2012-11-24 02:34:17 -08:00
Benjamin Eberlei
bc9c7d1c07 Merge pull request #117 from cordoval/feature/addTutorialOverrideMappingAnnotations
[DDC-1872] add tutorial for override annotations mappings
2012-11-24 02:33:58 -08:00
Benjamin Eberlei
9f86cda681 Merge pull request #119 from Spabby/master
Cleaner to remove the note, and modify the code to put the doctrine_bootstrap.php include first?
2012-11-24 02:25:17 -08:00
Benjamin Eberlei
52bc9a82ef Merge pull request #121 from frosas/document-pre-and-post-flush-events
Remove "before the lists of scheduled changes are cleared"
2012-11-24 02:24:57 -08:00
Benjamin Eberlei
d84462923c Merge pull request #122 from kdambekalns/patch-1
Update en/reference/working-with-associations.rst
2012-11-24 02:24:10 -08:00
Benjamin Eberlei
106620e6dd Merge pull request #123 from bamarni/patch-4
simplified interface check
2012-11-24 02:23:55 -08:00
Benjamin Eberlei
0cfc7dd402 Merge pull request #124 from bamarni/patch-5
fixed typo
2012-11-24 02:23:41 -08:00
Benjamin Eberlei
ced44e1916 Merge pull request #125 from Ocramius/patch-4
Update en/reference/tools.rst
2012-11-24 02:22:30 -08:00
Benjamin Eberlei
9873c9fc04 Merge pull request #127 from lennerd/fix-typo-1
Fixed typo for array mapping type
2012-11-24 02:22:12 -08:00
Benjamin Eberlei
07e6a3ec68 Merge pull request #129 from md2perpe/patch-1
Update en/tutorials/getting-started.rst
2012-11-24 02:22:01 -08:00
Benjamin Eberlei
24228711fd Merge pull request #133 from Ocramius/patch-5
Removing removed API description from docs
2012-11-24 02:21:53 -08:00
Benjamin Eberlei
4a01d2904c Merge pull request #138 from fulopattila122/master
The yaml mapping part probably shows the path/Namespace key-value pair in the wrong order
2012-11-24 02:21:43 -08:00
Guilherme Blanco
697e7b1ca5 Merge pull request #471 from chives/DDC-2052
Extended TreeWalker interface with getQueryComponents() and setQueryComponent() which are used by the Parser class
2012-11-22 07:39:59 -08:00
Francisco Facioni
c84099508f added outer left join 2012-11-22 09:59:44 -03:00
Francisco Facioni
9c59ed5891 regression fix for left joins (double ON) 2012-11-20 12:30:52 -03:00
Guilherme Blanco
f7e9a91b5c Merge pull request #141 from hifi7/patch-1
Fix wrong date format in example PrePersist method
2012-11-20 07:01:03 -08:00
Lukasz Cybula
afdb92ff9b Added note about new methods in UPGRADE.md 2012-11-20 12:42:05 +01:00
Lukasz Cybula
08a3423ce2 CS fixes 2012-11-20 12:42:05 +01:00
Lukasz Cybula
7b1d84cbdb Moved CustomTreeWalkersJoinTest to proper namespace and fixed licence 2012-11-20 12:42:05 +01:00
Lukasz Cybula
2c99ecf586 Extended TreeWalker interface with getQueryComponenets() and setQueryComponent() which are used by the Parser class 2012-11-20 12:42:05 +01:00
hifi7
f221faff28 Fix wrong date format in example PrePersist method 2012-11-20 05:37:43 +01:00
Benjamin Eberlei
f25b098029 [DDC-2055] Add Test for EntityRepository#createResultSetMappingBuilder 2012-11-19 17:45:14 +01:00
Benjamin Eberlei
941670aa9d [DDC-2055] Add EntityRepository#createResultSetMappingBuilder() 2012-11-19 17:09:18 +01:00
Benjamin Eberlei
17bb564534 [DDC-2055] Some adjustments to ResultSetMappingBuildder patch 2012-11-19 16:54:56 +01:00
nemekzg
727647902c Fix for DDC-1765 2012-11-17 16:18:18 +01:00
Benjamin Eberlei
9ea40edb48 Discuss branching strategy 2012-11-17 10:48:46 +01:00
Benjamin Eberlei
3666d1485a Merge pull request #516 from lstrojny/bug/phpunit-composer
Allow running tests with composer
2012-11-17 01:25:16 -08:00
Benjamin Eberlei
2a69d2d1f9 Update Common dependency 2012-11-17 09:52:11 +01:00
Lars Strojny
bb3eeffe78 Allow running tests with composer 2012-11-17 03:41:32 +01:00
Chris Schuhmann
1d04902326 Fix sandbox cli
In afd8ea9 $helpers became an instance of HelperSet and caused an "The helper "em" is not defined." exception.
2012-11-17 00:12:29 +01:00
Guilherme Blanco
30bddbd254 Merge pull request #139 from jorns/master
Update the i in index to uppercase
2012-11-16 11:26:02 -08:00
jorns
072a65bd26 Updated @Index lower i to Upper i
This fixes the error:
[Semantical Error] The annotation "@Doctrine\ORM\Mapping\index"
2012-11-16 11:21:06 +01:00
Benjamin Eberlei
0782b8a682 Expanded first paragraphs 2012-11-16 00:08:25 +01:00
Benjamin Eberlei
da6236f830 More on testing 2012-11-16 00:01:37 +01:00
Benjamin Eberlei
6821e633fd Add CONTRIBUTING.md 2012-11-15 23:57:34 +01:00
Benjamin Eberlei
d0428df9bd Merge pull request #513 from FabioBatSilva/annot-enum
Enumeration support
2012-11-15 10:52:14 -08:00
Fabio B. Silva
77827303d2 Fix CS 2012-11-13 14:54:37 -02:00
Fabio B. Silva
c1de4c5fda update doctrine-common 2012-11-13 14:13:49 -02:00
Fabio B. Silva
a07c63dde6 added support for @Enum 2012-11-13 14:13:48 -02:00
Benjamin Eberlei
0d58e6627a Merge branch 'DDC-2109' 2012-11-12 15:48:19 +01:00
Benjamin Eberlei
f453d6c85b [DDC-2109] Fix bug with ResolveTargetEntityListener and ManyToMany associations. 2012-11-12 15:48:10 +01:00
Benjamin Eberlei
918ea1cdd8 Merge pull request #449 from mvrhov/DDC-1958
Pager fix for DDC-1958
2012-11-12 06:02:32 -08:00
Benjamin Eberlei
935842845b Merge branch 'DDC-2138' 2012-11-12 15:01:30 +01:00
Benjamin Eberlei
624ef309f0 Remove unnecssary code 2012-11-12 15:01:20 +01:00
Benjamin Eberlei
5e2a433828 Inlined Test and Entities into DDC2138Test 2012-11-12 14:59:48 +01:00
Stefano Rodriguez
482da95352 The schema tool now doesn't add a foreign constraint when subclassess of a STI use the same field to map relations with entities of different classes 2012-11-12 14:59:48 +01:00
Stefano Rodriguez
b1c69ebab9 adedd failing test for PR #440 2012-11-12 14:19:31 +01:00
Miha Vrhovnik
8fe9fa0dc7 extracted pgsql sql generation into a helper method 2012-11-12 13:48:55 +01:00
Miha Vrhovnik
c7a75f477f The distinct query should replicate the fields in order by clause and the order by clause itself from inner query
This fixes DDC-1958
2012-11-12 13:18:46 +01:00
Benjamin Eberlei
4e04daaed4 Merge pull request #466 from ethanresnick/patch-1
Use `protected` so EntityGenerator can be extended
2012-11-12 04:05:23 -08:00
HarmenM
b6b75d3a27 Modified the WhereInWalkerTest to be compatible with a single InputParameter. 2012-11-12 12:30:03 +01:00
HarmenM
8a29d91d15 Update lib/Doctrine/ORM/Tools/Pagination/Paginator.php
Replaced the foreach loop adding all IDs as single parameters with a single parameter which injects the IDs as an array.
2012-11-12 12:30:03 +01:00
HarmenM
88d0933a6e Update lib/Doctrine/ORM/Tools/Pagination/WhereInWalker.php
replaced the for-loop which adds the InputParameters for a single InputParameter for use with an array instead of a set of scalars.
2012-11-12 12:30:03 +01:00
Benjamin Eberlei
a0e8ca128c Merge pull request #482 from Halleck45/cli-customizable
user can set its own commands in the cli-config.php file
2012-11-12 03:13:34 -08:00
Benjamin Eberlei
79315cb7de Merge pull request #510 from ruian/patch-2
CS on QueryBuilder
2012-11-12 02:52:54 -08:00
Benjamin Eberlei
ccfd2adf5b Merge pull request #511 from Ocramius/hotfix/console-runner-version
Fixing reference to Doctrine\ORM\Version
2012-11-12 02:42:30 -08:00
Marco Pivetta
7520a745c2 Fixing reference to Doctrine\ORM\Version 2012-11-12 11:31:19 +01:00
Julien 'ruian' Galenski
055d7f261c CS on queryBuilder 2012-11-12 10:23:50 +01:00
Attila Fulop
3cee83be2b Swapped order of path/Entities at Simplified YAML Driver
According to my experience, the path has to be the key, and Namespace prefix the value in the array.
2012-11-11 21:19:18 +02:00
Benjamin Eberlei
fa3f1e088d Add test for boolean parameter type infering 2012-11-09 22:03:40 +01:00
Guilherme Blanco
2edccbfbc8 Merge pull request #137 from Squazic/patch-1
Grammar fix
2012-11-09 09:48:59 -08:00
Squazic
56eec8979b Grammar fix 2012-11-09 11:55:34 -05:00
Guilherme Blanco
182ed07a41 Merge pull request #509 from smottt/master
SchemaTool ignoring 'fixed' option
2012-11-07 13:58:56 -08:00
Guilherme Blanco
af39687f45 Merge pull request #135 from nanocom/patch-1
Fixed typo
2012-11-07 13:58:05 -08:00
Arnaud Kleinpeter
9f898b0b90 Update en/tutorials/getting-started.rst 2012-11-07 22:31:40 +01:00
Metod
cfee331006 SchemaTool ignoring 'fixed' option fixed 2012-11-07 16:31:31 +01:00
Guilherme Blanco
09d53f0e58 Merge pull request #508 from mnapoli/DDC-2073
Fix and test for DDC-2073
2012-11-06 14:52:34 -08:00
Matthieu Napoli
c2d9197900 Fix and test for DDC-2073 2012-11-06 15:12:19 +01:00
Matthieu Napoli
e15cf324c3 Fix and test for DDC-2073 2012-11-06 15:05:53 +01:00
Fabio B. Silva
122569eee0 Fix CS 2012-11-05 22:52:43 -02:00
Fabio B. Silva
0fa89647d2 Fix DocBlock 2012-11-05 22:52:42 -02:00
Fabio B. Silva
ecaa3fd03e Third round of refactorings on BasicEntityPersister 2012-11-05 22:52:42 -02:00
Fabio B. Silva
c8899c2b3b second round of CS fixes 2012-11-05 22:52:42 -02:00
Fabio B. Silva
a295525501 Fix some CS 2012-11-05 22:52:41 -02:00
Fabio B. Silva
827153624c Second round of refactorings on BasicEntityPersister 2012-11-05 22:52:41 -02:00
Fabio B. Silva
04e1838c92 change 'use' statements 2012-11-05 22:52:41 -02:00
Fabio B. Silva
14a2b61671 code refactoring on SingleTablePersister 2012-11-05 22:52:40 -02:00
Fabio B. Silva
9a041c8fdb code refactoring on OneToManyPersister 2012-11-05 22:52:40 -02:00
Fabio B. Silva
2b1aaebe18 code refactoring on ManyToManyPersister 2012-11-05 22:52:40 -02:00
Fabio B. Silva
07492bda9d fix JoinedSubclassPersister#delete when supports foreign key 2012-11-05 22:52:39 -02:00
Fabio B. Silva
3156c1549d code refactoring on JoinedSubclassPersister 2012-11-05 22:52:39 -02:00
Fabio B. Silva
308b54a8f3 code refactoring on BasicEntityPersister 2012-11-05 22:52:39 -02:00
Fabio B. Silva
7e348b7815 small refacory on AbstractEntityInheritancePersister 2012-11-05 22:50:24 -02:00
Fabio B. Silva
e6f08f0b92 remove '_' prefix at AbstractCollectionPersister 2012-11-05 22:50:23 -02:00
Fabio B. Silva
b998a522b0 remove '_' prefix at BasicEntityPersister 2012-11-05 22:50:23 -02:00
Guilherme Blanco
d6d5c341e2 Merge pull request #486 from FabioBatSilva/DDC-2084
Fix DDC-2084
2012-11-05 16:38:35 -08:00
Guilherme Blanco
262c3eea6b Merge pull request #506 from FabioBatSilva/DDC-2121
Fix DDC-2121
2012-11-05 16:27:34 -08:00
Fabio B. Silva
62f43e6ea2 remove require_once 2012-11-05 22:23:44 -02:00
Fabio B. Silva
c4e6a04676 remove duplicate return statement 2012-11-05 22:23:44 -02:00
Fabio B. Silva
a09a5b9b7b Fix DDC-2084 2012-11-05 22:23:44 -02:00
Guilherme Blanco
57e5fa9873 Merge pull request #496 from arse/master
Testing for key existance in basicEntityPersister / getIndividualValue
2012-11-05 16:20:26 -08:00
Guilherme Blanco
a44579303c Merge pull request #493 from nmpolo/codegenerationfixes
Do not add trailing whitespace to blank lines
2012-11-05 16:19:39 -08:00
Guilherme Blanco
863d14a61a Merge pull request #503 from sebastianbauer/master
added unsigned mapping to SchemaTool options
2012-11-05 16:16:25 -08:00
Guilherme Blanco
7a895209e3 Merge pull request #502 from gwis/master
Fix for invalid 'double-ON' SQL generation with entity inheritance type JOINED.
2012-11-05 16:15:45 -08:00
Guilherme Blanco
283ed55824 Merge pull request #504 from nemekzg/DDC-1241
Proposed fix for DDC-1241
2012-11-05 16:14:48 -08:00
Guilherme Blanco
6949a95782 Merge pull request #505 from BenMorel/fix-errors
Fix errors in JoinClassPathExpression and SqlWalker
2012-11-05 16:12:31 -08:00
Fabio B. Silva
2f7e970c5f Fix DDC-2121 2012-11-05 21:53:07 -02:00
Benjamin Morel
88b29a4e59 Fixed errors:
- Typo in variable name in JoinClassPathExpression;
 - Undefined class AST\ArithmeticPrimary (x2);
 - QueryException::invalidPathExpression() expects a PathExpression, not a string.
2012-11-05 14:45:57 -08:00
nemekzg
9705ee89d9 Proposed fix for DDC-1241 2012-11-05 19:55:54 +01:00
Sebastian Bauer
a27be2fab6 added unsigned mapping to SchemaTool options 2012-11-05 19:49:16 +01:00
Gordon Stratton
9e916a2893 Fix for invalid 'double-ON' SQL generation with entity inheritance type JOINED.
In SqlWalker::walkJoin(), SqlWalker::walkRangeVariableDeclaration() can be
called which may produce an 'ON' clause if the entity inheritance type is
JOINED. As walkJoin() may then produce another ON clause, this results in
invalid SQL (e.g. '... ON foo = bar ON (baz = quux) ...' when the inheritance
type is JOINED.

This adds a test and a fix for the problem, by checking for an inheritance type
of JOINED in walkJoin() and using AND instead of ON in the appropriate place.

It seems like this part of the code is begging to be refactored. This is my
first foray into Doctrine internals and can't see a way to do this without
stomping all over the rest of the code, but this section seems ripe for cleanup
by somebody who is familiar.
2012-11-05 01:19:25 -08:00
Guilherme Blanco
ff80e99cc9 Merge pull request #501 from jeremymarc/patch-1
Allow 0 id for Entity
2012-11-04 19:22:57 -08:00
Jeremy Marc
26dd533662 Compare to null instead of using isset 2012-11-04 19:04:13 -08:00
Jeremy Marc
84477440b6 Allow 0 id for Entity
When using a 0 id, it's throwing InvalidArgumentException (Binding entities to query parameters only allowed for entities that have an identifier.)
2012-11-04 17:41:08 -08:00
Nick Masters
e402a0c078 Spaces around ! sign 2012-11-04 15:22:32 +00:00
Nick Masters
3a8ea7260c Merge remote-tracking branch 'origin/master' into codegenerationfixes 2012-11-04 15:14:54 +00:00
Guilherme Blanco
fc40c437cb Merge pull request #489 from stof/cs_fixes
Fixed coding standards in the Tools namespace
2012-11-03 10:04:10 -07:00
Christophe Coevoet
1b01a074dc Fixed the testsuite 2012-11-03 17:07:56 +01:00
Christophe Coevoet
1d3fe87215 Removed an unused private method in the SchemaValidator 2012-11-03 16:37:34 +01:00
Christophe Coevoet
5a6c398ea0 Fixed coding standards in the Tools namespace 2012-11-03 16:37:31 +01:00
TR
73e6164096 Update lib/Doctrine/ORM/Persisters/BasicEntityPersister.php
coding standards change
2012-11-03 09:47:08 +00:00
Guilherme Blanco
7d7287a1ba Merge pull request #434 from bamarni/filter-objects
allowed to pass filter objects to the configurator
2012-11-02 17:52:23 -07:00
Guilherme Blanco
ec1950d3ca Merge pull request #448 from stefanklug/master-parserFix
Fixed Parser problem for SELECT (((3))) as ....
2012-11-02 17:46:43 -07:00
Guilherme Blanco
515847bece Merge pull request #498 from lanthaler/improve-generated-entity-doc
Improve DocBlock annotations of generated entities
2012-11-02 17:27:11 -07:00
Guilherme Blanco
409516e86c Merge pull request #499 from md2perpe/master
Speling: "invidiual" -> "individual"
2012-11-02 11:13:19 -07:00
Per Persson
b5ac85d19a Update lib/Doctrine/ORM/Persisters/BasicEntityPersister.php
Speling
2012-11-02 18:37:46 +01:00
Markus Lanthaler
1b7ca67fdb Improve DocBlock annotations of generated entities
Currently, the DocBlock annotations for member variables contain the variable name as description which is redundant and should be removed. Furthermore the class is annotated with the FQN instead of just the name. This makes automatically generated documentation quite ugly.
2012-11-02 17:15:44 +01:00
Guilherme Blanco
129d6efd85 Merge pull request #497 from vclayton/DDC-2113
[DDC-2113] Surround WHERE clause with parens if using SQLFilter
2012-11-02 07:27:28 -07:00
Vaughn Clayton
ae30ce4596 [DDC-2113] Surround WHERE clause with parens if using SQLFilter 2012-11-02 08:48:57 -04:00
TR
185a0fb19c refactoring getIndividualValue for valid key value
refactoring getIndividualValue
2012-11-02 00:33:55 +00:00
TR
a65996f74c notice is thrown up if no identifier values found
wrapping the setting of value with an array_key_exists to prevent a notice from being thrown
2012-11-01 23:59:57 +00:00
Nick Masters
0a2ba38e58 Add new line to end of file 2012-10-30 22:42:01 +00:00
Nick Masters
0f92944edd Do not add trailing whitespace to blank lines 2012-10-30 22:22:04 +00:00
Guilherme Blanco
98c5b34f2b Merge pull request #492 from hason/notlike
Added NOT LIKE expression
2012-10-27 11:01:17 -07:00
Martin Hasoň
7f33143502 Added NOT LIKE expression 2012-10-25 12:58:19 +02:00
Guilherme Blanco
f5c1b38e2d Merge pull request #491 from eventhorizonpl/optimise_use
remove unused use statements
2012-10-23 17:13:44 -07:00
Michal Piotrowski
a55b46b4bf remove unused classes 2012-10-23 18:19:28 +02:00
Marco Pivetta
95b8e27bc5 Removing removed API description from docs 2012-10-23 15:21:55 +03:00
Guilherme Blanco
e9c7deae4f Merge pull request #490 from eventhorizonpl/fix_test
fix StatementMock bindParam parameters
2012-10-22 18:56:35 -07:00
Michal Piotrowski
f6cf8f2f0c fix StatementMock bindParam parameters 2012-10-23 00:09:38 +02:00
Guilherme Blanco
9d0b254407 Merge pull request #481 from beejeebus/master
check for false as a return value from get_parent_class(), not null
2012-10-21 20:54:22 -07:00
Guilherme Blanco
38d8c7f0d9 Merge pull request #467 from docteurklein/fix-bool-type-binding
add bool detection when inferring type
2012-10-21 18:39:29 -07:00
Guilherme Blanco
a16a935bff Merge pull request #472 from twinh/master
Fixed empty namespace in generated code when repository class do not have namespace
2012-10-21 18:38:53 -07:00
Guilherme Blanco
cd7ef6e7a7 Merge pull request #484 from jappie/master
Prevented "Undefined index" notice when updating
2012-10-21 18:35:38 -07:00
Guilherme Blanco
814f2f9e03 Merge pull request #487 from FabioBatSilva/DDC-2069
Fix DDC-2069
2012-10-20 20:00:54 -07:00
Guilherme Blanco
2c0feb2a46 Merge pull request #488 from FabioBatSilva/DDC-2079
Fix DDC-2079
2012-10-20 19:59:58 -07:00
Fabio B. Silva
b03388293f Fix typo 2012-10-20 15:44:09 -03:00
Fabio B. Silva
fb467a1196 Fix DDC-2079 2012-10-20 15:37:13 -03:00
Fabio B. Silva
86fddfed9a Fix DDC-2069 2012-10-20 00:28:38 -03:00
Jasper N. Brouwer
1a17b1670b Added testcase for DDC-2086 2012-10-19 09:15:07 +02:00
Johannes
f4cdded06c Merge pull request #131 from adrienbrault/patch-2
Add UUID,CUSTOM generatedValue values to annot ref
2012-10-18 09:24:14 -07:00
Adrien Brault
e3bbd058f2 Add UUID,CUSTOM generatedValue values to annot ref 2012-10-18 18:34:22 +03:00
Jasper N. Brouwer
0cfc37d757 Prevented "Undefined index" notice when updating
While executing updates on an entity scheduled for update without
a change-set, an "Undefined index" notice is raised.
2012-10-17 21:50:09 +02:00
Johannes
54941d1f09 Merge pull request #130 from drak/patch-1
Add example for index definition
2012-10-17 12:06:44 -07:00
Drak
05b170fe99 Add example for index definition 2012-10-17 20:41:15 +02:00
Halleck45
d3c58d83a5 user can set its own commands in the cli-config.php file 2012-10-16 17:03:18 +02:00
justin.randell
ca82a4720b check for false as a return value from get_parent_class(), not null 2012-10-16 15:04:25 +11:00
Per Persson
5657e199bd Update en/tutorials/getting-started.rst
Spelling: UDPATE -> UPDATE
2012-10-15 17:28:12 +03:00
Benjamin Eberlei
56e96793c0 Merge branch 'DDC-2067' 2012-10-12 21:47:39 +02:00
Benjamin Eberlei
deb6327b56 [DDC-2067] Refactor and fix bug in boolean evaluation inside XML Driver. 2012-10-12 21:47:09 +02:00
Benjamin Eberlei
b7b49203aa Merge pull request #477 from jakoch/master
fixed typo/bug and CS on use statements
2012-10-12 11:29:00 -07:00
jakoch
d4a6c488ca fixed use statements 2012-10-12 13:53:20 +02:00
jakoch
ec5ad7136f fix typo 2012-10-12 13:37:17 +02:00
Guilherme Blanco
a4b85c49c9 Merge pull request #474 from okovalov/master
Fixed bug with comment option not being added to column.
2012-10-11 22:22:59 -07:00
Oleksandr Kovalov
90bbb35655 Fixed bug with comment option not being added to column. 2012-10-11 15:57:51 +00:00
twinh
8cc24f4cf2 removed blanks 2012-10-11 06:04:03 -07:00
twinh
66efd65e64 fixed empty namespace in generated code when repository class do not have namespace 2012-10-11 06:01:55 -07:00
Klein Florian
7f8af83b5b add bool detection when inferring type 2012-10-10 11:20:41 +02:00
Ethan
c604adc804 Use protected so generator can be extended
This is definitely something I'd like to be able to extend, and I imagine others might too.
2012-10-09 08:00:51 -03:00
Guilherme Blanco
65fabc20c9 Merge pull request #465 from yohang/master
Fixed a typo in ConcatFunction
2012-10-08 06:43:53 -07:00
Stefan Klug
bf54c22cd9 removed unneded variable 2012-10-08 14:01:04 +02:00
Stefan Klug
1e1f34f9cb cleanup ScalarExpression
_isFunction doesn't exclude subselects anymore
2012-10-08 13:59:54 +02:00
Stefan Klug
6ccf7a7ac7 fixed Parser which incorrectly treated ((( as function 2012-10-08 13:57:34 +02:00
Stefan Klug
d344407636 added test case 2012-10-08 13:49:31 +02:00
yohang
adc3d21385 Fixed typo on ConcatFunction 2012-10-08 12:44:36 +02:00
Benjamin Eberlei
235ad8e553 [DDC-2052] Add SqlWalker::setQueryComponent() to allow modification of the query component in a custom output walker 2012-10-06 11:16:16 +02:00
Benjamin Eberlei
a67a6aa685 Merge pull request #414 from cordoval/DDC-1872
[DDC-1872] Overriding Mapping Annotations
2012-10-06 01:35:47 -07:00
Benjamin Eberlei
a5e043e6e6 Merge pull request #444 from goetas/xmlfix
Fixed some typo error in XML Exporter
2012-10-05 14:16:59 -07:00
Benjamin Eberlei
f7220ae416 Merge pull request #455 from radmar/master
Fixed unique-constraint name in XML Exporter
2012-10-05 11:23:55 -07:00
Benjamin Eberlei
44c0ca4d3c [DDC-2059] Fix column and foreign key interfering with each other during reverse engineering. 2012-10-05 20:03:51 +02:00
Benjamin Eberlei
fd28624120 Merge pull request #456 from Slamdunk/patch-1
Optimize autoload prefix in composer.json
2012-10-05 10:05:14 -07:00
Benjamin Eberlei
a0440b63bb Merge pull request #462 from doctrine/DDC-2055
[DDC-2055] Generate SELECT clause from ResultSetMappingBuilder
2012-10-05 09:46:37 -07:00
Benjamin Eberlei
0c8be37ca9 Merge pull request #458 from barelon/master
Use cascade=all if all cascade options set
2012-10-05 09:45:44 -07:00
Benjamin Eberlei
13762f20c9 Merge pull request #422 from FabioBatSilva/DDC-1574
DDC-1574 - "new" operator
2012-10-05 07:31:18 -07:00
Benjamin Eberlei
a47359e3f5 [DDC-2055] Fix CS 2012-10-04 20:18:10 +02:00
Benjamin Eberlei
91caff1d89 Merge pull request #459 from FabioBatSilva/DDC-2012
Fix DDC-2012
2012-10-03 03:46:04 -07:00
Benjamin Eberlei
913377e31b [DDC-2055] Add support to generate entity result parts of the SELECT clause from a ResultSetMappingBuilder instance. Add support for column incrementing. 2012-10-03 12:35:14 +02:00
Benjamin Eberlei
079beb957e Merge pull request #461 from franmomu/patch-1
[SchemaValidator] Fix typo
2012-10-03 01:46:44 -07:00
Fran Moreno
45eef4a03c [SchemaValidator] Fix typo 2012-10-03 10:51:14 +03:00
Guilherme Blanco
3ecce5251b Merge pull request #128 from egulias/master
[Association-Mapping] - Missing many-to-many xml target-entity tag
2012-10-02 07:30:44 -07:00
Eduardo Gulias Davis
742590d1d7 [Association-Mapping] - Mising target-entity tag in xml format
In the many to many bidirectional xml format the "target-entity" tag is missing and generates a MappingException when not included.
2012-10-02 12:15:03 +03:00
barelon
919cf8558b Remove trailing whitespace 2012-10-02 00:16:29 +03:00
barelon
3b27216c51 add empty lines around if block 2012-10-02 00:14:24 +03:00
Fabio B. Silva
5cb4466f7c Fix test case 2012-09-30 15:47:00 -03:00
Fabio B. Silva
4510f5a5b8 Fix DDC-2012 2012-09-30 15:40:19 -03:00
barelon
cd37ec47d5 Set 'cascade' => 'all' if all cascade options set 2012-09-30 01:16:21 +03:00
barelon
c97eff94f5 Output cascade={"all"} if all cascade options set 2012-09-30 01:12:06 +03:00
Fabio B. Silva
dd984c7319 remove extra line 2012-09-29 16:19:03 -03:00
Fabio B. Silva
5f89fa4190 fix CS 2012-09-29 16:19:03 -03:00
Fabio B. Silva
7c754e495e support namespace alias 2012-09-29 16:19:03 -03:00
Fabio B. Silva
1bd6e841bf Fix some CS 2012-09-29 16:19:02 -03:00
Fabio B. Silva
de93983dff assume entity namespace when not given 2012-09-29 16:19:02 -03:00
Fabio B. Silva
3aa8d3fdac test constructor exceptions 2012-09-29 16:19:01 -03:00
Fabio B. Silva
91efe10855 fix some cs on ObjectHydrator 2012-09-29 16:19:01 -03:00
Fabio B. Silva
4dca27962e support multiple operators 2012-09-29 16:19:01 -03:00
Fabio B. Silva
6844116b94 test case expression 2012-09-29 16:19:00 -03:00
Fabio B. Silva
f0403a5394 test literal values 2012-09-29 16:19:00 -03:00
Fabio B. Silva
e5e45a3a5c test sql generation 2012-09-29 16:18:59 -03:00
Fabio B. Silva
ddb2651691 fix tests on postgres 2012-09-29 16:18:59 -03:00
Fabio B. Silva
af2f556fd3 small refactory 2012-09-29 16:18:59 -03:00
Fabio B. Silva
b19e4a6440 support arithmetic expression and aggregate functions 2012-09-29 16:18:58 -03:00
Fabio B. Silva
88f04b5ebd parse nested new operators 2012-09-29 16:18:58 -03:00
Fabio B. Silva
2b403b7dad basic support refactory 2012-09-29 16:18:58 -03:00
Fabio B. Silva
b29d47a682 cache new object mappings 2012-09-29 16:18:58 -03:00
Fabio B. Silva
0fbb78e61a basic support, need some code refactory and improvements 2012-09-29 16:18:57 -03:00
Fabio B. Silva
ed89695a8c collect new object parameters 2012-09-29 16:18:57 -03:00
Fabio B. Silva
0e60c50c5e small code refactoring 2012-09-29 16:18:56 -03:00
Fabio B. Silva
0c1a8cd43f sql generation 2012-09-29 16:18:56 -03:00
Fabio B. Silva
ee7b5da64a start work 2012-09-29 16:18:56 -03:00
Filippo Tessarotto
95971a6180 Optimize autoload prefix in composer.json
By having more specific autoload prefixes it is possible to reduce the number of stat calls made.
2012-09-28 09:58:38 +03:00
Marcin Radziwoński
380f4fbac7 Fixed unique-constraint name in XML Exporter 2012-09-26 14:27:16 +02:00
Guilherme Blanco
831f0acdc5 Merge pull request #450 from KonstantinKuklin/master
fix some phpdoc
2012-09-20 18:10:22 -07:00
Konstantin Kuklin
34d8843fd6 improve phpdoc 2012-09-21 03:20:06 +04:00
Lennart Hildebrandt
a61afedcf9 Fixed typo for mapping type "array" 2012-09-20 13:11:36 +02:00
Lennart Hildebrandt
06ad3389e0 Added .idea for PhpStorm contributers 2012-09-20 13:11:09 +02:00
Guilherme Blanco
fa29d36d09 Merge pull request #126 from barelon/patch-1
Fix some typos in annotations reference
2012-09-18 08:56:50 -07:00
barelon
c463121da8 Fix some typos in annotations reference
- Changed capitalization of the `@GeneratedValue` and `@Version` examples which incorrectly used lower case

- Fixed parameter names in `@NamedNativeQuery` and `@SqlResultSetMapping`

- Changed the Docblock style for the @MappedSuperclass example to the style used by all examples
2012-09-18 11:28:24 +03:00
Benjamin Eberlei
a9517b1b17 Merge pull request #436 from Powerhamster/comment-fixes
Comment fixes
2012-09-17 03:45:34 -07:00
Benjamin Eberlei
a256c43871 Merge pull request #442 from FabioBatSilva/fix-overrides-annot
Remove unused code
2012-09-17 03:33:19 -07:00
Asmir Mustafic
bc277c6e28 spaces 2012-09-13 11:04:23 +02:00
Asmir Mustafic
f86dcfc288 typo fix 2012-09-13 09:40:14 +02:00
Guilherme Blanco
68f543b8bb Merge pull request #443 from cas87/patch-1
Allow 'nullable' attribute to be used during XML export
2012-09-12 20:12:33 -07:00
Cas
de5b20d0bf Update lib/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php
Allow 'nullable' attribute to be exported for fields, something which already worked in YamlExport. This addition saved me a lot of time during development, not having to manually re-factor after each export.

Don't know why this was missing, maybe it's me who is missing something, so let me know ;)
2012-09-13 03:43:27 +03:00
Fabio B. Silva
8193397d4f remove duplicate code 2012-09-12 21:31:02 -03:00
Guilherme Blanco
dacb51fba2 Merge pull request #437 from sroddy/persistent_collection_matching_fix
Fixes PersistentCollection::matching() when collection is not initialize...
2012-09-07 13:18:45 -07:00
Stefano Rodriguez
9a14b40495 use of assertCount 2012-09-07 14:44:18 +02:00
Stefano Rodriguez
bb8dd6cb11 Fixes PersistentCollection::matching() when collection is not initialized and there are NEW entities in the collection 2012-09-07 10:46:34 +02:00
Stefano Rodriguez
4b3ecfe674 Added a failing test case on PersistentCollection::matching() when collection is not initialized and there are NEW entities in the collection 2012-09-07 10:46:33 +02:00
Thomas Rothe
7acdcd6952 added missing use statement 2012-09-06 21:03:40 +02:00
Thomas Rothe
7beffb5a5f Several fixes for comments
updated @param and @throws annotations
2012-09-06 21:03:26 +02:00
Marco Pivetta
0ff1f418bd Update en/reference/tools.rst
Fixed import as reported by manoelcampos@gmail.com
2012-09-05 22:31:07 +03:00
Benjamin Eberlei
ab990cfba6 Merge branch 'DDC-2003' 2012-09-05 19:28:42 +02:00
Benjamin Eberlei
2c99f97c8b [DDC-2003] Remove unused variable 2012-09-05 19:28:32 +02:00
Bilal Amarni
a9b4debe37 allowed to pass filter objects to the configurator 2012-09-03 10:52:46 +02:00
Josiah Truasheim
959c4f026f Refactored the SqlValueVisitor to move all type processing to the entity persister. 2012-08-31 20:58:16 +07:00
Josiah Truasheim
e0d16331a4 Fixed formatting issues identified by Stof 2012-08-31 19:51:22 +07:00
Josiah Truasheim
a6b6b25267 Removed the closure keyword as it isn't supported in PHP 5.3 2012-08-31 18:16:02 +07:00
Josiah Truasheim
c7f5d9d77d Fixed DDC-2003 using closures to reference the functionality of the calling entity persister from the SQL value visitor. 2012-08-31 18:12:44 +07:00
Josiah Truasheim
783c53d57c Added a failing test for DDC-2003 2012-08-31 17:52:46 +07:00
Bilal Amarni
d47b872292 fixed typo 2012-08-30 16:35:46 +03:00
Bilal Amarni
7c7118d883 simplified interface check 2012-08-30 16:25:50 +03:00
Karsten Dambekalns
4e4cf33342 Update en/reference/working-with-associations.rst
Clarifiy that orphanRemoval works with one-to-one, one-to-many and many-to-many associations.
2012-08-30 11:56:06 +03:00
Benjamin Eberlei
bc2476f342 [DDC-1918] Fix weird results at the end of paginator when using fetch joins 2012-08-29 15:16:07 +02:00
Benjamin Eberlei
9c682efb2f Merge pull request #431 from pitiflautico/patch-1
[ORM] Fix double semicolon
2012-08-29 05:33:12 -07:00
Benjamin Eberlei
267daa5fc1 Merge pull request #428 from chEbba/query-builder-common-criteria
Add QueryBuilder::addCriteria() for Criteria - QueryBuilder bridge
2012-08-29 05:06:50 -07:00
Kirill chEbba Chebunin
ac98f15cfa Fix ORMInvalidArgumentException factory methods with return instead of throw 2012-08-29 14:02:51 +02:00
Kirill chEbba Chebunin
e68807ad4f Change version for QueryExpressionVisitor 2012-08-29 16:00:02 +04:00
Kirill chEbba Chebunin
a162f00ecc Remove builders from QueryExpressionVisitorTest constructor 2012-08-29 15:48:04 +04:00
Daniel Perez Pinazo
5b8ead9db8 [ORM] Fix double semicolon 2012-08-29 13:40:36 +03:00
Francesc Rosàs
e873351624 Remove "before the lists of scheduled changes are cleared"
It is not true.
2012-08-23 21:51:33 +03:00
Benjamin Eberlei
9ae1f804e1 Merge pull request #120 from saltybeagle/master
Minor spelling correction & grammatical formatting
2012-08-23 06:55:26 -07:00
Brett Bieber
46be81115a Minor spelling correction & grammatical formatting 2012-08-23 08:41:19 -05:00
Kirill chEbba Chebunin
2aba7fb374 Add test for QueryBuilderTest::addCriteria with undefined limits 2012-08-20 20:31:57 +04:00
Kirill chEbba Chebunin
1c2f2b5c13 Store QueryExpressionVisitor parameters as array 2012-08-20 20:28:22 +04:00
Kirill chEbba Chebunin
433d208572 Remove extra space from QueryBuilder::addCriteria() 2012-08-20 20:27:55 +04:00
Kirill chEbba Chebunin
d3ab948d88 Overwrite query limits only if set in QueryBuilder::addCriteria() 2012-08-20 20:27:30 +04:00
Kirill chEbba Chebunin
148789600a Remove unnecessary else statements after if with return in QueryExpressionVisitor 2012-08-20 20:27:14 +04:00
Kirill chEbba Chebunin
c6b3899c2d Add QueryBuilder::addCriteria() for Criteria - QueryBuilder bridge 2012-08-20 20:27:03 +04:00
Guilherme Blanco
ece6a005bc Merge pull request #425 from FabioBatSilva/DDC-1977
Fix DDC-1977
2012-08-15 15:29:26 -07:00
FabioBatSilva
641af15280 Fix DDC-1977 2012-08-15 22:57:21 +02:00
Alexander
185b4e0c41 Fix setCustomHydrationModes + added test 2012-08-14 22:43:32 +02:00
Alexander
5c585b4c02 Merge branch 'config' 2012-08-14 22:33:36 +02:00
Martin Meredith
787a208708 Create the setCustomHydrationMode function
This allows multiple hydrators to be set at once, and also allows for
the customHydrationMode options to be set via DoctrineORMModule
2012-08-14 22:33:25 +02:00
Guilherme Blanco
f8a582d454 Merge pull request #391 from FabioBatSilva/ns-class
Give FQCN to NamingStrategy#propertyToColumnName
2012-08-12 15:50:20 -07:00
Gary Hockin
b6ddb58634 Update en/tutorials/getting-started.rst
Cleaner to remove the note, and modify the code to put the doctrine_bootstrap.php include first?
2012-08-07 13:26:51 +02:00
Benjamin Eberlei
a9dfe1e10e Merge pull request #118 from Spabby/master
Added a note to explain something that confused me for a while in this tutorial
2012-08-07 04:15:59 -07:00
Gary Hockin
711844296d Update en/tutorials/getting-started.rst
Fixed failed markdown
2012-08-07 13:12:09 +02:00
Gary Hockin
f3dea276e7 Update en/tutorials/getting-started.rst
Added note that tripped me up.
2012-08-07 13:10:25 +02:00
Guilherme Blanco
72ce9a7f37 Merge pull request #417 from jonathaningram/patch-1
Remove unused use statement
2012-08-01 23:38:56 -07:00
Jonathan Ingram
04de52d4c9 Remove unused use statement 2012-08-02 15:33:09 +10:00
Benjamin Eberlei
2f72219d6e Finish first version of filtering api documentation 2012-08-01 22:15:44 +02:00
Benjamin Eberlei
104a76a6b1 Update EntityRepository and PersistentCollection to new Criteria#expr() method instead of having to implement themselves. 2012-08-01 21:37:22 +02:00
Luis Cordova
221ab3b695 [DDC-1872] adjust as per @stof comments on test skipped message 2012-08-01 02:27:23 -05:00
Benjamin Eberlei
eaeda36bdb Add filtering collections 2012-07-31 23:58:37 +02:00
Benjamin Eberlei
83b509e033 Move again into tools 2012-07-31 23:26:40 +02:00
Benjamin Eberlei
71d3f5852d Move Mapping Validation into Configuration section 2012-07-31 23:25:33 +02:00
Benjamin Eberlei
5e9255dda8 Reorganize query builder docs to put the useful stuf fon top. 2012-07-31 23:20:25 +02:00
Michael Moravec
79a04b295f [DDC-1961] Fixed parameter type support in Parameter 2012-07-31 21:01:21 +02:00
Luis Cordova
6c932af0a0 [DDC-1872] address comments from beberlei 2012-07-29 23:33:18 -05:00
Luis Cordova
5d0082471f [DDC-1872] skip 5.4 versions for php 5.3 uncompatible tests 2012-07-29 22:55:26 -05:00
Benjamin Eberlei
00a5f18544 [DDC-1937] Fix bug with apc and annotation caching using a workaround. 2012-07-29 11:56:41 +02:00
Benjamin Eberlei
e8d3fc73ff Merge branch 'DDC-1964' 2012-07-29 11:25:54 +02:00
Benjamin Eberlei
7c1235dedb [DDC-1964] Fix issue with refresh and and object hydrator not setting field to null explicitly to override possible previous values. 2012-07-29 11:25:45 +02:00
Benjamin Eberlei
bcbef5670c Merge branch 'DDC-1939' 2012-07-29 09:27:20 +02:00
Benjamin Eberlei
354fa14df4 [DDC-1939] Add test for persistent collection delete with composite key 2012-07-29 09:27:08 +02:00
Igor Wiedler
afd8ea91e3 [2.3] Use HelperSet in cli-config.php 2012-07-29 09:09:17 +02:00
Benjamin Eberlei
14bd794960 Merge pull request #411 from stof/new_types
Added the new DBAL 2.3 types in the EntityGenerator typehint map
2012-07-29 00:04:03 -07:00
Luis Cordova
26608fed5a [DDC-1872] add tutorial for override annotations mappings 2012-07-29 00:39:24 -05:00
Luis Cordova
8742377c3b [DDC-1872] add tests to evaluate annotations overrides with traits 2012-07-29 00:03:25 -05:00
Christophe Coevoet
cebb820030 Added the new DBAL 2.3 types in the EntityGenerator typehint map 2012-07-27 10:34:59 +02:00
Guilherme Blanco
04e6cc78cd Fixed is_subclass_of comparing an interface which brought our requirement to 5.3.9. Changed to reflection approach which still keep us at the same dependency as before. 2012-07-26 15:50:51 -04:00
Johannes M. Schmitt
fc4a07c2b3 added failing test for refresh with eager fetching 2012-07-26 12:54:58 +02:00
Guilherme Blanco
8a86242a5d Merge pull request #116 from benlumley/patch-2
Fix missing :
2012-07-25 16:34:54 -07:00
Ben Lumley
7c79985460 Fix missing : 2012-07-25 23:31:30 +02:00
Guilherme Blanco
1eaa822d2a Merge branch 'master' of github.com:doctrine/doctrine2 2012-07-25 01:24:33 -04:00
Guilherme Blanco
9dd3b66fe6 Fixed DefaultRepositoryClassName which should follow the Persistence interface, not ORM class. 2012-07-25 01:23:52 -04:00
Fabio B. Silva
1369e3d133 change ticket/group 2012-07-24 14:34:27 +02:00
Fabio B. Silva
50dac4096a give FQCN to NamingStrategy#propertyToColumnName 2012-07-24 14:34:27 +02:00
Marco Pivetta
aa0cb0b6d7 DDC-1939 - Removing references to non-existing AssociationMapping class 2012-07-24 11:37:57 +02:00
Guilherme Blanco
619d29adb2 Merge pull request #400 from stof/command_help
Changed commands to use command.name in the help
2012-07-22 22:04:15 -07:00
Guilherme Blanco
68adc7fed3 Merge pull request #403 from Ocramius/DDC-1925
DDC-1925 tests
2012-07-22 22:02:13 -07:00
Guilherme Blanco
98c4833afc Merge pull request #404 from Ocramius/DDC-1933
DDC-1933 - Fixing cloning of QueryBuilder and adding related tests
2012-07-22 22:01:35 -07:00
Guilherme Blanco
e5979b5ef2 Moved implementation from EntityRepository to EntityManager. This decouples ER implementation from EM, as it should be. 2012-07-23 00:52:41 -04:00
Marco Pivetta
fb3c6f0e8f DDC-1933 - Fixing cloning of QueryBuilder and adding related tests 2012-07-21 20:34:20 +02:00
Marco Pivetta
5b3eee8071 DDC-1925 - squashing ticket tests into a single file 2012-07-20 00:03:39 +02:00
Marco Pivetta
81f97e92d3 Adding tests for DDC-1925 2012-07-19 22:00:56 +02:00
Guilherme Blanco
1502d9b552 Merge pull request #111 from Adel-E/patch-1
Fix typo
2012-07-19 08:53:04 -07:00
Adel
f0cc192d7b Fix typo 2012-07-19 16:46:56 +02:00
Benjamin Eberlei
93cef61270 Fix DBAL dependency range evaluated as AND, not as OR 2012-07-18 11:23:20 +02:00
Christophe Coevoet
a723b73929 Changed commands to use command.name in the help 2012-07-17 00:55:09 +02:00
Benjamin Eberlei
34ac207b3c Bump Version to 2.4.0-DEV 2012-07-16 15:25:20 +02:00
Benjamin Eberlei
c8fcd3f8a5 Bump dependencies 2012-07-16 15:24:04 +02:00
Benjamin Eberlei
a0ba420969 Bump dev version to 2.3.0 2012-07-16 15:23:33 +02:00
Benjamin Eberlei
816f709950 Release 2.3.0-BETA1 2012-07-16 15:23:33 +02:00
Benjamin Eberlei
e0455b5550 Merge pull request #397 from Ocramius/cleanup/removing-deprecated-metadata-drivers
Cleanup/removing deprecated metadata drivers
2012-07-12 00:29:41 -07:00
Guilherme Blanco
fcff39571f Merge pull request #399 from Adel-E/patch-1
Fix phpdocs
2012-07-11 15:50:35 -07:00
Adel
51cd553de8 Fix phpdocs 2012-07-11 22:44:07 +00:00
Guilherme Blanco
a673018508 Merge pull request #109 from michaelperrin/typo_fixes
[Index] Small typo fix
2012-07-11 06:54:24 -07:00
Michaël Perrin
9b2f8dca64 [Index] Small typo fix 2012-07-11 11:51:29 +02:00
Marco Pivetta
75276e453e Restoring class names extending the Doctrine\Common implementation for BC compatibility 2012-07-10 13:57:33 +02:00
Marco Pivetta
a2e00a96cc Reverting change on referenced DBAL commit 2012-07-10 02:59:33 +02:00
Marco Pivetta
915da58fb7 Adding upgrade notes about the BC Break 2012-07-10 02:51:55 +02:00
Marco Pivetta
f3aae5de0e Removing tests moved to Doctrine\Common 2012-07-10 02:48:28 +02:00
Marco Pivetta
01f058953b Removing DriverChain and using Doctrine\Common implementation instead 2012-07-10 02:47:08 +02:00
Marco Pivetta
e2c1d7c38a Removing deprecated StaticPHPDriver and PHPDriver
modifying tests so that the new implementation in Doctrine\Common is referenced
2012-07-10 02:31:30 +02:00
Benjamin Eberlei
113c6f51c2 Merge pull request #381 from doctrine/DDC-1637
[DDC-1637] Collection Filtering API
2012-07-09 08:16:31 -07:00
Benjamin Eberlei
b62ef939bf Merge pull request #108 from stephpy/fix_typo
fix typo on namespace
2012-07-09 02:12:14 -07:00
Stéphane PY
366bc21ab8 fix typo on namespace 2012-07-09 10:09:28 +02:00
Benjamin Eberlei
b2385e0afa [DDC-1637] Implementation of Criteria Collections API for
PersistentCollection (OneToMany only) and EntityRepository.
2012-07-09 09:59:48 +02:00
Benjamin Eberlei
4aafeaf7a6 Fix test on PostgreSQL 2012-07-09 09:55:41 +02:00
Benjamin Eberlei
b3119c0a5f Merge pull request #107 from frosas/document-pre-and-post-flush-events
Document preFlush and postFlush events
2012-07-08 13:21:54 -07:00
Francesc Rosàs
610295f875 Document preFlush and postFlush events 2012-07-08 21:30:00 +02:00
Benjamin Eberlei
fe292cc503 Merge pull request #392 from widop/patch-1
Invalid paginator query cloning
2012-07-08 09:34:09 -07:00
Benjamin Eberlei
3b04cf5b2f Merge pull request #396 from Ocramius/DDC-1893
DDC-1893 - Updating configuration to reflect latest Doctrine Common changes
2012-07-08 09:26:15 -07:00
Benjamin Eberlei
f3f1091b44 Merge branch 'DDC-1657' 2012-07-08 18:22:59 +02:00
Benjamin Eberlei
6e924f2a2c [DDC-1657] Prove that DBAL changes also work in ORM, not leading to drop sequence statements on postgresql with SERIAL pks. 2012-07-08 18:22:38 +02:00
Marco Pivetta
346e34adf6 Reverting to default annotation driver with - delayed to 3.0 2012-07-08 17:33:50 +02:00
Marco Pivetta
245d906ebf Adding parameter to allow switching annotation reader implementation 2012-07-08 17:17:32 +02:00
Benjamin Eberlei
eaae1f222f Fix PostgreSQL test-failure. UnitOfWork#getEntityState() produced exists() queries because of unmanaged entity passed as parameter to AbstractQuery#setParameter(), thereby skewing the sql count 2012-07-08 16:57:40 +02:00
Marco Pivetta
b67140f73c Cleaning up description of the BC Break 2012-07-08 16:49:54 +02:00
Marco Pivetta
7c2e5ae5b2 Adding tests for configuration object (also to ensure defaults for BC break early discovery) 2012-07-08 16:32:27 +02:00
Marco Pivetta
fc00d5f39f Updating upgrade docs and fixes suggested by @beberlei 2012-07-08 16:32:27 +02:00
Marco Pivetta
86dbddd596 Updating to reflect latest Doctrine Common changes
Also, changing logic so that the SimpleAnnotationReader is no more the
default one. An additional parameter for the method will allow using it.

The CS fixes that were additionally implemented (along with other minor changes
that do not affect BC compatibility are caused by a CS sniff via IDE.
2012-07-08 16:30:35 +02:00
Benjamin Eberlei
5adc8bec58 Cleanup UPDATE.md chapter mess a bit 2012-07-08 14:52:16 +02:00
Benjamin Eberlei
baae40c5f4 Concatenate UPGRADE files into new UPGRADE.md 2012-07-08 14:48:32 +02:00
Benjamin Eberlei
7b758eee57 [DDC-1816] Verify XML <discriminator-column /> element works as expected/documented in tests. 2012-07-08 09:06:52 +02:00
Benjamin Eberlei
15c9f10bc1 Make composer subtitle to clarify this section applies to Composer only 2012-07-07 18:25:45 +02:00
Benjamin Eberlei
18d4a2f970 [DDC-1775] Fix NotifyPropertyChanged Listener being attached in addIdentityMap(), which is too late for certain use-cases in the persist lifecycle. 2012-07-07 17:47:29 +02:00
Eric GELOEN
3bdf86922c Add clone query test 2012-07-07 17:35:05 +02:00
Benjamin Eberlei
3783ca6b43 [DDC-1707] Working testcase 2012-07-07 17:15:32 +02:00
Benjamin Eberlei
ff2c5f85c3 [DDC-1846] Fix EntityRepository#find() with pessimistic locking. 2012-07-07 16:49:26 +02:00
Benjamin Eberlei
58a2cba6da Merge pull request #393 from stof/root_entity_found
Updated the classmetadata factory for Common 2.3
2012-07-07 07:21:42 -07:00
Alexander
45df16cdc6 Update DBAL vendor 2012-07-07 15:15:56 +02:00
Alexander
2dd2d694ca Introduce StatementMock to make testsuite ready for upcoming DBAL change 2012-07-07 15:14:51 +02:00
Eric GELOEN
8c24e528ad Clone directly the ArrayCollection instead of looping 2012-07-07 11:38:53 +02:00
Christophe Coevoet
8d0f49f227 Updated the classmetadata factory for Common 2.3
This adds the new method introduced in doctrine/common#162
2012-07-06 22:18:06 +02:00
Eric GELOEN
996e47bf61 Replaced a shallow-copy with a deep-copy to avoid side effects. 2012-07-06 17:49:03 +02:00
Benjamin Eberlei
0a95e42ea8 Merge branch 'DDC-1735' 2012-07-05 22:20:28 +02:00
Benjamin Eberlei
82e1d7fa80 [DDC-1735] Change file_put_contents with LOCK_EX usage to temporary filename + rename, which works on Windows NFS drives. 2012-07-05 22:20:16 +02:00
Benjamin Eberlei
12cddf20e3 [DDC-1900] Throw exception when overwriting internal function. 2012-07-05 21:52:40 +02:00
Benjamin Eberlei
cc4613533b Fix tests after DBAL adjustments 2012-07-04 23:58:41 +02:00
Benjamin Eberlei
4bfdcd32f7 Merge pull request #384 from FabioBatSilva/DDC1885
[DDC-1885] Fix quotes in many to many persisters
2012-07-04 14:43:48 -07:00
Guilherme Blanco
6ba205f561 Merge pull request #314 from Ocramius/dcom-metadata-drivers-reuse
Doctrine\Common metadata drivers reuse
2012-07-04 13:30:54 -07:00
Guilherme Blanco
6093017bc6 Merge pull request #389 from SamsonIT/fix_fetch_relation_by_id_of_association_field_2_3
fixed DDC-1895
2012-07-04 13:27:44 -07:00
Benjamin Eberlei
6943244107 Fix docs 2012-07-04 22:15:36 +02:00
Bart van den Burg
64904c77c1 fixed DDC-1895 2012-07-04 22:11:50 +02:00
Fabio B. Silva
632d13ba0c fix extra lazy count 2012-07-04 17:11:43 -03:00
Fabio B. Silva
fe11831bd7 test remove item and clear collection 2012-07-04 17:11:43 -03:00
Fabio B. Silva
63580dfe26 Fix CS 2012-07-04 17:11:43 -03:00
Fabio B. Silva
076663fe3a fix DDC-1885 in persisters 2012-07-04 17:11:42 -03:00
Benjamin Eberlei
1023af6a1f [DDC-1861] Fix UnitOfWork#doMerge() 2012-07-04 21:55:59 +02:00
Benjamin Eberlei
da331cd277 Merge pull request #376 from lstrojny/de-deprecate-transaction-methods
De-deprecate transaction handling methods
2012-07-04 12:42:55 -07:00
Benjamin Eberlei
30e86f442f [DDC-1907] Fix template variable placeholder 2012-07-04 21:30:25 +02:00
Benjamin Eberlei
5cdb0ae8be [DDC-1907] Add generation of remove method for collections 2012-07-04 21:04:47 +02:00
Marco Pivetta
379e69865e Reusing chained driver now available in common, fixing cs/code smells and removing duplicate docs. 2012-07-04 20:59:22 +02:00
Marco Pivetta
97d7cae012 Stoffing and including changes of doctrine/common#138 2012-07-04 20:59:22 +02:00
Marco Pivetta
f6381d7b76 Updating ClassMetadataFactory to comply with new abstract CMF interface as of doctrine/common#150 2012-07-04 20:59:21 +02:00
Marco Pivetta
94714db132 Fixing code sniff issues before continuing refactoring of 2012-07-04 20:59:21 +02:00
Marco Pivetta
e522391ee9 Reusing Doctrine\Common's AbstractClassMetadataFactory 2012-07-04 20:59:21 +02:00
Marco Pivetta
943cff673a Fixing test expecting a ORM\Mapping exception
Those exceptions are now in the Common\Persistence\Mapping namespace
2012-07-04 20:59:21 +02:00
Marco Pivetta
63fbf7c2e5 Fixing broken tests because of wrong method signature and reference to the old Driver interface 2012-07-04 20:59:21 +02:00
Marco Pivetta
737b74e5d5 Rebasing on master 2012-07-04 20:59:21 +02:00
Marco Pivetta
01b1b0b5fb Removing code from the simplified drivers, use SymfonyFileLocator instead 2012-07-04 20:59:21 +02:00
Marco Pivetta
5c05a4356a Adding notes about upgrading to 2.3 (metadata drivers changes) 2012-07-04 20:59:21 +02:00
Marco Pivetta
245718c9eb Removing AbstractFileDriver, using Doctrine\Common\Persistence\Mapping\Driver\FileDriver instead 2012-07-04 20:59:21 +02:00
Marco Pivetta
e9e36dcf32 Removing Doctrine\ORM\Mapping\Driver\Driver interface
Interface has been moved to Doctrine\Common\Persistence\Mapping\Driver\MappingDriver
2012-07-04 20:59:21 +02:00
Marco Pivetta
905acf9176 Removing Doctrine\ORM\Mapping\Driver\Driver interface
Interface has been moved to Doctrine\Common\Persistence\Mapping\Driver\MappingDriver
2012-07-04 20:59:21 +02:00
Marco Pivetta
5b97357402 Removing unused imports 2012-07-04 20:59:21 +02:00
Marco Pivetta
abd3ddc1b1 Removing code duplication, reusing Doctrine\Common\Persistenc\Mapping\Driver\AnnotationDriver 2012-07-04 20:59:20 +02:00
Marco Pivetta
ccace8cb8b Moving exception throwing for invalid file mappings to Doctrine\Common\Persistence\Mapping\Driver\FileDriver 2012-07-04 20:59:20 +02:00
Marco Pivetta
03fb734de8 Removing API that should be moved to common 2012-07-04 20:59:20 +02:00
Marco Pivetta
82cfda3dec Fixing reflection exceptions caused by changes in the AbstractFileDriver interface 2012-07-04 20:59:20 +02:00
Marco Pivetta
bb998d1738 Emulating feature that has to be moved to Doctrine\Common 2012-07-04 20:59:20 +02:00
Marco Pivetta
e9f23d51e0 Removing unused code 2012-07-04 20:59:20 +02:00
Marco Pivetta
34bb0c4943 Reducing code duplication
SimplifiedXmlDriver and SimplifiedYamlDriver are still not valid after this commit
2012-07-04 20:59:20 +02:00
Marco Pivetta
e6a2bae5d7 Updating mapping driver interface to comply with Doctrine\Common\Persistence\Mapping\Driver\MappingDriver 2012-07-04 20:59:20 +02:00
Guilherme Blanco
f20a95fdc0 Merge pull request #388 from fixe/patch-3
Added an empty line feed preceding the return statement
2012-07-03 06:44:51 -07:00
Tiago Ribeiro
bda7310b46 Added an empty line feed preceding the return statement 2012-07-03 12:57:14 +02:00
Guilherme Blanco
dd60cb6645 Merge pull request #387 from shieldo/fix_helptext
fixed typo in command help text
2012-07-02 10:15:35 -07:00
Douglas Greenshields
53e735ffdd fixed typo in command help text 2012-07-02 18:01:57 +01:00
Guilherme Blanco
d75569abab Merge pull request #106 from michaelperrin/typo_fixes
Fix typo in the "Getting started database" tutorial
2012-06-28 06:52:04 -07:00
Michaël Perrin
b5e11259e1 Fix typo in the "Getting started database" tutorial 2012-06-28 15:34:58 +02:00
Guilherme Blanco
cc29f85862 Resynced DBAL. 2012-06-24 23:53:05 -04:00
Guilherme Blanco
cb72219b11 Merge pull request #372 from FabioBatSilva/DDC-1845
[DDC-1845] QuoteStrategy
2012-06-24 20:36:54 -07:00
Guilherme Blanco
3dd3ecaff8 Updated dependency libraries with latest versions of related tools. 2012-06-24 23:29:14 -04:00
Fabio B. Silva
ca4862aabc Fix CS 2012-06-23 14:19:47 -03:00
Guilherme Blanco
86884a33f5 Merge pull request #105 from iampersistent/patch-1
Add xml code block for OrderBy
2012-06-20 07:03:41 -07:00
Richard Shank
de9f053cfb Add xml code block for OrderBy 2012-06-20 03:41:20 -07:00
Benjamin Eberlei
9aabdba753 Merge pull request #380 from FabioBatSilva/svn-markers
remove svn markers
2012-06-19 11:45:42 -07:00
Fabio B. Silva
d3d97e7ef8 remove svn markers 2012-06-19 15:27:41 -03:00
Fabio B. Silva
e25987df3a remove svn markers from AST 2012-06-19 15:17:08 -03:00
Guilherme Blanco
921f5c7680 Fixed license. 2012-06-19 11:04:00 -03:00
Guilherme Blanco
2703a2b27c Fixed issue with merge. 2012-06-18 15:23:12 -04:00
Fabio B. Silva
7800a7ef3f wrong indentation 2012-06-18 15:31:20 -03:00
Fabio B. Silva
65efda425f Fix CS 2012-06-18 15:24:52 -03:00
Douglas Greenshields
bc76f33092 added missing JoinColumn node for xml and yaml for many-to-one unidirectional mapping 2012-06-18 19:21:44 +01:00
Fabio B. Silva
b9d94e7bf0 add DefaultQuoteStrategy use statement 2012-06-18 14:43:01 -03:00
Fabio B. Silva
49f9d185de Fix CS and test configuration 2012-06-18 14:43:01 -03:00
Fabio B. Silva
ab9ff813fc revert submodule change 2012-06-18 14:43:01 -03:00
Fabio B. Silva
ea690489d7 revert wrong change 2012-06-18 14:43:00 -03:00
Fabio B. Silva
85b6f8dc2f change quote strategy to interface 2012-06-18 14:43:00 -03:00
Fabio B. Silva
b6b35d9482 test quote join variable 2012-06-18 14:43:00 -03:00
Fabio B. Silva
e0a236a9af fix DDC-142 load OneToOne EAGER 2012-06-18 14:43:00 -03:00
Fabio B. Silva
cd806b83db fix DDC-142 persist OneToOne 2012-06-18 14:42:59 -03:00
Fabio B. Silva
51f29cddb9 fix delete join table 2012-06-18 14:42:59 -03:00
Fabio B. Silva
7807d6806c fix delete join table not owning side 2012-06-18 14:42:59 -03:00
Fabio B. Silva
ad380e3ac6 test join column and referenced join columns quote 2012-06-18 14:42:58 -03:00
Fabio B. Silva
debc6e4993 change QuoteStrategy#getJoinColumnName to use join column 2012-06-18 14:42:58 -03:00
Fabio B. Silva
46ec26e745 revert wrong commit 2012-06-18 14:42:58 -03:00
Fabio B. Silva
2afe24f51c start to work in xxToOne quote 2012-06-18 14:42:58 -03:00
Fabio B. Silva
a75c672ee7 fix sequence and join columns 2012-06-18 14:42:57 -03:00
Fabio B. Silva
7215c1a3b1 test join table quote 2012-06-18 14:42:57 -03:00
Fabio B. Silva
2b8e24fb09 revert wrong commit 2012-06-18 14:42:57 -03:00
Fabio B. Silva
0e9c76abf8 revert wrong commit 2012-06-18 14:42:57 -03:00
Fabio B. Silva
f335f23145 tests for quoted columns metadata 2012-06-18 14:42:56 -03:00
Fabio B. Silva
8fec73673d fix DDC-1719 in persiter and query level 2012-06-18 14:42:56 -03:00
Fabio B. Silva
fabfb66293 deprecated metadata quote methods 2012-06-18 14:42:56 -03:00
Fabio B. Silva
4ef3d99770 use quote strategy in SizeFunction, MultiTableDeleteExecutor, MultiTableUpdateExecutor, and SchemaTool 2012-06-18 14:42:56 -03:00
Fabio B. Silva
851d17f940 use quote strategy in SingleTablePersister 2012-06-18 14:42:55 -03:00
Fabio B. Silva
dcd19bba22 use quote strategy in OneToManyPersister 2012-06-18 14:42:55 -03:00
Fabio B. Silva
36296a3906 use quote strategy in JoinedSubclassPersister 2012-06-18 14:42:55 -03:00
Fabio B. Silva
7f64474f3e use quote strategy in persister 2012-06-18 14:42:54 -03:00
Fabio B. Silva
2af7b3fd38 use quote strategy in BasicEntityPersister 2012-06-18 14:42:54 -03:00
Fabio B. Silva
5d665b59a1 remove getQuotedIdentifierColumnNames 2012-06-18 14:42:54 -03:00
Fabio B. Silva
505bdb9c03 missing files 2012-06-18 14:42:54 -03:00
Fabio B. Silva
db53b8651c apply quote strategy at sqlwalker 2012-06-18 14:42:53 -03:00
Fabio B. Silva
d49a968d55 tests for DDC-1719 2012-06-18 14:42:53 -03:00
Fabio B. Silva
1bcda5147a inject quote strategy into sql walker 2012-06-18 14:42:53 -03:00
Fabio B. Silva
2b4c29e4f2 tests for default strategy 2012-06-18 14:42:53 -03:00
Fabio B. Silva
9f297c3140 first tests for DefaultQuoteStrategy 2012-06-18 14:42:52 -03:00
Guilherme Blanco
b4a9b1550c Merge pull request #103 from Dinduks/add_missing_section_in_configuration
Add a link to the connection configuration
2012-06-18 10:07:47 -07:00
Guilherme Blanco
41d9f612c7 Merge pull request #378 from web-dev/DDC-1880
Fixed DDC-1880 Named Queries not registered in xml mapping
2012-06-18 10:06:15 -07:00
Dinduks
458b0df39e Add a link to the connection configuration 2012-06-18 18:43:10 +02:00
Josiah Truasheim
ff8cc6f4c0 Fixed DDC-1880 Named Queries not registered in xml mapping 2012-06-18 23:41:20 +07:00
Guilherme Blanco
b292adceb0 Merge pull request #102 from Dinduks/add_missing_section_in_configuration
Add a missing section in the Configuration manual
2012-06-18 09:05:29 -07:00
Dinduks
6e78973eec Add a missing section in the Configuration manual 2012-06-18 17:45:20 +02:00
Benjamin Eberlei
a3210e78aa Merge pull request #368 from doctrine/join-poc
Join poc
2012-06-18 08:18:13 -07:00
Benjamin Eberlei
e183cc62d9 Merge pull request #377 from Dinduks/fix_doc_link
Fix the documentation link in the README
2012-06-18 08:12:35 -07:00
Dinduks
77edb23291 Fix the documentation link in the README 2012-06-18 17:11:03 +02:00
Benjamin Eberlei
6f13e9543b Fix QueryTest 2012-06-18 17:03:08 +02:00
Guilherme Blanco
cba4e55ac4 Added more coverage tests. Required result confirmation. 2012-06-18 17:02:14 +02:00
Guilherme Blanco
41a650b699 Updated PoC for multiple components DQL support. 2012-06-18 17:01:52 +02:00
Alexander
e7dfa08756 [PoC] Arbitrary join support 2012-06-18 17:00:37 +02:00
Benjamin Eberlei
0c4952447b Merge pull request #369 from greg0ire/master
Show the advice only when relevant.
2012-06-18 07:26:04 -07:00
Benjamin Eberlei
3aee619fc0 Merge pull request #375 from lstrojny/transactional-callable
Allow passing any callable instead of only closures
2012-06-18 07:25:16 -07:00
Benjamin Eberlei
edb7950be8 Getting STarted: Code, Model, Database first 2012-06-16 13:34:23 +02:00
Lars Strojny
3881e12a2d De-deprecate transaction handling methods 2012-06-16 13:22:53 +02:00
Lars Strojny
164269bff1 Allow passing any callable instead of only closures 2012-06-16 13:20:34 +02:00
Benjamin Eberlei
1a9443b55a Let docs point to github for XSDs, much better to maintain for us. 2012-06-16 12:44:00 +02:00
Benjamin Eberlei
f854a99e0a Dum 2012-06-16 12:39:58 +02:00
Benjamin Eberlei
50879db001 Fixes 2012-06-16 12:39:01 +02:00
Benjamin Eberlei
63ebaea25a Some more work on index 2012-06-16 12:34:26 +02:00
Benjamin Eberlei
a3883eb306 Reworked docs towards composer, simplified chapters 2012-06-16 12:12:04 +02:00
Benjamin Eberlei
65e2f60b40 Rework configuration and tools section to include Composer 2012-06-16 11:57:56 +02:00
Tim Nagel
e5bac27fcc Initial ResolveTargetEntityListener cookbook entry 2012-06-16 17:36:40 +10:00
Guilherme Blanco
27b4f58b66 Merge pull request #362 from odolbeau/cs
Correct some mistakes (tabs & trailing spaces)
2012-06-14 22:43:18 -07:00
Guilherme Blanco
e8ad82c80f Merge pull request #363 from gajdaw/entities_generator_cs_fix
Entities generator: constructor's template docblock
2012-06-14 22:42:17 -07:00
Guilherme Blanco
8bb4f53447 Merge pull request #370 from Ph3nol/ph3-phpcs-fixes
Some PHP-CS fixes
2012-06-14 22:40:50 -07:00
Guilherme Blanco
1e6508d2dc Merge pull request #371 from instaclick/bin-permissions
set permissions as expected by composer.phar update
2012-06-14 22:40:33 -07:00
Guilherme Blanco
91ffd30f52 Merge pull request #373 from bschaeffer/patch-1
Grammar fix for composer.json file
2012-06-13 07:23:53 -07:00
Guilherme Blanco
feeef689f3 Merge pull request #100 from adrienbrault/patch-1
Fix typo/Add missing words
2012-06-13 06:07:09 -07:00
Adrien Brault
47febcd7f4 Fix typo/Add missing words 2012-06-13 01:36:40 +03:00
Braden Schaeffer
05c612f337 Grammar fix for composer.json file 2012-06-12 09:43:38 -05:00
Anthon Pang
c1c046f2dd set permissions as expected by composer.phar update 2012-06-11 11:40:23 -04:00
Ph3nol
2abb459770 Some PHP-CS fixes 2012-06-11 12:39:18 +02:00
Grégoire Paris
111bb52add delimit ternary 2012-06-11 08:23:37 +02:00
Grégoire Paris
190e63a6bb Show the advice only when necessary.
This is indeed a good advice, but people who
already have implemented __toString() might
get confused about it.
2012-06-10 23:59:07 +03:00
Guilherme Blanco
7b758493a3 Merge pull request #365 from Ocramius/DDC-1860
DDC-1860 - Composer arbitrary for CLI and composer/autoload.php in different paths
2012-06-09 05:45:26 -07:00
Marco Pivetta
2f83cf0dbd Cleaning up, removing iteration over parent directories as location of autoload.php can be determined eagerly 2012-06-09 14:41:39 +02:00
Marco Pivetta
8231fb2c68 Adding support for various composer autoload file locations, making composer optional 2012-06-09 10:48:58 +02:00
Guilherme Blanco
138ec8411c Merge pull request #99 from ErikDubbelboer/spelling-fixes
Fixed spelling error and missing php open tag
2012-06-07 05:37:01 -07:00
Erik Dubbelboer
24d488b5f1 fixed minor errors 2012-06-07 13:53:58 +02:00
Włodzimierz Gajda
b263a00eac Entities generator: constructor's template docblock 2012-06-06 08:44:25 +02:00
Guilherme Blanco
672b39fb84 Merge pull request #97 from patrick-mcdougle/patch-2
Fixed wording on the Alice and Bob Optimistic locking example.
2012-06-05 14:47:37 -07:00
patrick-mcdougle
9f575aad5b Fixed wording on the Alice and Bob Optimistic locking example. 2012-06-05 16:35:37 -05:00
Olivier Dolbeau
79a9ce5000 Add some corrections 2012-06-05 21:32:53 +02:00
Olivier Dolbeau
7ca0ac289e Remove tabs & trailing spaces 2012-06-05 15:46:10 +02:00
Olivier Dolbeau
c98f9117c2 Remove unused use 2012-06-05 15:39:52 +02:00
Guilherme Blanco
988d0001d3 Merge pull request #96 from calumbrodie/patch-1
Fixed inline example of concat method
2012-05-31 06:52:44 -07:00
Guilherme Blanco
2205045ca9 Merge pull request #95 from adanlobato/patch-1
Fixed some typos on Inheritance docs
2012-05-31 06:51:28 -07:00
Calum Brodie
e41704b211 Fixed inline example of concat method 2012-05-31 14:08:56 +02:00
Adán Lobato
b25548414b Fixed some typos on Inheritance docs 2012-05-31 10:51:38 +02:00
Benjamin Eberlei
34f7ccb5fa Merge pull request #94 from shieldo/patch-1
Improved grammar/ punctuation in pagination tutorial, and brought parame...
2012-05-30 07:09:49 -07:00
Douglas Greenshields
671177e162 Improved grammar/ punctuation in pagination tutorial, and brought parameter name in code example into line with actual parameter 2012-05-30 15:59:58 +02:00
Guilherme Blanco
9445502885 Removed un-necessary getIterator(). 2012-05-29 15:14:08 -04:00
Guilherme Blanco
6521e51170 Added missing BC compatibility in QueryBuilder. 2012-05-29 14:52:30 -04:00
Guilherme Blanco
e4935e58f2 Merge pull request #360 from doctrine/DDC-1840
[DDC-1840] Implemented parameters as a collection.
2012-05-29 11:41:00 -07:00
Guilherme Blanco
15f76c62bb Update UPGRADE_TO_2_3 2012-05-29 15:40:27 -03:00
Guilherme Blanco
161ae31a7e Adde more BC compatibility in setParameters. 2012-05-29 14:41:32 -04:00
Guilherme Blanco
b3e7493278 Made setParameters()/excute()/iterate() BC compatible. 2012-05-29 14:25:54 -04:00
Guilherme Blanco
8b4e08d694 Updated docs (trying to fix one-to-many with unidirectional join table example). 2012-05-28 12:39:31 -04:00
Guilherme Blanco
d8e165da8d Added 2.3 BC break information. 2012-05-28 12:28:54 -04:00
Guilherme Blanco
79ff1f10d2 Optimized getParameter. 2012-05-28 12:20:35 -04:00
Guilherme Blanco
1635e0af4b [DDC-1840] Implemented parameters as a collection. 2012-05-28 12:16:42 -04:00
Benjamin Eberlei
1f2ce21b56 [DDC-1497] Change EntityGenerator add method generation for collections. 2012-05-27 20:31:01 +02:00
Benjamin Eberlei
8e644e1303 [DDC-1685] Fix DDC-117 Dataset cleanup 2012-05-27 18:54:35 +02:00
Benjamin Eberlei
958d35a3f3 Merge branch 'DDC-1798' 2012-05-27 18:44:38 +02:00
Benjamin Eberlei
04b23dbf10 [DDC-1798] Exporter generate error when composite primary key is generated. Fixes GH-342 2012-05-27 18:44:31 +02:00
Benjamin Eberlei
47ac61b3e0 Merge branch 'DDC-1685' 2012-05-27 18:33:46 +02:00
Benjamin Eberlei
3398d1e287 [DDC-1685] Fix bug in OutputWalker when used on entities with Foreign Key as Primary Key. 2012-05-27 18:33:35 +02:00
Benjamin Eberlei
2e79637be8 Merge branch 'DDC-1713' 2012-05-27 17:22:25 +02:00
Benjamin Eberlei
03d5922996 [DDC-1713] Verify EntityRepository#findBy() works with fetching array of values. 2012-05-27 17:22:16 +02:00
Benjamin Eberlei
48aba0a3f0 Merge branch 'DDC-1777' 2012-05-27 17:11:29 +02:00
Benjamin Eberlei
6523f7f59e [DDC-1777] Fix bug in BasicEntityPersister#exists() when no primary key is set. 2012-05-27 17:11:21 +02:00
Benjamin Eberlei
c1fd0c479a Merge branch 'DDC-1791' 2012-05-27 13:22:56 +02:00
Benjamin Eberlei
f55b5411c8 [DDC-1791] Fix OutputWalker Pagination on Oracle 2012-05-27 13:22:48 +02:00
Benjamin Eberlei
eb8f524f81 Merge branch 'DDC-1783' 2012-05-27 12:00:54 +02:00
Benjamin Eberlei
44c867827c [DDC-1783] Fix memory leak in ObjectHydrator when using AbstractQuery#iterate() and EntityManager#clear() 2012-05-27 12:00:43 +02:00
Karsten Dambekalns
bcddc47356 [DDC-1835] Fix cloning persistent collections. 2012-05-27 10:17:12 +02:00
Benjamin Eberlei
9ae5b8f442 Merge branch 'DDC-1799' 2012-05-27 09:58:01 +02:00
Benjamin Eberlei
548c997f7b [DDC-1799] Fix bug in YamlExporter using OneToOne instead of ManyToOne 2012-05-27 09:57:46 +02:00
Benjamin Eberlei
0868ec1c19 Update Common and fix cache tests with different assumptions about keys. 2012-05-26 19:29:51 +02:00
Benjamin Eberlei
a5b90fd3c6 Merge pull request #358 from jalliot/patch-1
Update license for Composer
2012-05-26 09:51:19 -07:00
Jordan Alliot
dfae961913 Update license for Composer 2012-05-26 19:15:48 +03:00
Benjamin Eberlei
70458b2f48 LGPL => MIT 2012-05-26 14:37:00 +02:00
Guilherme Blanco
b32bb26a84 Re-added coverage for DDC-369 and DDC-954. 2012-05-23 01:07:29 -04:00
Guilherme Blanco
f54f8f8a95 Fixed anomalous bug of temporary existance table collision in case of any update/delete issue by dropping temp table, no matter what's the result of other executes. 2012-05-23 00:55:05 -04:00
Guilherme Blanco
738bfd8082 Reverted coverage for DDC-369 and DDC-954. 2012-05-23 00:14:50 -04:00
Guilherme Blanco
3e601c3a53 Added coverage for DDC-369 and DDC-954. All passing. 2012-05-23 00:10:25 -04:00
Benjamin Eberlei
a9398e7a74 Autoloaders not needed, composer provides them 2012-05-22 21:54:43 +02:00
Benjamin Eberlei
be6fb617df [DDC-1807] Fix composer bin support and keep BC with PEAR installer. 2012-05-22 20:26:03 +02:00
Benjamin Eberlei
e2d15c3a04 Merge pull request #353 from pscheit/patch-1
prevent the validator to stop with an "undefined array index"-error
2012-05-22 10:09:01 -07:00
Benjamin Eberlei
f686a3ac1b Merge pull request #354 from pscheit/master
ValidateSchemaCommand dont't call exit() in execute()
2012-05-22 10:03:44 -07:00
Philipp Scheit
e9f936c0ba don't call exit() in execute() 2012-05-22 14:25:54 +03:00
Guilherme Blanco
d05ad996c4 Implemented support for internal exception showing DQL that contains syntax or semantical error. 2012-05-21 16:34:27 -04:00
Guilherme Blanco
4627c8b3ee Re-synchronized DQL EBNF with current DQL support. 2012-05-21 16:13:15 -04:00
Philipp Scheit
f1571aeac3 prevent the validator to stop with an "undefined array index"-error while validating a wrong inversedBy Attribute 2012-05-21 19:23:22 +03:00
Benjamin Eberlei
93fcb74f9a Merge pull request #350 from stof/branch_alias
Added the branch-alias in the composer.json
2012-05-20 14:21:52 -07:00
Christophe Coevoet
1594831d8a Added the branch-alias in the composer.json 2012-05-20 21:33:56 +02:00
Guilherme Blanco
3d8e46447a Merge pull request #349 from FabioBatSilva/DDC-1822
Fix DDC-1822
2012-05-19 22:10:09 -07:00
Fabio B. Silva
0af5da77f1 fix DDC-1822 2012-05-19 13:40:01 -03:00
Benjamin Eberlei
4ef552e07a Merge pull request #317 from FabioBatSilva/DDC-1694
Fix DDC-1694
2012-05-05 04:39:28 -07:00
Benjamin Eberlei
a038f5edea Merge branch 'DDC-1786' 2012-05-05 09:28:53 +02:00
Benjamin Eberlei
758ffe06d2 [DDC-1786] Add note about BC in EntityManager#find(null) 2012-05-05 09:28:42 +02:00
Fabio B. Silva
e9974911fe fix tests 2012-05-04 21:13:20 -03:00
Fabio B. Silva
67f0722211 change test to uses data provider 2012-05-04 21:13:19 -03:00
Fabio B. Silva
790d98133c fix DDC-1694 2012-05-04 21:11:51 -03:00
Benjamin Eberlei
bd41e69a1f Merge DDC-1542 into master 2012-05-04 23:20:57 +02:00
Benjamin Eberlei
99e303e211 [DDC-1542] Refactored automatic discriminator map detection. 2012-05-04 23:15:12 +02:00
Guilherme Blanco
6103db0d04 Merge pull request #345 from hason/DDC-1802
Fixed DDC-1802
2012-05-04 13:04:08 -07:00
comfortablynumb
f0db9a842d [DDC-1542] - Inheritance: Added default discriminator map (only annotations yet) 2012-05-04 20:36:24 +02:00
Benjamin Eberlei
f566b79c87 Fix coding standards 2012-05-04 19:16:07 +02:00
Benjamin Eberlei
63b2c03a02 Merge pull request #331 from gedrox/DDC-1757
DDC-1757 test and patched query builder
2012-05-04 10:08:59 -07:00
Benjamin Eberlei
e09a9c7deb Merge pull request #315 from Ocramius/getclass-on-proxies-refactoring
Allowing proxies to be passed to ORM public API
2012-05-04 10:04:14 -07:00
Alexander
37ce0f15d6 Update test case for MappingException::invalidCascadeOption() 2012-05-04 18:26:17 +02:00
Alexander
3403305b3d Merge remote-tracking branch 'schmittjoh/betterExMessage' 2012-05-04 18:20:56 +02:00
Guilherme Blanco
5fddd1bee5 Merge pull request #324 from brikou/call_simplified
simplified Doctrine/ORM/EntityRepository::__call
2012-05-03 23:20:13 -07:00
Martin Hasoň
3d852397db DDC-1802 removed unnecessary tokens T_SIZE and T_MOD 2012-05-02 19:10:21 +02:00
Martin Hasoň
3ab6ad23ad DDC-1802 fixed parsing: FunctionDeclaration "NOT" ("LIKE" | "IN" | "BETWEEN") 2012-05-02 19:08:27 +02:00
Guilherme Blanco
0a09a28ec9 Merge pull request #335 from FabioBatSilva/DDC-964
association/attribute override
2012-04-28 20:24:18 -07:00
Guilherme Blanco
b5b569afd4 Merge pull request #93 from patrick-mcdougle/patch-1
Updated the decimal type mapping have a string on the php side. (current behavior)
2012-04-26 18:09:22 -07:00
patrick-mcdougle
b184772349 Updated the decimal type mapping have a string on the php side. (current behavior) 2012-04-26 14:21:51 -05:00
Fabio B. Silva
fa140d8f59 remove wrong conflit mark 2012-04-21 01:59:25 -03:00
Fabio B. Silva
5c7d7c6f05 remove duplicated 'require_once' 2012-04-21 01:53:34 -03:00
Fabio B. Silva
56fb1035de update docblock 2012-04-21 01:43:18 -03:00
Fabio B. Silva
f63cb95ef3 add annotations 2012-04-21 01:43:18 -03:00
Fabio B. Silva
85790f0752 support for attribute override 2012-04-21 01:43:18 -03:00
Fabio B. Silva
4df3c75321 added missing '\' 2012-04-21 01:41:05 -03:00
Fabio B. Silva
2f67750165 added tags on doctrine-mapping.xsd 2012-04-21 01:41:05 -03:00
Fabio B. Silva
3085c52f95 fix docblock and remove white spaces 2012-04-21 01:41:04 -03:00
Fabio B. Silva
9e010cbd34 added xml/yml drivers 2012-04-21 01:41:04 -03:00
Fabio B. Silva
30fdf8dd1b added support for @AssociationOverride 2012-04-21 01:38:34 -03:00
Guilherme Blanco
f61bd43621 Merge pull request #86 from FabioBatSilva/patch-5
Docs for NamingStrategy
2012-04-20 21:08:53 -07:00
Guilherme Blanco
da21917dad Merge pull request #85 from Tobion/patch-1
fix confusing typo in ordered collections
2012-04-20 21:07:14 -07:00
Aigars Gedroics
c827a98196 Merge branch 'DDC-1757' of github.com:gedrox/doctrine2 into DDC-1757 2012-04-20 16:07:42 +03:00
Aigars Gedroics
5392133beb [DDC-1757] test checks DQL only now, doesn't create schema anymore 2012-04-20 16:06:21 +03:00
Aigars Gedroics
3ddc461d30 [DDC-1757] Fix moved to private method, test improved. 2012-04-20 16:06:21 +03:00
gedrox
29a94f4f52 Parameter PHP documentation for the QueryBuilder::getRootAlias() method 2012-04-20 16:06:21 +03:00
Aigars Gedroics
a1ab3e8cf4 DDC-1757 test and patched query builder 2012-04-20 16:06:21 +03:00
Fabio B. Silva
e65dbcf2b5 Fix typo 2012-04-19 20:58:31 -03:00
Fabio B. Silva
a1e7389e71 docs for association/attribute override 2012-04-19 20:56:18 -03:00
Guilherme Blanco
ecd6e1d510 Merge pull request #92 from import/feature/new-cache-driver
New cache driver documentation
2012-04-19 07:02:26 -07:00
Osman Üngür
0222981161 Added notes about configuration 2012-04-19 11:34:12 +03:00
Osman Üngür
488914a4ac Added section about cache driver 2012-04-19 11:33:26 +03:00
Guilherme Blanco
d5d47222c1 Merge pull request #339 from FabioBatSilva/DDC-1784
Fix DDC-1784
2012-04-18 20:37:09 -07:00
Fabio B. Silva
9b02745cd8 Fix DDC-1784 2012-04-18 20:39:21 -03:00
Guilherme Blanco
7d9738e8c0 Merge pull request #91 from import/fix/sample-code-error
Fix for collection handling code sample
2012-04-18 08:40:57 -07:00
Osman Üngür
05a188da38 Fix for collection handling code sample 2012-04-18 17:13:14 +03:00
Benjamin Eberlei
d95e96bd3b Merge pull request #337 from richardmiller/composer_changes
Removed dependency on common as required by dbal anyway
2012-04-17 05:03:40 -07:00
Richard Miller
c008958950 Removed dependency on common as required by dbal anyway 2012-04-17 12:07:22 +01:00
Aigars Gedroics
59e598acc5 [DDC-1757] test checks DQL only now, doesn't create schema anymore 2012-04-17 10:57:31 +03:00
Guilherme Blanco
bad811df6a Merge pull request #293 from FabioBatSilva/DDC-1663
[DDC-1663]Native SQL Query Result Set Mappings
2012-04-16 12:06:26 -07:00
Benjamin Eberlei
4b09712761 Merge pull request #322 from rande/patch-1
In some weird situation the SimpleXmlIterator used to iterate on the ``$...
2012-04-16 09:55:05 -07:00
Benjamin Eberlei
193ac077d6 Merge pull request #316 from fixe/patch-1
Fixes autoloading of generated Annotations
2012-04-16 09:48:50 -07:00
Guilherme Blanco
03a74a250a Merge pull request #89 from krevindiou/fix-1
Fix typo
2012-04-16 08:33:40 -07:00
Arnaud BUCHOUX
6a80ebf985 Fix typo 2012-04-16 17:15:18 +02:00
Guilherme Blanco
c02ac6516e Merge pull request #336 from merk/DDC1778
Fixed DDC1778
2012-04-16 07:59:24 -07:00
Guilherme Blanco
4debe46d1f Merge pull request #88 from FabioBatSilva/patch-7
Docs for Named Native Query
2012-04-16 07:57:11 -07:00
Tim Nagel
6cbdf53975 Fixed DDC1778 2012-04-16 13:03:19 +10:00
Fabio B. Silva
58d4b2a617 docs for Named Native Query 2012-04-15 19:49:42 -03:00
Fabio B. Silva
2007f1ab95 annotations reference for named native query 2012-04-15 16:57:44 -03:00
Fabio B. Silva
ad9d590a15 added tags on doctrine-mapping.xsd 2012-04-15 15:40:43 -03:00
Fabio B. Silva
f8b1915efd named native query inheritance 2012-04-15 15:40:43 -03:00
Fabio B. Silva
52c49b444e test multiple entity results 2012-04-15 15:40:43 -03:00
Fabio B. Silva
9c87b5c689 php driver 2012-04-15 15:40:42 -03:00
Fabio B. Silva
4aa67a7598 static driver 2012-04-15 15:40:42 -03:00
Fabio B. Silva
b49180875c yml driver 2012-04-15 15:40:42 -03:00
Fabio B. Silva
531eb68d56 xml driver 2012-04-15 15:40:41 -03:00
Fabio B. Silva
6e93186db4 mapping driver tests 2012-04-15 15:40:41 -03:00
Fabio B. Silva
fdc9fdae3e refactory ResultSetMappingBuilder#addNamedNativeQueryMapping into small submethods 2012-04-15 15:40:41 -03:00
Fabio B. Silva
8c407af1fc fix postgres test 2012-04-15 15:40:41 -03:00
Fabio B. Silva
68665af6e8 test discriminator column 2012-04-15 15:40:41 -03:00
Fabio B. Silva
0cc2583a02 test scalar result 2012-04-15 15:40:40 -03:00
Fabio B. Silva
f813223036 test joined one-to-many and one-to-one 2012-04-15 15:40:40 -03:00
Fabio B. Silva
f018a56d6d test native query with result class 2012-04-15 15:40:40 -03:00
Fabio B. Silva
3b79951824 mapping driver tests 2012-04-15 15:40:40 -03:00
Fabio B. Silva
015ea809b0 added support for resultClass and empty fields 2012-04-15 15:39:22 -03:00
Fabio B. Silva
bfc7986b20 annotation driver and basic support 2012-04-15 15:39:22 -03:00
Fabio B. Silva
2b996128af sql result set mapping metadata 2012-04-15 15:39:22 -03:00
Fabio B. Silva
91e4702772 named native query metadata 2012-04-15 15:39:22 -03:00
Fabio B. Silva
530e4840dd native query annotations 2012-04-15 15:39:21 -03:00
Fabio B. Silva
987834a2dd wrap lines 2012-04-15 11:34:10 -03:00
Fabio B. Silva
3076e2a1f7 docs for NamingStrategy 2012-04-15 11:34:10 -03:00
Benjamin Eberlei
543a3ddb03 Merge pull request #84 from gedrox/patch-1
[#DWEB-103] Fixed UTC timezone creation
2012-04-13 02:17:43 -07:00
Tobias Schultze
301f4d0346 fix confusing typo in ordered collections 2012-04-12 23:22:06 +03:00
gedrox
429ac54a34 [#DWEB-103] Fixed UTC timezone creation. Constant DateTimeZone::UTC is 1024, string name is required for the DateTimeZone constructor. 2012-04-11 10:02:42 +03:00
Benjamin Eberlei
e168b4e543 More prominent note about ResultSetMappingBuilder in native-sql chapter 2012-04-10 23:16:51 +02:00
Aigars Gedroics
aa381951cd [DDC-1757] Fix moved to private method, test improved. 2012-04-10 11:47:05 +03:00
Marco Pivetta
cb7a77cc03 Removing usage of ClassUtil where not strictly needed
Optimizing the ClassMetadataFactory API instead and using ClassMetadata to check actual class names as da962f2e and c27b4de0 introduced too much overhead
2012-04-07 18:53:34 +02:00
Marco Pivetta
85ea27dba2 Adding tests for additional usages of the proxy classname in ORM public API
Like Proxy classnames in DQL, EM#getRepository, EM#getReference
2012-04-07 18:53:34 +02:00
Marco Pivetta
d1e868a32a Removing registration of proxy ClassMetadata by the proxyFactory
Ensuring that functionality is kept by checking for the real class name in the ClassMetadataFactory
2012-04-07 18:53:34 +02:00
Marco Pivetta
37279d0753 Adding test to verify validity of changes (fails without them) 2012-04-07 18:53:34 +02:00
Marco Pivetta
c4a2eaea49 Adding additional missing calls to classutils instead of get_class 2012-04-07 18:53:34 +02:00
Marco Pivetta
cbe4987e18 Using Doctrine\Common\Util\ClassUtil for class_name resolutionThis avoids exceptions when passing a Proxy instance to the public API of the EntityManager, ClassMetadataFactory or UnitOfWork when the Proxy itself isn't generated by the EntityManager itself, while discovering the correct ClassMetadata instance for the proxy 2012-04-07 18:53:33 +02:00
Benjamin Eberlei
022d27e4e9 Merge branch 'DDC-1534' 2012-04-07 10:43:05 +02:00
Benjamin Eberlei
de26952e29 [DDC-1534] YamlDriver wrongly used "inversedBy" inside join table condition although its independent. 2012-04-07 10:42:54 +02:00
Benjamin Eberlei
c92393026d Merge branch 'DDC-1771' 2012-04-07 10:30:17 +02:00
Benjamin Eberlei
d54fdf43d0 [DDC-1771] Abstract classes cannot be proxies and should be skipped in complete generation. 2012-04-07 10:30:09 +02:00
Benjamin Eberlei
a1a9f85fda Merge pull request #328 from Netpositive/master
addDiscriminatorMapClass fix
2012-04-07 00:44:29 -07:00
Benjamin Eberlei
d6ccd82cf6 Merge pull request #321 from import/feature/newCacheDriver
Addition for new cache driver
2012-04-07 00:20:55 -07:00
Guilherme Blanco
a5c13a5ef1 Merge pull request #329 from doctrine/DDC-1766
[DDC-1766] Initial implementation of hydration cache.
2012-04-06 06:50:11 -07:00
Benjamin Eberlei
0b3577f2d2 [DDC-1766] Rewrite getHydrationCacheId() to use existing processParameterValue() method. Other code style changes. 2012-04-05 22:40:40 +02:00
gedrox
49016bc156 Parameter PHP documentation for the QueryBuilder::getRootAlias() method 2012-04-05 13:56:08 +03:00
Aigars Gedroics
efebf26cc5 DDC-1757 test and patched query builder 2012-04-05 11:30:00 +03:00
Johannes M. Schmitt
84ec6dc9f5 improved exception message 2012-04-04 21:47:23 -05:00
Benjamin Eberlei
1095fb39cb [DDC-1766] More cleanups 2012-04-05 00:27:23 +02:00
Benjamin Eberlei
f7496b1482 [DDC-1766] Cleaned up code. 2012-04-05 00:26:09 +02:00
Benjamin Eberlei
d31c7f5e2b [DDC-1766] Explain details of Hydration cache, introduce AbstractQuery#setResultCacheProfile method 2012-04-04 23:55:14 +02:00
Benjamin Eberlei
c32a77e6be [DDC-1766] Add usage of default result cache driver, add more docs. 2012-04-04 23:47:32 +02:00
Benjamin Eberlei
fd2a22bd56 [DDC-1766] Add test with explicit cache key. 2012-04-04 23:42:17 +02:00
Benjamin Eberlei
864fbbdaaf [DDC-1766] Remove some testcode 2012-04-04 23:24:51 +02:00
Benjamin Eberlei
306f9e0ca2 [DDC-1766] Rename closure 2012-04-04 23:21:06 +02:00
Benjamin Eberlei
3047c4b955 [DDC-1766] Initial implementation of hydration cache. 2012-04-04 23:10:30 +02:00
Alexander
cc06508bd4 Added test coverage for repository functions when using filters 2012-04-04 22:00:01 +02:00
Somfai Mátyás
a2fd4eca37 Fixing a bug when calling setDiscriminatorMap from multiple sources (ie: from Events::loadClassMetadata and annotation). 2012-04-04 14:49:34 +02:00
Brikou CARRE
029071a144 simplified __call method 2012-04-03 17:33:00 +02:00
Thomas
5005bbe62b In some weird situation the SimpleXmlIterator used to iterate on the `$xmlRoot->field property just get resetted. This solution avoid this situation. This problem occurs when Symfony2 warms up cache with autogenerate proxy to true` 2012-04-02 14:55:35 +03:00
Osman Üngür
e69b022472 Fixed CS 2012-04-02 12:11:38 +03:00
Osman Üngür
4fc7389b1d New cache driver definition for Doctrine running in non-dev mode and cache driver is not set.
This cache driver was added with doctrine/common#109
2012-04-02 11:57:09 +03:00
Benjamin Eberlei
5b18718b92 [DDC-1746] Throw exception on invalid cascade option. 2012-04-01 11:01:58 +02:00
Tiago Ribeiro
975f3c4600 Fixes autoloading of generated Annotations 2012-04-01 02:59:03 +02:00
Benjamin Eberlei
c5c3719e79 Revert GH-311 2012-03-30 22:00:45 +02:00
Benjamin Eberlei
04a4f2fc24 Merge pull request #310 from FabioBatSilva/DDC-889
[DDC-889] Mention parent class for debugging purposes.
2012-03-30 12:55:49 -07:00
Benjamin Eberlei
dd263ce00d Merge pull request #313 from hason/tests
Fixed tests on Windows
2012-03-29 04:41:27 -07:00
Martin Hasoň
f3a9b1efc0 Fixed tests on Windows 2012-03-29 13:26:06 +02:00
Guilherme Blanco
290f8a79e4 Merge pull request #311 from benlumley/patch-1
Proposal: Support for default attribute in yaml mappings.
2012-03-28 18:09:50 -07:00
Ben Lumley
7a5ae3a1a2 Support for default attribute in yaml mappings. 2012-03-28 22:01:57 +02:00
Guilherme Blanco
2811d161bb Merge pull request #309 from FabioBatSilva/DDC-1686
Fix DDC-1686
2012-03-25 21:33:43 -07:00
Fabio B. Silva
6d1209c06d fix typo 2012-03-26 01:03:32 -03:00
Fabio B. Silva
67af9f1853 change comparison 2012-03-26 00:55:57 -03:00
Fabio B. Silva
d6809773db mention parent classes for identifier required exception. 2012-03-25 13:34:52 -03:00
Fabio B. Silva
449d8a66ad changed modifiers 2012-03-25 13:00:50 -03:00
Fabio B. Silva
f591e428c3 mention parent classes when not is a entity or mapped super class. 2012-03-25 12:54:09 -03:00
Fabio B. Silva
0f9afbdf0a Fix DDC-1686 2012-03-25 00:30:58 -03:00
Guilherme Blanco
8a52e3033b Merge pull request #308 from FabioBatSilva/DDC-1697
Fix DDC-1697
2012-03-24 20:29:52 -07:00
Fabio B. Silva
df8626b949 Fix DDC-1697 2012-03-24 22:50:54 -03:00
Benjamin Eberlei
ab15528fde Fix CS: AS => as in foreach loops. 2012-03-24 11:16:32 +01:00
Benjamin Eberlei
08b455b029 Merge branch 'dead_code_cleanup' 2012-03-24 11:08:20 +01:00
Hugo Hamon
16da74d1da [Query] removed unused private _peekBeyond() method from Parser class. 2012-03-24 11:07:44 +01:00
Hugo Hamon
c0620bf857 [Tools] removed unused local variable $assocName in ResolveTargetEntityListener class. 2012-03-24 11:07:41 +01:00
Hugo Hamon
ffa372a76c [Tools] removed unused local variable in YamlExporter class. 2012-03-24 11:07:41 +01:00
Hugo Hamon
505537d4ce [Tools] renamed AS to as in EntityGenerator class. 2012-03-24 11:07:41 +01:00
Hugo Hamon
68806aa8c6 [Tools] removed unused local variable $idHash in DebugUnitOfWorkListener class and renamed AS keywords to as. 2012-03-24 11:07:41 +01:00
Hugo Hamon
aca1470e6b [Tools] removed unused local variable $cm in InfoCommand class. 2012-03-24 11:07:40 +01:00
Hugo Hamon
5a1c1e55ef [Query] removed unused local variables in Parser class. 2012-03-24 11:07:39 +01:00
Hugo Hamon
43eebe1a8b [Query] removed unused local variable $lexer in SizeFunction class. 2012-03-24 11:07:39 +01:00
Hugo Hamon
19602d0a26 [Query] removed unused local variable $platform in IdentityFunction class. 2012-03-24 11:07:39 +01:00
Hugo Hamon
c4dcd39666 [Proxy] renamed AS to as. 2012-03-24 11:07:39 +01:00
Hugo Hamon
d09b733cc3 [Persisters] removed unused local variable in ManyToManyPersister class. 2012-03-24 11:07:39 +01:00
Hugo Hamon
d4bcbd4741 [Persisters] removed unused local variables in BasicEntityPersister class. 2012-03-24 11:07:39 +01:00
Hugo Hamon
74f52a055e [Mapping] removed unused local variable $fileName in StaticPHPDriver class. 2012-03-24 11:07:39 +01:00
Hugo Hamon
155c24772a [Mapping] removed unused local variables $versionAnnot and $tblGeneratorAnnot in AnnotationDriver class. 2012-03-24 11:07:39 +01:00
Hugo Hamon
a3d8207578 [Mapping] removed unused local variable $field in ClassMetadataInfo class. 2012-03-24 11:07:35 +01:00
Hugo Hamon
beae0865db [Mapping] removed unused local variable $fieldName in ClassMetadataFactory class. 2012-03-24 11:07:35 +01:00
Benjamin Eberlei
29318e183c [DDC-1723] Fix missing serialitation for custom generator definition. 2012-03-22 23:07:00 +01:00
Benjamin Eberlei
18e63f9cea Merge branch 'DDC-1723' 2012-03-22 22:30:35 +01:00
Benjamin Eberlei
bc4cf21c9d Merge velovint/SupportCustomIdGenerators 2012-03-22 22:29:15 +01:00
Benjamin Eberlei
7d7edbbd4a Merge pull request #288 from FabioBatSilva/DDC-775
DDC 775
2012-03-22 14:00:48 -07:00
Benjamin Eberlei
3aba23ea35 Merge pull request #304 from doctrine/feature/flush-many-documents
Allow flushing of many entities by passing an array of entities.
2012-03-22 12:34:01 -07:00
Alexander
1b2b831feb Merge pull request #306 from r1pp3rj4ck/patch-1
Fixed fetch mapping in xsd
2012-03-16 09:02:56 -07:00
Attila Bukor
7f3e90e291 Fixed fetch mapping in xsd
It was 'EXTRALAZY' and the constant name in ClassMetadata is 'EXTRA_LAZY'
2012-03-16 17:00:12 +01:00
Guilherme Blanco
6f3ef148a9 Merge pull request #305 from FabioBatSilva/DDC-1470
[DDC-1470] Error messages
2012-03-15 19:36:56 -07:00
Fabio B. Silva
9cee329407 Fix CS 2012-03-15 22:38:54 -03:00
Fabio B. Silva
36dc560533 Fix DDC-1470 2012-03-15 21:29:52 -03:00
Jonathan H. Wage
24e808844b Allow flushing of many entities by passing an array of entities. 2012-03-15 17:45:25 -05:00
Guilherme Blanco
44d7d23e8d Coding style fixes. 2012-03-15 01:26:06 -04:00
Guilherme Blanco
a16ca32981 Coding style fixes. 2012-03-15 01:15:47 -04:00
Guilherme Blanco
c3291f8f24 Coding style fixes. 2012-03-15 01:13:14 -04:00
Guilherme Blanco
c65b22eadf Coding style fixes. 2012-03-15 01:08:28 -04:00
Guilherme Blanco
2a399312f7 Coding style fixes. 2012-03-15 01:03:01 -04:00
Guilherme Blanco
666ae8f1b7 Coding style fixes. 2012-03-15 01:00:29 -04:00
Benjamin Eberlei
e1704402a6 Merge branch 'DDC-1648' 2012-03-14 21:39:29 +01:00
rivaros
9c4e52c136 Convention fix 2012-03-14 21:38:56 +01:00
Rivaros
b346f1901a convention fixes #2 2012-03-14 21:38:50 +01:00
Rivaros
df82b6060b Convention fixes 2012-03-14 21:38:43 +01:00
Rivaros
06eed4cfda Primary Keys as Foreign Keys - reverse engineering 2012-03-14 21:38:33 +01:00
Benjamin Eberlei
de5e4b0fdc [DBAL-1692] Throw exception if table has no primary key instead of fatal error. 2012-03-14 21:09:48 +01:00
Benjamin Eberlei
0e1eff14bc Merge branch 'DDC-1683' 2012-03-14 20:49:34 +01:00
Benjamin Eberlei
18f1d56b60 [DDC-1683] Fix bug with booleans not handled by Expr#literal() in query builder. 2012-03-14 20:49:25 +01:00
Benjamin Eberlei
01381fae1f [DDC-1698] Autoloading proxies 2012-03-14 20:11:17 +01:00
Benjamin Eberlei
9b4d60897d [DDC-1698] Add autoloader especially for the non PSR-0 Proxy class names. This is necessary when you want to deserialize your proxy classes from the session. 2012-03-14 20:03:17 +01:00
Alexander
c6ef7a7c03 Merge pull request #303 from sandermarechal/paginate-sql-walkers
Fix GROUP BY clauses for PostgreSQL
2012-03-14 00:16:29 -07:00
Sander Marechal
cb892736eb Fix GROUP BY clauses for PostgreSQL 2012-03-14 07:58:58 +01:00
Benjamin Eberlei
694d0911c9 Merge pull request #301 from sandermarechal/paginate-sql-walkers
Fix HAVING queries for PostgreSQL
2012-03-13 01:15:55 -07:00
Sander Marechal
b2fa2cb195 Fix HAVING queries for PostgreSQL 2012-03-13 07:59:14 +01:00
Fabio B. Silva
84b31714a6 fix indentation 2012-03-12 22:07:43 -03:00
Fabio B. Silva
e46275e80d remove case expressions and functions support 2012-03-12 20:26:40 -03:00
Fabio B. Silva
797c9cf70e supports simple math operator 2012-03-12 20:26:39 -03:00
Fabio B. Silva
df0632258a Order by clause support case expressions 2012-03-12 20:26:38 -03:00
Fabio B. Silva
ce9643bce1 Order by clause support functions 2012-03-12 20:26:38 -03:00
Alexander
73db4e19d2 Merge branch 'merge_non_mapped_properties' 2012-03-12 23:19:16 +01:00
Alexander
e3933e265e Add upgrade file + note about merging entities 2012-03-12 23:18:56 +01:00
Klein Florian
ac1ffaf7e9 make merge copy non persited properties too 2012-03-12 23:18:56 +01:00
Benjamin Eberlei
775936399e Merge branch 'DDC-451' 2012-03-12 12:56:44 +01:00
Benjamin Eberlei
23d004844a [DDC-451] Adjust doctrine-mapping.xsd for new UUID generator 2012-03-12 12:52:36 +01:00
Benjamin Eberlei
d57159ad54 [DDC-451] Add test for UUIDGenerator 2012-03-12 12:48:14 +01:00
Maarten de Keizer
33c5f4f678 Fix comments 2012-03-12 12:32:33 +01:00
Maarten de Keizer
0a835609fa UUID id generator 2012-03-12 12:32:33 +01:00
Benjamin Eberlei
3788d0e815 Merge pull request #298 from sandermarechal/paginate-sql-walkers
Pagination using SQL walkers
2012-03-12 01:04:34 -07:00
Sander Marechal
43f97a9abc CountOutputWalker does not need CountWalker::HINT_DISTINCT 2012-03-12 08:39:28 +01:00
Sander Marechal
53ff312936 Renamed *SqlWalker to *OutputWalker 2012-03-12 08:33:35 +01:00
Guilherme Blanco
7954386705 DDC-1696 Allowed Strings to be used inside of Case expressions. It seems this fixes other misterious use cases not yet identified by us. 2012-03-11 21:14:08 -04:00
Benjamin Eberlei
0a78f7bc11 [DDC-1695] Fix bug in SQL Walker array hydration with escaped fields. 2012-03-11 23:27:51 +01:00
Benjamin Eberlei
4dd296f9ca Merge pull request #299 from patrick-mcdougle/patch-1
Fixed comment for createQuery to include the variable name.
2012-03-11 14:49:43 -07:00
Alexander
3faa1a78c2 [DDC-1426] sizeof() -> count() + added tests 2012-03-11 22:32:30 +01:00
Martin Pöhlmann
39ad87650e findByXXX/findOneByXXX does now also accept orderBy, limit and offset args
Conflicts:

	lib/Doctrine/ORM/EntityRepository.php
2012-03-11 22:32:30 +01:00
Benjamin Eberlei
79d9c07652 [DDC-1693] Fix fatal errors in DQL when using Optimistic or None lock modes. Added tests. 2012-03-11 22:29:20 +01:00
Sander Marechal
47964a1605 Use assertCount for simpler tests 2012-03-08 09:48:41 +01:00
Sander Marechal
ad871e8b26 Cleaned up use statements 2012-03-08 09:41:35 +01:00
Sander Marechal
c9d962b12a Fix indentation 2012-03-07 08:57:51 +01:00
Sander Marechal
2f817b30c3 Use a dataProvider to test both TreeWalker and SqlWalker pagination 2012-03-07 08:52:00 +01:00
Sander Marechal
d2501a9e4a Throw exception when using the CountWalker with a HAVING query 2012-03-07 08:42:09 +01:00
patrick-mcdougle
7798c94a40 Fixed comment for createQuery to include the variable name. 2012-03-06 14:18:18 -06:00
Sander Marechal
edd5d14b06 Pagination using SQL walkers
A CountSqlWalker and LimitSubquerySqlWalker have been implemented. By
default the Paginator will use these SQL walkers. When a query already
uses custom SQL walkers, the Paginator will fall back to the existing
TreeWalker implementations. Improvements:

* Support for more complex DQL queries using named mixed results with
  GROUP BY and HAVING. For example:

  SELECT g, u, COUNT(u.id) AS userCount
      FROM Entity\Group g LEFT JOIN g.users u
      GROUP BY g.id
      HAVING userCount > 0

* Support for entities with composite primary keys in the CountSqlWalker
  and LimitSubquerySqlWalker. Only the WhereInWalker still needs to be
  updated for full composite primary key support. But someone smarter
  than me needs to look at that and figure out how to build a WHERE IN
  query that can select rows based on multiple columns.
2012-03-06 16:24:44 +01:00
Guilherme Blanco
f6a61b133e Fixed roken MySQL test. 2012-03-05 01:54:43 -05:00
Guilherme Blanco
f1fe360788 Merge pull request #296 from brikou/patch-2
According to "Doctrine's implicit CS" and "Symfony's implicit CS" an emp...
2012-03-04 07:36:25 -08:00
Brikou CARRE
e130df4f42 According to "Doctrine's implicit CS" and "Symfony's implicit CS" an empty line added to the end of the file (...same tweaks like the one pushed for the entity generator) 2012-03-04 09:43:52 +01:00
Guilherme Blanco
1a192b6530 Moved SQRT function to Platform. 2012-03-03 23:10:56 -05:00
Benjamin Eberlei
6195d42778 Merge branch 'DDC-1668' 2012-03-03 22:25:00 +01:00
Benjamin Eberlei
794b4ef09c [DDC-1668] Fix problem with the is_int fowards compatibility check. Its not really necesssary anymore, we should remove this code in the future. 2012-03-03 22:24:51 +01:00
Benjamin Eberlei
9cddaf3075 Merge pull request #256 from F5/many_to_many_listeners
When using a ManyToMany relationship no listener is notified about any change to the owning entity
2012-03-03 13:13:09 -08:00
Guilherme Blanco
bf80ee6a30 [DDC-1673] Fixed unused in ProxyFactory. 2012-03-03 13:16:26 -05:00
Guilherme Blanco
a47e566382 [DDC-1667] Removed implicit obligation to define an Index and UniqueConstraint name. It is optional, but Annotations Driver was broken if not defined. 2012-03-03 13:05:11 -05:00
Benjamin Eberlei
1447884fde Merge pull request #295 from brikou/patch-1
According to "Doctrine's implicit CS" and "Symfony's implicit CS" an emp...
2012-03-03 04:23:50 -08:00
Benjamin Eberlei
4a68b90f6f Merge pull request #294 from jmikola/patch-1
Fix typo in LifecycleEventArgs::getEntity() docs
2012-03-03 04:23:18 -08:00
Brikou CARRE
cb2c71b16a According to "Doctrine's implicit CS" and "Symfony's implicit CS" an empty line added to the end of the file 2012-03-02 09:57:24 +01:00
Jeremy Mikola
3d0e87bca9 Fix typo in LifecycleEventArgs::getEntity() docs 2012-03-01 17:03:46 -05:00
Guilherme Blanco
7782f91131 Merge pull request #82 from augustohp/patch-1
Fixed typo "Assocations" in doc index
2012-02-27 10:00:24 -08:00
Augusto Pascutti
579774f505 Fixed typo "Assocations" 2012-02-27 14:55:52 -03:00
Guilherme Blanco
e8fbafd154 Fixed OneToMany bidirectional association mapping in Annotations and also included the YAML missing one. 2012-02-26 11:40:13 -05:00
Guilherme Blanco
48dcee9d60 [DDC-1616] Removed non-SQL message and improve exportability of SchemaTool CreateCommand. 2012-02-22 01:19:01 -05:00
Vitali Yakavenka
78d3f647ff Merge branch 'master' of git://github.com/doctrine/doctrine2 into SupportCustomIdGenerators 2012-02-21 09:45:16 +03:00
Guilherme Blanco
55a9e1e90c Merge pull request #290 from doctrine/DDC-1652
[DDC-1652] Fix SqlWalker to include foreign key identifiers in SQL SELEC...
2012-02-20 14:34:52 -08:00
Benjamin Eberlei
1bbd52b8ee [DDC-1652] Fix SqlWalker to include foreign key identifiers in SQL SELECT statement no matter what the meta column setting is suggesting. 2012-02-20 17:48:34 +01:00
Benjamin Eberlei
9b9acd6e9e Fix composer.json with regards to latest changes. 2012-02-20 16:03:42 +01:00
Benjamin Eberlei
dbd646b2de [DDC-1649] Fix notice by last commit. 2012-02-20 15:55:19 +01:00
Benjamin Eberlei
502585bf40 [DDC-1649] Add additional check for not allowed mapping of dependent association keys. 2012-02-20 15:55:18 +01:00
Benjamin Eberlei
af07bd7818 Merge pull request #273 from smoya/master
No unique join column fields for Single Table inheritance type.
2012-02-20 06:55:00 -08:00
Benjamin Eberlei
35ded56fdd Add note about debugging DQL queries. 2012-02-20 10:48:57 +01:00
Benjamin Eberlei
a32948b20f Merge branch 'DDC-1654' 2012-02-20 10:33:26 +01:00
Benjamin Eberlei
68436fee75 [DDC-1654] Add support for orphanRemoval on ManyToMany associations. This only makes sense when ManyToMany is used as uni-directional OneToMany association with join table. The join column has a unique constraint on it to enforce this on the DB level, but we dont validate that this actually happens. Foreign Key constraints help prevent issues and notify developers early if they use it wrong. 2012-02-20 10:33:16 +01:00
Benjamin Eberlei
85d1707a2b Merge branch 'DDC-1659' 2012-02-20 09:36:51 +01:00
Benjamin Eberlei
35764c2402 [DDC-1659] Remove read only marker when clearing entities. 2012-02-20 09:36:35 +01:00
Benjamin Eberlei
5d352389b7 Merge pull request #270 from bmichotte/master
Fluent interface and relations
2012-02-20 00:24:07 -08:00
Benjamin Eberlei
f040ed0cf0 Merge pull request #287 from goetas/nullable
Nullable assocations for entity generator
2012-02-19 15:30:17 -08:00
Benjamin Eberlei
361c88d6ea Merge pull request #55 from michal-pipa/fix-indentation
Fixed indentation.
2012-02-18 15:56:26 -08:00
Benjamin Eberlei
9b484192c4 Merge pull request #81 from meze/patch-1
Fix a typo in a code example (getResults instead of getResult)
2012-02-18 15:55:38 -08:00
meze
86010bdb0d Fix a typo in a code example (getResults instead of getResult) 2012-02-19 03:01:29 +04:00
Benjamin Eberlei
6cd82d77f5 Merge branch 'DDC-1651' 2012-02-18 16:08:09 +01:00
Benjamin Eberlei
bd1bc07270 [DDC-1651] Convert entities as parameters early in setParameter() to avoid them being part of result cache strings, which causes non-uniqueness. 2012-02-18 16:07:55 +01:00
Benjamin Eberlei
93f79d0810 Merge branch 'DDC-1643' 2012-02-18 00:43:04 +01:00
Benjamin Eberlei
9fc1d85e8d [DDC-1643] Fix bugs when cloning PersistentCollection and re-using it. 2012-02-18 00:42:21 +01:00
Benjamin Eberlei
d995c6dbdc [DDC-1655][DDC-1650][DDC-1556] Fix issues with @postLoad Callback being not fired, or fired multiple times. 2012-02-17 23:27:16 +01:00
Asmir Mustafic
d1b2dabc0f nullable assoc 2012-02-15 12:43:55 +01:00
Guilherme Blanco
e6b99c2059 Merge pull request #283 from FabioBatSilva/DDC-807
Fix DDC-807
2012-02-14 10:27:49 -08:00
Guilherme Blanco
2c3c5b34cf Merge pull request #282 from FabioBatSilva/discriminatorColumnName
Mandatory discriminator column name
2012-02-14 10:26:01 -08:00
Guilherme Blanco
e5d1f9e724 Merge pull request #284 from meandmymonkey/docblock-fix
docblock/typehint fix
2012-02-14 10:24:04 -08:00
Andreas Hucks
1d927541e2 added type hint 2012-02-14 19:12:20 +01:00
Andreas Hucks
3419c65efe fixed docblock 2012-02-14 19:08:44 +01:00
Andreas Hucks
2e81fbfd64 added type hint 2012-02-14 19:08:17 +01:00
Fabio B. Silva
da9b2e805e remove unused parameter 2012-02-13 23:43:19 -02:00
Fabio B. Silva
cdde6e8a5c fix required discriminator column name 2012-02-13 23:38:36 -02:00
Fabio B. Silva
5d01123413 Fix DDC-807, DDC-553 2012-02-13 23:22:49 -02:00
Benjamin Eberlei
138b67db86 Fix wrong use of private in mapped superclasses, only protected is supported here. 2012-02-13 11:18:35 +01:00
Guilherme Blanco
38d725ce32 Merge pull request #279 from FabioBatSilva/DDC-1642
Fix DDC-1642
2012-02-12 16:46:41 -08:00
Fabio B. Silva
86054eb659 fix DDC-1642 2012-02-12 22:24:03 -02:00
Benjamin Eberlei
600d0ba2a2 Merge branch 'DDC-1641' 2012-02-10 21:39:27 +01:00
Benjamin Eberlei
299def4712 DDC-1641 - Fix test producing failure when skipped. 2012-02-10 21:39:17 +01:00
Benjamin Eberlei
ea95bd57ef Rework a bit 2012-02-05 22:54:28 +01:00
Benjamin Eberlei
3def848422 Fix enumeration 2012-02-05 22:51:42 +01:00
Benjamin Eberlei
6fa7580d10 Add tutorial about Pagination 2012-02-05 22:46:43 +01:00
Benjamin Eberlei
984c8f7db1 Fix versions 2012-02-05 22:28:30 +01:00
Benjamin Eberlei
53947bf2e9 Merge pull request #79 from asm89/filters
Fix code blocks
2012-01-31 13:24:41 -08:00
Alexander
bd30a04d0d Fix code blocks 2012-01-31 22:24:36 +01:00
Guilherme Blanco
18bdc53907 Merge pull request #78 from asm89/filters
Documentation for the new filter functionality
2012-01-31 13:20:55 -08:00
Alexander
6f56dbe395 Added filters to the index 2012-01-31 15:58:31 +01:00
Alexander
ff9e7ef64b Processed comments of @Ocramius 2012-01-31 15:56:24 +01:00
Alexander
cfbfac6a51 General information on how the filter work etc + warning on the enabling/disabling part 2012-01-31 15:56:24 +01:00
Alexander
7c8a9c0f9a Initial draft for filter documentation 2012-01-31 15:56:24 +01:00
Alexander
19a4d05035 Merge pull request #274 from mvrhov/DDC-1625
Proxy not initialized when parent has get<IDENTIFIER> function.
2012-01-30 07:23:19 -08:00
Miha Vrhovnik
bea78f42e3 Proxy not initialized when parent has get<IDENTIFIER> function. Fixes DDC-1625 2012-01-30 11:44:08 +01:00
Benjamin Eberlei
d378b5aec8 Update theme 2012-01-30 00:56:14 +01:00
Benjamin Eberlei
c613351f39 Added 10 quick steps section 2012-01-29 22:40:38 +01:00
Benjamin Eberlei
9bd51f2062 Update theme 2012-01-29 20:56:48 +01:00
Benjamin Eberlei
cfd5eefa7a Update theme 2012-01-29 20:54:51 +01:00
Benjamin Eberlei
781f83f648 Update unitofwork section 2012-01-29 20:45:17 +01:00
Benjamin Eberlei
02e7dcdc87 Fix conf.py for 2.2 release 2012-01-29 20:06:07 +01:00
Benjamin Eberlei
8a39a66057 Some fixes in the docs 2012-01-29 20:03:40 +01:00
Benjamin Eberlei
5e3e48c8dd Rename getting-started tutorial page. 2012-01-29 19:48:09 +01:00
Benjamin Eberlei
0b7d5f2813 Merge pull request #50 from cordoval/patch-3
corrected rst for bash like code blocks
2012-01-29 10:36:41 -08:00
Benjamin Eberlei
ccabbf328f Merge pull request #56 from michal-pipa/fix-underline
Fixed title underline.
2012-01-29 10:36:25 -08:00
Guilherme Blanco
022c08d947 Merge pull request #77 from Ocramius/patch-3
Making the correct usage of LIKE expressions and placeholders explicit
2012-01-29 07:40:52 -08:00
Marco Pivetta
f9523aa419 Making the correct usage of LIKE expressions and placeholders explicit 2012-01-29 15:59:45 +01:00
Benjamin Eberlei
e774b1d8c0 Fix test for non-mysql like datetimes. 2012-01-29 15:02:40 +01:00
Benjamin Eberlei
3c4d2cd890 Merge pull request #253 from mrmkrs/protectedfields
enable set visibilty of class fields in EntityGenerator
2012-01-28 13:13:37 -08:00
Benjamin Eberlei
120bad8a2c Merge pull request #262 from wrightlabs/patch-1
added optional Command array as parameter for run method
2012-01-28 13:12:50 -08:00
Benjamin Eberlei
6b1ef08a46 Merge pull request #162 from ericclemmons/patch-1
ProxyFactory creates proxy's parent structure if it doesn't exist
2012-01-28 13:12:26 -08:00
Benjamin Eberlei
359a9c015b Merge pull request #196 from goetas/manyidx
Added some improvments for generated XML
2012-01-28 13:11:22 -08:00
Benjamin Eberlei
2ce705ceb3 Merge pull request #272 from jsor/table_options
Implement custom options on table level and complete column options implementation
2012-01-28 12:56:19 -08:00
Benjamin Eberlei
16b22f0f31 Merge pull request #266 from FabioBatSilva/DDC-1412
[DriverChain] Fix DDC-1412 Default Driver
2012-01-28 12:54:47 -08:00
Benjamin Eberlei
585ba534a6 Merge branch 'DDC-1526' 2012-01-28 12:28:23 +01:00
Benjamin Eberlei
3407620bf8 [DDC-1526] Collections are not marked as initialized when they are fetch joined but dont contain any results. This only occurs when using LEFT JOINs on the assocations and causes another query to be fired when the empty collection is accessed again. 2012-01-28 12:28:16 +01:00
Benjamin Eberlei
f9e943fefb Merge branch 'DDC-1617' 2012-01-28 11:16:48 +01:00
Benjamin Eberlei
551df4af52 [DDC-1617] Implement support for Generating Unique Constraints/Indexes in @Table annotation of EntityGenerator. 2012-01-28 11:16:36 +01:00
Benjamin Eberlei
b0ec3dfb47 Started refactoring of the documentation towards smaller chapters, grouped into logical units with better explanations (hopefully). 2012-01-28 00:49:37 +01:00
Benjamin Eberlei
19b7d4d0d4 Simplify section names even more 2012-01-27 21:43:04 +01:00
Benjamin Eberlei
d5a97c0c59 Add fancy new index page, moving toc to toc.rst 2012-01-27 21:36:36 +01:00
jsor
fac820f0e2 Complete custom column option implementation
- Support for xml driver
- Tests
2012-01-27 11:05:47 +01:00
Guilherme Blanco
3b9aac21c4 Merge pull request #76 from shiroyuki/patch-1
Changed from "@var string" to "@var int" for the complete version of ent...
2012-01-26 08:57:28 -08:00
Sergio Moya
88bbee127c No unique join column fields for Single Table inheritance type. 2012-01-26 17:37:50 +01:00
Juti Noppornpitak
3880ec6839 Changed from "@var string" to "@var int" for the complete version of entities/User.php. 2012-01-26 11:29:32 -05:00
Jan Sorgalla
d68fcd8bd2 Implement custom options on table level 2012-01-26 15:05:26 +01:00
Benjamin Eberlei
35fc3c0671 Merge branch 'DDC-1619' 2012-01-25 10:19:18 +01:00
Benjamin Eberlei
7dae89bb02 [DDC-1619] Add QueryBuilder#distinct 2012-01-25 10:19:01 +01:00
Benjamin Eberlei
f0a09a2d52 Merge branch 'DDC-1618' 2012-01-25 00:03:56 +01:00
Thomas Rabaix
8027fca378 Add SqlWalker::HINT_DISTINCT constant 2012-01-25 00:03:40 +01:00
Thomas Rabaix
d9bb861b1f Fix DDC-1618 - add more check before throwing an iterateWithFetchJoinNotAllowed exception 2012-01-25 00:03:40 +01:00
Benjamin Michotte
1d2f46bda7 Add fluent code for relations 2012-01-24 19:08:25 +01:00
Benjamin Eberlei
aca20fc615 Merge pull request #268 from sandermarechal/paginate-where-not
Add support for paginating WHERE NOT ... queries
2012-01-23 11:50:50 -08:00
Sander Marechal
c6c82efe07 Fixed indentation 2012-01-23 16:11:30 +01:00
Sander Marechal
5dc0081f56 Add support for paginating WHERE NOT ... queries
The Pagination tool throws an exception on a DQL query like:

SELECT u FROM User u WHERE NOT (u INSTANCE OF Person)

This is because Paginate does not know about the
Doctrine\ORM\Query\AST\ConditionalFactor which implements the NOT
operator. This patch adds support for that.
2012-01-23 15:42:41 +01:00
Benjamin Eberlei
9602e6785e Updated theme 2012-01-23 00:44:19 +01:00
Benjamin Eberlei
7918a42a0e Theme submodule 2012-01-22 23:25:48 +01:00
Benjamin Eberlei
81ba71e8d5 Remove _theme 2012-01-22 23:24:01 +01:00
Benjamin Eberlei
23529e839d Adjust css 2012-01-22 23:15:52 +01:00
Benjamin Eberlei
34a696c3d6 Add all static dependencies instead of loading them from doctrine project site. 2012-01-22 23:09:21 +01:00
Benjamin Eberlei
cad694e469 Explicit Javascripts 2012-01-22 22:49:14 +01:00
Benjamin Eberlei
17d91d173b Change _templates override into a theme "doctrine". 2012-01-22 22:23:19 +01:00
Benjamin Eberlei
8bf1c96ae1 Merge branch 'DDC-1613' 2012-01-22 13:35:26 +01:00
Benjamin Eberlei
775071e1ff [DDC-1613] Merge KnpLabs/Pagerfanta Pagination into a Doctrine\ORM\Tools\Pagination namespace. Thanks to @hobodave, pablo and the knplabs team for developing and maintaining this code. 2012-01-22 13:35:06 +01:00
Benjamin Eberlei
358bb2ec33 Merge pull request #267 from webtor/master
Bugfix for crushing when git clone --recursive doctrine2
2012-01-22 01:40:14 -08:00
Alexandr Torosh
9f831f4c98 changed submodule doctrine-build-common url
https://github.com/doctrine/doctrine-build-common.git
to
git://github.com/doctrine/doctrine-build-common.git
with read-only access
2012-01-21 23:38:55 +02:00
Fabio B. Silva
0fce3c8f97 Fix DDC-1412 2012-01-21 12:42:46 -02:00
Benjamin Eberlei
1d46d2b9af Merge branch 'DDC-1610' 2012-01-21 13:58:33 +01:00
Benjamin Eberlei
faf92883b6 [DDC-1610] Add test and fix wakeup reflection in combination with event listener 2012-01-21 13:58:25 +01:00
Benjamin Eberlei
44831f21c1 Merge branch 'DDC-1612' 2012-01-21 13:06:38 +01:00
Benjamin Eberlei
6c24251452 [DDC-1612] Fix bug with EntityManager#flush($entity) on new entities. 2012-01-21 13:06:30 +01:00
Benjamin Eberlei
1d6a21f7fa Merge branch 'DBAL-204' 2012-01-21 11:32:07 +01:00
Benjamin Eberlei
0f3abde413 [DBAL-204] Filter namespaced assets if Schemas/Emulation is not supported. 2012-01-21 11:31:54 +01:00
Guilherme Blanco
febfe35c23 Added coverage for DDC-1529. 2012-01-18 23:51:11 -05:00
Guilherme Blanco
74f3ed7e29 Fixing CS. 2012-01-18 23:27:28 -05:00
Guilherme Blanco
b98280a504 Quick optimizations are always good. 2012-01-18 23:09:23 -05:00
Benjamin Eberlei
e0fc09994c DDC-742 - Flush Memcache, otherwise fail. 2012-01-18 21:32:56 +01:00
Guilherme Blanco
d39760ba49 Fixed DDC-1608. Non-initialized PersistentCollection methods removeElement and contains now deal correctly with managed entities. 2012-01-18 01:04:25 -05:00
John Wright
543c73bc05 added optional command array as parameter for run method 2012-01-16 21:01:44 -08:00
Guilherme Blanco
c1012f7970 Merge pull request #259 from danielholmes/m2m_extra_lazy_contains
Added fix for collection->contains with many-to-many extra lazy fetchMode
2012-01-16 19:51:11 -08:00
Guilherme Blanco
2bb511584e Merge pull request #261 from armetiz/patch-7
Unique key name isn't correctly set - DDC-1603
2012-01-16 19:44:22 -08:00
Guilherme Blanco
0f07044836 Added coverage to DDC-1587. 2012-01-16 22:31:14 -05:00
Guilherme Blanco
1b23b4bc47 Merge pull request #75 from hype-/patch-1
Added missing docblock endings.
2012-01-16 13:20:53 -08:00
Mikko Hirvonen
d44d82b694 Added missing docblock endings. 2012-01-16 22:08:49 +02:00
Guilherme Blanco
fdb2b9c655 Optimized scalar type mapping support. 2012-01-16 14:26:13 -05:00
armetiz
21c9be74c9 Update lib/Doctrine/ORM/Tools/SchemaTool.php 2012-01-16 13:54:04 +01:00
Benjamin Eberlei
28403abe78 Merge branch 'DDC-1604' 2012-01-16 12:51:20 +01:00
Benjamin Eberlei
a029b28423 [DDC-1604] Have ORM Proxy implement new \Doctrine\Common\Persistence\Proxy
* Adjust ProxyFactory to generate proxies according to new naming schema.
* Change proxy naming and file-name generation to be a bit more consistent than previous approach.

[DDC-1598] Additional regexp to check for simple ID methods to make it even more safe.
2012-01-16 12:50:36 +01:00
armetiz
56c49fedd2 Unique key name isn't correctly set - DDC-1603 2012-01-16 10:30:15 +01:00
Daniel Holmes
a12e5ac8a7 Updated some comparisons to strict equality 2012-01-16 08:12:11 +11:00
Benjamin Eberlei
27451a59d4 Merge pull request #254 from jsor/custom_options
Pass options attribute in @Column annotation to Schema\Column's customSchemaOptions
2012-01-15 09:06:46 -08:00
Benjamin Eberlei
47e56de443 Merge branch 'DDC-1594' 2012-01-15 17:42:37 +01:00
Benjamin Eberlei
56ea4872ca DDC-1594 - Fix problem with merge and an existing managed proxy instance. 2012-01-15 15:48:44 +01:00
Benjamin Eberlei
36ce26691d DDC-1585 - Throw exception if setting target entity of the wrong type to an assocation. 2012-01-15 14:59:20 +01:00
Daniel Holmes
5deebc8738 Added fix for collection->contains when many-to-many extra lazy fetchMode 2012-01-15 23:25:57 +11:00
Benjamin Eberlei
3c391f8f37 Merge pull request #258 from danielholmes/patch-1
Fix namespace of BasicEntityPersisterTypeValueSqlTest
2012-01-15 03:33:30 -08:00
Daniel Holmes
cd6b584722 Fix namespace of BasicEntityPersisterTypeValueSqlTest 2012-01-15 22:31:01 +11:00
Benjamin Eberlei
e8e830f10a Merge branch 'DDC-1601' 2012-01-15 12:12:15 +01:00
Benjamin Eberlei
9950af2f58 [DDC-1601] Fix failing test and remove unused code 2012-01-15 12:12:08 +01:00
Benjamin Eberlei
106f10513f [DDC-1601] Fix bugs in SchemaValidator, using all modelsets as testdata for a large test 2012-01-15 11:27:52 +01:00
Benjamin Eberlei
6ffe4d3dda [DDC-1601] Fix bugs in SchemaValidator, using all modelsets as testdata for a large test 2012-01-15 11:27:28 +01:00
Guilherme Blanco
ea14bcff4a Fixed DDC-657. Added type conversion to scalar result. 2012-01-13 20:46:59 -05:00
Marcel
f76d327413 use self:: instead of EntityGenerator:: 2012-01-13 14:43:13 +01:00
Marcel
72d5d0281a use !== to check field visibility
use class constants
2012-01-13 14:34:34 +01:00
Marcel
69f0d70a98 fix if coding standard
fix typo
2012-01-13 14:14:28 +01:00
Francisco Facioni
bab14bfd24 UnitTest for ManyToMany update notification 2012-01-13 09:35:27 -03:00
Marcel
f26d43b3ea remove whitespace
tabs -> spaces
added class constants
updated phpdoc
2012-01-13 11:24:35 +01:00
Guilherme Blanco
649d29414f Fixed one-to-many unidirectional with join table chapter. 2012-01-13 01:09:28 -05:00
Guilherme Blanco
52ee848bcb Added coverage to DDC-1595 and DDC-1596. 2012-01-13 00:37:59 -05:00
Guilherme Blanco
bb10211983 Fixes DDC-1596. Added table alias to discriminator column when using STI. 2012-01-12 23:58:08 -05:00
Guilherme Blanco
da7fd2ece7 Merge pull request #250 from FabioBatSilva/DDC-1575
[DDC-1575] Give the FQCN to the naming strategy
2012-01-12 20:45:22 -08:00
Francisco Facioni
e7a6d87990 When using a ManyToMany relationship no listener is notified about any change to the owning entity.
What I'm doing with this patch is marking the entity for update when there is a modification in the ManyToMany relationship so the listeners are notified about it.

The main reason for this is for hooking up services like Solr or other indexers to update the entities even for ManyToMany relationships.
2012-01-12 14:38:07 -03:00
Benjamin Eberlei
c1dae35a24 Fix notice when using regenerate if exists and file is not new. 2012-01-12 11:20:49 +01:00
jsor
615e22073f Pass options attribute in @Column annotation to Schema\Column's customSchemaOptions 2012-01-11 15:58:57 +01:00
Benjamin Eberlei
7b4349a9ce Rewrite installation and configuration of Tools chapter. 2012-01-09 10:36:56 +01:00
Benjamin Eberlei
1d5597917b Fix TIP and show new cache instropection API (2.2) 2012-01-09 08:37:12 +01:00
Benjamin Eberlei
adec530c13 Merge branch '2.2' 2012-01-09 08:26:33 +01:00
Benjamin Eberlei
d0b0b0ce59 Merge 2.2 2012-01-09 08:05:15 +01:00
Benjamin Eberlei
773fbd9edb Merge branch '2.2' 2012-01-09 08:04:44 +01:00
Vitali Yakavenka
53ecedf70a Remove support to pass arguments to custom ID generator's constructor 2012-01-08 15:20:35 +03:00
Vitali Yakavenka
b09201ae88 Recover changes in ClassMetadataFactoryTest::_createValidClassMetadata() lost during last merge 2012-01-08 14:55:08 +03:00
Vitali Yakavenka
59e9d55077 Merge doctrine/master 2012-01-06 22:06:59 +03:00
Marcel Raaijmakers
facd64ef2f enable set visibilty of class fields in EntityGenerator 2012-01-06 16:58:27 +01:00
Benjamin Eberlei
ce0873d589 Merge pull request #73 from AmirBehzad/TutorialFixes
Update en/tutorials/getting-started-xml-edition.rst
2012-01-05 13:40:57 -08:00
AmirBehzad Eslami
bc91e5c0fd Separated listings of User.php, Bug.php, and Product.php. Added missed statement to use ArrayCollection in User.php . 2012-01-06 01:03:15 +03:30
Benjamin Eberlei
6d1f716f8b Update en/tutorials/getting-started-xml-edition.rst 2012-01-05 21:40:15 +01:00
Benjamin Eberlei
442227fc89 Update en/reference/architecture.rst 2012-01-05 10:28:46 +01:00
Fabio B. Silva
781a661704 change naming position 2012-01-03 17:58:20 -02:00
Fabio B. Silva
d8227fcd06 give the FQCN to the naming strategy 2012-01-03 16:59:43 -02:00
Benjamin Eberlei
3fff83cd13 Merge 2.2 into master 2012-01-03 19:20:11 +01:00
Benjamin Eberlei
9a0d36ae86 Fix Version 2012-01-02 15:13:48 +01:00
Benjamin Eberlei
c6730de3d1 Merge remote-tracking branch 'origin/2.2' 2012-01-02 15:13:26 +01:00
Benjamin Eberlei
b558ffd694 Merge pull request #244 from kimhemsoe/fix_ddc224_test
Fixed DDC214 test.
2011-12-31 02:27:28 -08:00
Guilherme Blanco
ae1c171392 Merge pull request #70 from maastermedia/master
Typos fixed
2011-12-30 20:18:50 -08:00
Guilherme Blanco
9f3967d65d Merge pull request #245 from milokmet/DDC-1572
[DDC-1572] Allow LIKE pattern to be a function or path expression
2011-12-30 20:17:38 -08:00
Peter Kokot
65c64f52c8 typo in reference/tools 2011-12-31 04:37:25 +01:00
Peter Kokot
1c31603e17 type varchar replaced with type string 2011-12-31 04:33:46 +01:00
Guilherme Blanco
4ae7851a04 Merge pull request #247 from juzna/fix-phpdoc
fixed phpDoc and typos
2011-12-30 13:05:37 -08:00
Jan Dolecek
12c3a42d8c fixed phpDoc and typos 2011-12-30 20:06:20 +01:00
Guilherme Blanco
e43897916a Merge pull request #246 from FabioBatSilva/DDC-1557
[DDC 1557] Support for DQL function on subselect
2011-12-29 11:22:23 -08:00
Fabio B. Silva
ab4482b617 update docblock 2011-12-29 17:05:44 -02:00
Miloslav Kmet
ae4321b4e3 [DDC-1572] Allow LIKE pattern to be a function or path expression 2011-12-29 19:51:48 +01:00
Fabio B. Silva
bf8924df14 some tests 2011-12-29 14:47:23 -02:00
Fabio B. Silva
4cc61bf2ee fix DDC-1557 2011-12-29 14:30:29 -02:00
Kim Hemsø Rasmussen
82bea24426 Fixed DDC214 test. 2011-12-29 02:05:54 +01:00
Benjamin Eberlei
959a68694e Merge branch 'DDC-1360' 2011-12-28 20:28:45 +01:00
Benjamin Eberlei
9d398afa56 DDC-1360 - Bugfix in quoting mechanism inside ClassMetadataInfo 2011-12-28 20:28:17 +01:00
Benjamin Eberlei
e5cf1da4ee Merge pull request #235 from holtkamp/patch-1
Allow ExporterDrivers that implement the exportClassMetadata() function to return false
2011-12-27 23:54:09 -08:00
Benjamin Eberlei
3cbb3eab18 Merge pull request #242 from FabioBatSilva/patch-1
[UnderscoreNamingStrategy] fix docblock
2011-12-27 23:46:36 -08:00
Fabio B. Silva
ff4ed93707 fix typo 2011-12-27 09:53:09 -02:00
Guilherme Blanco
abb258c951 Merge pull request #241 from FabioBatSilva/DDC-559
[DDC 559, DDC 852] Naming Strategy
2011-12-24 08:45:38 -08:00
Fabio B. Silva
603f7a1664 fix indentation 2011-12-24 12:34:49 -02:00
Fabio B. Silva
e3acf43dbc move naming classes to Doctrine\ORM\Mapping 2011-12-24 12:01:25 -02:00
Fabio B. Silva
1eddb53d6c fix CS and use php constants 2011-12-24 11:45:51 -02:00
Guilherme Blanco
93df588d87 Merge pull request #240 from FabioBatSilva/testFunctionSubstring
fix QueryDqlFunctionTest#testFunctionSubstring order
2011-12-23 09:17:42 -08:00
Guilherme Blanco
9b1092726d Merge pull request #239 from adrienbrault/master
Fix $qb->expr() PHPDoc @return type.
2011-12-23 09:16:50 -08:00
Fabio B. Silva
223577d8b5 fix QueryDqlFunctionTest#testFunctionSubstring order 2011-12-23 14:57:43 -02:00
Fabio B. Silva
8bdb713073 add support for NamingStrategy 2011-12-23 14:41:03 -02:00
comfortablynumb
6d5f15e708 Merge remote branch 'upstream/master' 2011-12-23 13:30:36 -03:00
Fabio B. Silva
eac34b6d6a test ClassMetadata whit UnderscoreNamingStrategy 2011-12-23 14:13:21 -02:00
Adrien BRAULT
da0a6fc619 Fix some PHPDoc @return type. 2011-12-23 17:05:08 +01:00
Fabio B. Silva
83a9458653 apply naming strategy on ClassMetadata 2011-12-23 12:28:09 -02:00
Fabio B. Silva
8b1f60c9f8 add UnderscoreNamingStrategy 2011-12-23 12:16:36 -02:00
Fabio B. Silva
537821418e apply naming strategy on ClassMetadataInfo 2011-12-23 11:29:50 -02:00
Fabio B. Silva
8368f0e4b9 change default namming strategy 2011-12-23 11:03:28 -02:00
Benjamin Eberlei
894dfd1a6b Update en/reference/yaml-mapping.rst 2011-12-22 23:06:59 +01:00
Fabio B. Silva
a038e6cbad test case 2011-12-22 14:07:58 -02:00
Guilherme Blanco
ec58285b3f Merge pull request #236 from FabioBatSilva/DDC-1065
[DDC-1065] Error messages
2011-12-22 07:31:37 -08:00
Fabio B. Silva
909dbdf29d default NamingStrategy 2011-12-22 12:07:18 -02:00
Fabio B. Silva
c2cee0d6eb error messages 2011-12-22 11:05:11 -02:00
holtkamp
177adbdfc7 Allow ExporterDrivers that implement the exportClassMetadata() function to return FALSE when no content is available/needs to be written to a file by the AbstractExporter, preventing empty files to be generated foreach processed ClassMetadataInfo instance. 2011-12-22 09:38:55 -02:00
Benjamin Eberlei
06de4e62a5 Add 2.2 to travis status icon list 2011-12-22 00:08:53 +01:00
Guilherme Blanco
d23b3bb056 Merge pull request #69 from keymaster/patch-1
Clarify the performance warning.
2011-12-21 06:56:17 -08:00
keymaster
0b819ca3b0 Clarify the performance warning. 2011-12-21 12:24:37 +02:00
Guilherme Blanco
041a4e0b43 Merge pull request #66 from FabioBatSilva/patch-2
add doc for default repository class
2011-12-20 08:34:27 -08:00
Fabio B. Silva
ca87ddd540 add doc for default repository class 2011-12-20 09:15:37 -02:00
Vitali Yakavenka
4879c50c5d Merge remote-tracking branch 'doctrine/master' into SupportCustomIdGenerators 2011-12-19 16:47:47 -08:00
Guilherme Blanco
e29dfabb74 Merge pull request #65 from FabioBatSilva/patch-1
[Annotations] add doc for @MappedSuperclass#repositoryClass
2011-12-19 12:41:15 -08:00
Fabio B. Silva
43e4e1c389 add doc for MappedSuperclass repositoryClass 2011-12-19 18:35:01 -02:00
comfortablynumb
bf9024b622 Merge remote branch 'upstream/master' 2011-12-19 11:09:09 -03:00
Benjamin Eberlei
e42d70a2b0 Clarify how the CLI is setup 2011-12-17 23:56:10 +01:00
Benjamin Eberlei
48acbf75cd Reference new cookbook entry 2011-12-17 16:28:46 +01:00
Benjamin Eberlei
22ac3a3099 Add cookbook entry on saving entities in the session. 2011-12-17 16:28:31 +01:00
comfortablynumb
d7042ab828 Merge branch 'master', remote branch 'upstream/master' 2011-12-16 20:01:10 -03:00
Asmir Mustafic
289c186de5 orphanRemoval default is false 2011-12-16 16:16:52 +01:00
Guilherme Blanco
373090f223 Merge pull request #64 from ebernhardson/master
Replace non-existant constant T_ABS
2011-12-13 20:04:23 -08:00
ebernhardson
5ea8861bf3 replace non-existant constant Lexer::T_ABS 2011-12-13 10:36:14 -08:00
Guilherme Blanco
e85ce5c02f Merge pull request #63 from Ocramius/patch-2
Fixing minor issues reported by BostjanWrk on IRC about the RSM Builder ...
2011-12-13 06:31:30 -08:00
Marco Pivetta
220c6c4e0e Fixing minor issues reported by BostjanWrk on IRC about the RSM Builder example 2011-12-13 11:30:09 +01:00
Benjamin Eberlei
f057587457 Merge pull request #62 from jsor/cookbook_types_fix
Add missing canRequireSQLConversion() in example type code
2011-12-02 12:58:54 -08:00
Jan Sorgalla
69295ba076 Add missing canRequireSQLConversion() in example type code 2011-12-02 20:59:17 +01:00
Vitali Yakavenka
353ba4dfd1 Remove trailing whitespaces and fix brace locations 2011-11-30 00:20:00 +03:00
Vitali Yakavenka
f13f44a2fc Merge branch 'master' of git://github.com/doctrine/doctrine2 into SupportCustomIdGenerators 2011-11-29 23:42:01 +03:00
Benjamin Eberlei
76254d693d Merge pull request #61 from jsor/cookbook_types
Cookbook article: Advanced field value conversion using custom mapping types
2011-11-29 03:13:26 -08:00
jsor
cbefb7c543 Finalize first version 2011-11-29 10:31:07 +01:00
Vitali Yakavenka
c92b78bc06 Cleanup formatting just a little 2011-11-29 00:48:08 +03:00
Vitali Yakavenka
b72d150d33 Rename custom-generator to custom-id-generator in XML mappint to match name in other mapping types 2011-11-28 23:36:23 +03:00
Vitali Yakavenka
a8787be0bf Add missing files from last comming and newly required one after rebase 2011-11-28 23:31:06 +03:00
Vitali Yakavenka
9d1402e4a5 Fix PHPMappingDriver tests 2011-11-28 23:30:32 +03:00
Vitali Yakavenka
84086915e4 Add support for custom ID generator in Yaml driver 2011-11-28 23:30:32 +03:00
Vitali Yakavenka
0a4fbc9770 Remove test for custom ID generator from AnnotationDriverTest as it duplicates one in AbstractMappingDriverTest 2011-11-28 23:30:32 +03:00
Vitali Yakavenka
2b97f79bd3 Add support for custom ID generator in XML 2011-11-28 23:30:32 +03:00
Vitali Yakavenka
6bcfaed640 Remove explicit annotation registration after it was merged into OrmTestCase 2011-11-28 23:30:32 +03:00
Vitali Yakavenka
e2953c8cd4 Rename test accoring to what it tests 2011-11-28 23:29:42 +03:00
Vitali Yakavenka
48b6356e53 Add support for GenerateValue(strategy='CUSTOM') in AnnotationDriver 2011-11-28 23:29:42 +03:00
Vitali Yakavenka
955497e3d5 Remove unnecessary mock 2011-11-28 23:24:19 +03:00
Vitali
82daf651fb Pass specified arguments to generator's constructor 2011-11-28 23:24:19 +03:00
Vitali
cd0915deb5 Introcude ClassMetadataInfo::GENERATOR_TYPE_CUSTOM for custom generators to follow current implementation 2011-11-28 23:24:18 +03:00
Vitali
ffc722a334 Allow loading of custom ID generator class by FQN in @GeneratedValue(type=) 2011-11-28 23:24:18 +03:00
Vitali
3f942e05f3 Register annotations to make ClassMetadataFactoryTest pass alone 2011-11-28 23:22:08 +03:00
Jan Sorgalla
228d8517c7 Add type 2011-11-28 21:06:01 +01:00
jsor
bece5f0f91 Change ref name 2011-11-28 15:22:55 +01:00
jsor
1300758499 Rename article and add more text 2011-11-28 15:19:49 +01:00
jsor
129b9d0945 Setup article 2011-11-28 11:52:17 +01:00
Benjamin Eberlei
b9b05fc3eb Fix for DDC-1293 2011-11-18 23:10:40 +01:00
Asmir Mustafic
24432bd0ab tabs 2011-11-18 11:00:20 +01:00
Asmir Mustafic
82a1626e82 Better generation of exported xml (valid with xsd) 2011-11-18 10:57:27 +01:00
Guilherme Blanco
4c8ab82f9c Merge pull request #60 from Ocramius/patch-1
Fixing invalid XML mapping samples
2011-11-16 11:42:05 -08:00
Marco Pivetta
2200c1f7e1 Fixing invalid XML mapping samples 2011-11-16 20:00:21 +01:00
Guilherme Blanco
59849f73bd Merge pull request #59 from romainneutron/master
Fix some YAML syntax errors
2011-11-15 15:48:30 -08:00
Benjamin Eberlei
51211980a4 Remove ON in docs 2011-11-15 22:21:15 +01:00
Romain Neutron
c53e2772a0 Fix YAML syntax errors in examples 2011-11-15 22:10:56 +01:00
Guilherme Blanco
650a80a61a Merge pull request #57 from volftomas/master
Minor changes
2011-11-08 05:57:38 -08:00
Tomas Paladin Volf
cfe5424cf9 Fixed pear command for install, "boostrap" => "bootstrap" 2011-11-08 14:44:48 +01:00
Guilherme Blanco
59b4641d29 Merge pull request #54 from michal-pipa/fix-link
Changed external link to internal link.
2011-11-07 04:50:09 -08:00
Michał Pipa
64200c405e Fixed title underline. 2011-11-07 08:19:20 +01:00
Michał Pipa
0eed56fae9 Fixed indentation. 2011-11-07 08:18:22 +01:00
Michał Pipa
c0f86e796d Changed external link to internal link. 2011-11-07 07:53:05 +01:00
Guilherme Blanco
0f11b0c61d Merge pull request #53 from michal-pipa/doc
Fixed broken link.
2011-10-31 09:43:13 -07:00
Guilherme Blanco
981a2d4341 Merge pull request #52 from michal-pipa/c21aaebbc4159f27d6db1194d585ba8895057f6a
Changed 'Symfony 2' to 'Symfony2'.
2011-10-31 09:16:11 -07:00
Michał Pipa
299642083b Fixed broken link. 2011-10-31 17:10:30 +01:00
Michał Pipa
c21aaebbc4 Changed 'Symfony 2' to 'Symfony2'.
http://symfony.com/blog/talk-about-symfony2-not-symfony-2
2011-10-31 17:09:15 +01:00
Guilherme Blanco
0317f43987 Merge pull request #51 from asm89/patch-1
Fix typos in 'Working with objects' php examples
2011-10-26 07:48:36 -07:00
Alexander
78ef07f630 Update en/reference/working-with-objects.rst 2011-10-26 14:12:32 +03:00
Benjamin Eberlei
e98cb4f145 Document AbstractQuery#getOneOrNullResult() 2011-10-26 00:54:06 +03:00
Luis Cordova
cf44745d08 corrected rst for bash like code blocks 2011-10-25 15:50:29 -05:00
Benjamin Eberlei
196fd79d5f Merge pull request #27 from chriswoodford/persisting-the-decorator
Persisting the decorator
2011-10-25 13:47:24 -07:00
Benjamin Eberlei
8dc77a7083 Merge pull request #43 from marcw/patch-1
Fixed namespace in code-block
2011-10-25 13:45:58 -07:00
Benjamin Eberlei
a5688f60d3 Merge pull request #44 from mweimerskirch/patch-1
Documented the onClear event
2011-10-25 13:45:41 -07:00
Benjamin Eberlei
288ec8aa5c Merge pull request #45 from oyerli/patch-1
Fixed typo in the orderBy method.
2011-10-25 13:45:24 -07:00
Benjamin Eberlei
c7658d6285 Merge pull request #49 from cordoval/patch-2
typo change from contains to consists of
2011-10-25 13:45:08 -07:00
Luis Cordova
1bc0efba43 typo change from contains to consists of 2011-10-25 15:33:30 -05:00
Guilherme Blanco
de75ea88b6 Merge pull request #48 from cordoval/patch-1
two typos fixed
2011-10-25 13:11:20 -07:00
Luis Cordova
0a989e63d2 two typos fixed 2011-10-25 15:08:52 -05:00
Eric Clemmons
5b64dbe195 Added error suppression to mkdir in ProxyFactory
See: Symfony\Component\HttpKernel\Kernel#buildContainre
2011-10-25 11:51:09 -07:00
Eric Clemmons
48bf5022e4 ProxyFactory always checks if directory is writable first 2011-10-24 19:45:23 -07:00
Eric Clemmons
99c1383ef5 If proxy directory doesn't exist & cannot be created via mkdir, a ProxyException is thrown 2011-10-24 19:32:38 -07:00
Eric Clemmons
fde9d122cc ProxyFactory checks presence of directory with is_dir instead of file_exists 2011-10-20 13:33:20 -07:00
Eric Clemmons
92acd32410 ProxyFactory creates proxy's parent structure if it doesn't exist 2011-10-20 09:35:41 -07:00
Benjamin Eberlei
237c20c9b6 Enhanced docs on UnitOfWork#computeChangeSets 2011-10-15 18:09:27 +02:00
Benjamin Eberlei
6d4337fc71 More details on partial objects 2011-10-15 16:14:36 +02:00
Benjamin Eberlei
b88ef8b1a5 Add docs on SimplifiedXmlDriver and SimplifiedYamlDriver 2011-10-15 09:47:56 +02:00
Guilherme Blanco
9c389a49c7 Fixes DDC-509 2011-10-11 01:27:30 -03:00
Guilherme Blanco
da4948944d Merge pull request #47 from mdpatrick/interveawed_association_mapping
Corrected a typo (interveawed)
2011-10-04 10:33:48 -07:00
Dan Patrick
1a1d36c73f Corrected a typo (interveawed) 2011-10-04 12:19:10 -05:00
Chris Woodford
d3f6ffb09e Added cookbook/decorator-pattern to index file 2011-09-18 18:39:36 -04:00
Guilherme Blanco
f32a780459 Merge pull request #46 from havvg/master
fix example php code on sequence generator
2011-09-13 20:00:45 -07:00
Toni Uebernickel
3ec55d0cdd fix sequence generator php code on sequenceName 2011-09-13 20:32:04 +02:00
Ozan Yerli
a61c7e59d6 Fixed typo in the orderBy method. 2011-09-04 23:43:43 +03:00
Benjamin Eberlei
8084b6cbf0 Add docs on DDC-659 feature (ClassMetadataBuilder) 2011-09-04 14:25:03 +02:00
Michel Weimerskirch
79c113b532 Documented the onClear event. (using text from the docblock comment) 2011-09-02 22:38:47 +03:00
Benjamin Eberlei
e6e1243852 Merge branch 'master' of github.com:doctrine/orm-documentation 2011-08-27 12:36:56 +02:00
Benjamin Eberlei
5fc0ede5bf Fixed the tutorial, it was a mess! Now its explaining everything step by step and all bugs are removed. Changed introduction and configuration to use the simpler Setup helper class 2011-08-27 12:36:37 +02:00
Marc Weistroff
c90f3cf275 Fixed namespace in code-block 2011-08-26 02:07:56 +03:00
Joseph Rouff
ffa2a545fa Fix typo 2011-08-25 01:36:21 +03:00
Guilherme Blanco
35cb7b97db Merge pull request #42 from rouffj/patch-1
Fix typo
2011-08-24 09:32:11 -07:00
Guilherme Blanco
a5ac76b192 Added new support to DQL: ORDER BY now supports SingleValuedPathExpression and INSTANCE OF now supports multi-value checking. 2011-08-15 01:57:02 -03:00
Benjamin Eberlei
26c56dd0d2 Merge pull request #40 from hhamon/query_builder_fix
[QueryBuilder] added missing $
2011-08-14 09:24:21 -07:00
Hugo Hamon
31f34e95cc [QueryBuilder] added missing $ 2011-08-14 18:21:31 +02:00
Guilherme Blanco
189c729f15 Added support to CaseExpression. 2011-08-08 02:08:19 -03:00
Benjamin Eberlei
60ed7769cd Merge branch 'master' of github.com:doctrine/orm-documentation 2011-08-06 19:13:01 +02:00
Benjamin Eberlei
5ee8861350 Add note about comparing datetime and object by reference 2011-08-06 19:12:42 +02:00
Guilherme Blanco
01caa0d06e Merge pull request #39 from craue/patch-1
completed the sentence in section "postUpdate, postRemove, postPersist"
2011-08-04 16:16:20 -07:00
Christian Raue
1de9b906fd completed the sentence in section "postUpdate, postRemove, postPersist" 2011-08-05 02:10:40 +03:00
Guilherme Blanco
255cf347ec Merge pull request #38 from mdpatrick/grammar_on_getting_started_xml_edition
Small grammar changes in section explaining lazyload/ArrayCollection.
2011-08-01 20:33:08 -07:00
Dan Patrick
6cd7d21db1 Small grammar changes in section explaining lazyload/ArrayCollection. 2011-08-01 18:04:14 -05:00
Guilherme Blanco
67818ea2cc Merge pull request #37 from mdpatrick/associations_grammar_errors
Fixed minor grammatical errors in working-with-associations.rst
2011-07-30 15:40:12 -07:00
Dan Patrick
bfe5bea68d Fixed grammatical errors in working-with-associations.rst 2011-07-30 17:15:44 -05:00
Benjamin Eberlei
3a70ee6662 Merge pull request #25 from wilmoore/master
use 'string' instead of 'varchar'
2011-07-26 14:25:53 -07:00
Benjamin Eberlei
c0860a6018 Merge pull request #35 from mridgway/DDC-1270
[DDC-1270] Fixed invalid expr()->*() function calls; Added isNull and isN
2011-07-26 14:23:38 -07:00
Benjamin Eberlei
da60e86993 Merge pull request #34 from mridgway/DDC-725
[DDC-725] Removed onUpdate property
2011-07-26 14:22:59 -07:00
Benjamin Eberlei
ecb13a87dc Bugfix 2011-07-13 21:31:31 +02:00
Benjamin Eberlei
d8125768a3 Copy new build process for docs into orm docs from DBAL 2011-07-13 21:19:09 +02:00
Benjamin Eberlei
91b2c82c58 Brought most of the documentation up to date on 2.1 2011-07-13 20:31:01 +02:00
Benjamin Eberlei
660ead4b0e FAQ and Composite Key renaming 2011-07-13 19:04:21 +02:00
Benjamin Eberlei
c876f9edb2 Add warning to Association Mapping chapter that referencedColumnName have to primary key columns 2011-07-12 23:01:42 +02:00
Benjamin Eberlei
f4074dbe1d Removed solved limitations and added missing ones 2011-07-12 22:58:24 +02:00
Michael Ridgway
175faeb5f2 [DDC-1270] Fixed invalid expr()->*() function calls; Added isNull and isNotNull functions; Fixed casing on orX and andX 2011-07-11 13:25:15 -04:00
Benjamin Eberlei
82419813df Another inheritance question 2011-07-10 20:34:34 +02:00
Benjamin Eberlei
609e3b8c92 Write something about all FAQ entries that were empty 2011-07-10 20:31:16 +02:00
Benjamin Eberlei
fac1a517df Finish chapter on composite primary keys (still missing XML and YAML example though) 2011-07-10 20:03:59 +02:00
Benjamin Eberlei
653add64f9 Fix bug in mappings of Aggregate Column cookbook entry 2011-07-09 21:26:13 +02:00
Benjamin Eberlei
89b807177e Merge branch 'master' of github.com:doctrine/orm-documentation 2011-06-28 23:29:06 +02:00
Benjamin Eberlei
09d5169a8b Remove methods that not exist anymore from Expr object documentation 2011-06-28 23:28:55 +02:00
Michael Ridgway
8af162711e Removed onUpdate property 2011-06-28 16:34:12 -04:00
Benjamin Eberlei
503b6c1716 Merge pull request #33 from nicodmf/master
Little typo
2011-06-28 08:53:57 -07:00
Nicolas de Marqué Fromentin
ad012a63cb Little typo 2011-06-28 16:22:14 +02:00
Benjamin Eberlei
36e500682a Started FAQ 2011-06-20 21:20:23 +02:00
Benjamin Eberlei
de5952f597 Fix association mappings 2011-06-16 21:52:51 +02:00
Benjamin Eberlei
f6aa387e6f Fix missing chars in xml comment 2011-06-16 21:27:20 +02:00
Benjamin Eberlei
e750b27edb Fix another bug, yet another :) 2011-06-16 21:23:39 +02:00
Benjamin Eberlei
3417f3716e Fix another bug2 2011-06-16 21:20:56 +02:00
Benjamin Eberlei
5c5feab38e Fix another bug 2011-06-16 21:19:25 +02:00
Benjamin Eberlei
97c305452e Fix bug in docs 2011-06-16 21:18:17 +02:00
Benjamin Eberlei
41600667c2 More association mapping yml+xml code blocks 2011-06-12 23:43:29 +02:00
Benjamin Eberlei
c187862e4f Reorder paragraph and fix note. 2011-06-12 23:26:54 +02:00
Benjamin Eberlei
d8f9c5380a More xml+yml configuration blocks 2011-06-12 23:22:28 +02:00
Benjamin Eberlei
b5827ea83f Add tons of xml and yaml configuration blocks to basic- and association-mapping chapters 2011-06-12 23:07:21 +02:00
Benjamin Eberlei
6816816101 Fix bug in previous commit 2011-06-11 10:07:18 +02:00
Benjamin Eberlei
06e45f7587 Fix bug in previous commit 2011-06-11 09:59:17 +02:00
Benjamin Eberlei
71c47f69ec Mention 5.3 dependency in getting started tutorial, and link to entity restrictions aswell. Add the func_get_args() restriction to the list in architecture. 2011-06-11 09:52:17 +02:00
Benjamin Eberlei
6f909b6e69 Clarifications and additions in DQL and Working with objects chapter 2011-06-11 08:59:33 +02:00
Benjamin Eberlei
a5cfd2321f Document Mssql Datetim2 behavior 2011-06-05 17:21:11 +02:00
Guilherme Blanco
26c2690536 Merge pull request #31 from Infranology/typos
fixed constants typos in "Entity State"
2011-06-01 20:19:12 -07:00
Eriksen Costa
729ad9e5c9 fixed constants typos in "Entity State" 2011-06-02 00:14:46 -03:00
Guilherme Blanco
48cf91a3d0 Merge pull request #30 from renansaddam/patch-1
Version 2.0.5 no longer needs $cli call and the namespace for Components
2011-05-19 10:16:40 -07:00
Renan Gonçalves aka renan.saddam
457abbacef Version 2.0.5 no longer needs $cli call and the namespace for Components has changed. 2011-05-19 06:20:50 -07:00
Guilherme Blanco
7adbf5698a Merge pull request #29 from HoffmannP/ORMDOC
Ormdoc
2011-05-18 11:31:42 -07:00
Berengar W. Lehr
f58dcbaa8a 1. Replaced "fi"-ligature to actually "fi"-letters as pdflatex inputenc package does not support that unicode character
2. Replaced external link to internal document with internal link (now actuall link in documentation should work)
2011-05-18 20:08:49 +02:00
Berengar W. Lehr
6d457d9927 1. Changed external links syntax in internal link syntax to repair link (dql-… file)
2. Replaced unicode "fi"-ligatur with "fi" to enable pdflatex-ing b/c utf8-inputenc-package does - for unknown reasons - not support unicode "fi"-ligatur
2011-05-18 19:49:48 +02:00
Guilherme Blanco
e665d9f6df Merge pull request #28 from brikou/patch-1
fixed setQueryHint > setHint
2011-05-18 05:47:33 -07:00
Brikou CARRE
d436ea19df fixed setQueryHint > setHint 2011-05-18 02:51:22 -07:00
Chris Woodford
6cd778f940 wrote a quick introduction 2011-05-05 21:36:18 -04:00
Chris Woodford
e9d096e411 cleaning up some sentences. better flow 2011-05-05 21:23:10 -04:00
Chris Woodford
894b2614ed fixed some typos 2011-05-05 21:16:40 -04:00
Chris Woodford
c242ab4371 some tweaks to class descriptions 2011-05-03 23:04:41 -04:00
Chris Woodford
a51f182cc0 first draft of cookbook article 2011-05-03 22:48:40 -04:00
Guilherme Blanco
302199938f Merged pull request #24 from gimler/master.
tutorial
2011-04-29 20:47:31 -07:00
Guilherme Blanco
8d66809d0b Merged pull request #26 from asartalo/master.
Getting Started tutorial corrections
2011-04-29 20:25:40 -07:00
asartalo
16f132bff0 Corrected annotation for sample code: moved repositoryClass attribute from @Table to @Entity. 2011-04-24 13:24:54 +08:00
asartalo
3cac853dd4 Changed instances of entity manager variable '' to '' for consistency. 2011-04-24 13:21:34 +08:00
asartalo
511268ddd7 Removed another instance of '--force' Option for the orrm:schema-tool:create command as this is not available for this command. 2011-04-24 10:52:18 +08:00
asartalo
01bfc4f2f1 Removed '--force' Option for the orrm:schema-tool:create command as this is not available for this command. 2011-04-24 10:38:35 +08:00
Wil Moore III
3a80896173 Changed registerDoctrineTypeMapping('enum', 'varchar'); to registerDoctrineTypeMapping('enum', 'string'); as 'string' is the correct type to map to whereas varchar is only an alias. 2011-04-08 10:44:55 -07:00
Benjamin Eberlei
f76728818b Add note box on cascade operations being performed in memory and reference to foreign key /database-level onDelete option for deleting associtions 2011-04-06 23:36:50 +02:00
Benjamin Eberlei
a0b41feb72 Update section on mixed query and add notes on multiple entities in FROM clause. (update paragraph) 2011-04-03 20:13:34 +02:00
Benjamin Eberlei
2e777f99b9 Update section on mixed query and add notes on multiple entities in FROM clause. 2011-04-03 20:00:43 +02:00
Benjamin Eberlei
a259ac9bcf Merge branch 'master' of github.com:doctrine/orm-documentation 2011-03-31 21:49:51 +02:00
Benjamin Eberlei
04527a8bcb Add cookbook entry on MySQL Enums. 2011-03-31 21:49:32 +02:00
Gordon Franke
63c431f01d fix entity manager reference in repository code sample 2011-03-31 19:55:57 +08:00
Gordon Franke
7639f1e99b fix entity manager reference in repository code sample 2011-03-31 08:57:27 +02:00
Benjamin Eberlei
abc8f29800 [DDC-692] Add docs on 2.1 read only entities feature 2011-03-29 20:30:10 +02:00
Benjamin Eberlei
22ab3d1256 Fixed several issues and merged pull requests into docs. 2011-03-28 20:40:39 +02:00
Benjamin Eberlei
126e592758 Fix YAML docs on cascade 2011-03-27 22:23:37 +02:00
Benjamin Eberlei
cca642b094 Remove CASE, COALESCSE, NULLIF EBNF rules for the time being, they are not yet supported. 2011-03-20 12:05:28 +01:00
Benjamin Eberlei
c551192b6b DBAL-86 - Fix reference to nonexisting Configuration#setCustomTypes() 2011-02-27 09:03:59 +01:00
Benjamin Eberlei
d0ae95604f Add warnining about date types assuming default timezone. 2011-02-26 16:29:11 +01:00
Benjamin Eberlei
e94d15ec11 Fix DDC-1039 2011-02-26 11:53:43 +01:00
Benjamin Eberlei
0252368af2 Fix some Sphinx/ReST warnings 2011-02-26 11:51:43 +01:00
Benjamin Eberlei
e1c2084eeb Add section on EntityRepository into Getting Started Tutorial. 2011-02-26 11:51:30 +01:00
Benjamin Eberlei
aab2303c37 Fix Getting Started. 2011-02-26 11:12:58 +01:00
Jonathan H. Wage
c8c4c4ed46 Updating css. 2011-02-20 11:12:51 -06:00
Benjamin Eberlei
654dbb1b10 Fix <pre> tag styling having a very small line-height. 2011-02-20 11:34:59 +01:00
Benjamin Eberlei
9a289e2982 Adopt new Sphinx layout 2011-02-20 11:00:39 +01:00
Benjamin Eberlei
51fe83b7be Merge branch 'master' of github.com:doctrine/orm-documentation 2011-02-15 21:33:29 +01:00
Benjamin Eberlei
755f0b3dbb Add section about columnDefinition into basic mapping. 2011-02-15 21:33:24 +01:00
Benjamin Eberlei
35dae4e1f4 Add note about columnDefinition SchemaTool. 2011-02-15 21:31:20 +01:00
Jonathan H. Wage
1d24cb4828 Removing indices and tables as they are just broken links and don't do anything. 2011-02-13 16:24:52 -06:00
Benjamin Eberlei
24defe7100 Add notes to Tools about EntityGenerator, ConvertMapping and Reverse Engineering 2011-02-13 12:57:04 +01:00
Benjamin Eberlei
6309710ccc Fix some glitches in the docs: 2011-02-13 12:47:51 +01:00
Benjamin Eberlei
b794643735 Updated Limitations and Known Issues Chapter 2011-02-05 18:08:39 +01:00
Benjamin Eberlei
a592dc116d First part of a tutorial on composite primary keys and identity through foreign entities. 2011-02-05 18:01:10 +01:00
Benjamin Eberlei
eea5b71da5 Add tutorial on extra lazy associations 2011-02-05 16:14:51 +01:00
Benjamin Eberlei
93207c081e Add another paragraph with functionalities not described yet. 2011-02-05 15:26:58 +01:00
Benjamin Eberlei
94244683b0 Fix typo in new indexed assocations tutorial, thanks @gordonslondon 2011-02-05 15:23:39 +01:00
Benjamin Eberlei
609176a18f Merge branch 'master' of github.com:doctrine/orm-documentation 2011-02-05 13:48:41 +01:00
Benjamin Eberlei
c0cefa8749 Fixed TOCTree for tutorial on indexed associations. 2011-02-05 13:48:12 +01:00
Benjamin Eberlei
0f974c562c Add Working with Indexed Associations Tutorial 2011-02-05 13:43:45 +01:00
Ivar Nesje
af60471b62 fixed indentation on previous commit 2011-02-02 06:37:13 +08:00
Ivar Nesje
8fc7eb295b Fixed lifecycleCallbacks documentation bug when using YAML mapping 2011-02-02 06:37:03 +08:00
Ray Rehbein
2a38e5f408 Syntex and code correction in example 2011-02-02 05:48:49 +08:00
Ray Rehbein
be8d34dc21 Whitespace correction 2011-02-02 05:48:19 +08:00
Ray Rehbein
fc6cec9074 Added setParamater calls to examples
Whitespace changes to break up the long SQL lines into a readable format
2011-02-02 05:48:18 +08:00
Ray Rehbein
0411b1e75d Attempt at correction for a formatting glitch.
It appears Sphinx doesn't use the `` mark in the middle of a word correctly
2011-02-02 05:48:18 +08:00
Ray Rehbein
d81dca3e90 Corrected example calling wrong method name 2011-02-02 05:48:18 +08:00
Ray Rehbein
c89290e507 Corrected mismatch between example and comment entities. 2011-02-02 05:48:17 +08:00
Joel Clermont
754ebc052e DDC-823 - Fix minor grammar and punctuation mistakes 2011-02-02 05:46:25 +08:00
Benjamin Eberlei
7d42497e09 Fix typo with SQLLogger in configuration.rst 2011-01-31 22:56:09 +01:00
Benjamin Eberlei
7093e37b45 Merge branch 'master' of github.com:doctrine/orm-documentation 2011-01-31 22:47:13 +01:00
Benjamin Eberlei
51bdd6499a Fix typo in codeigniter coobkok entry 2011-01-31 22:46:41 +01:00
Benjamin Eberlei
0e5b30902c Enhanced QueryBuilder docs with paragraph on limit and executing queries. 2011-01-23 11:16:25 +01:00
Benjamin Eberlei
721915d61b Fix bug in configurationblock.css destroying simple bullet lists. 2011-01-02 11:53:12 +01:00
Benjamin Eberlei
f4e93e7550 Add section on orphan removal to Working with Associations chapter. 2011-01-02 11:18:22 +01:00
Benjamin Eberlei
4a231a34f2 Clarify MappedSuperclass and Unidirectional associations (with info on one-to-many and many-to-many associations). 2010-12-31 14:44:14 +01:00
Benjamin Eberlei
72081ff7ba Note that Native SQL Query is not to be used for DELETE, UPDATE and INSERT statements. 2010-12-30 22:13:57 +01:00
Benjamin Eberlei
ef8689c400 Incorporate DDC-879 into Cookbook. 2010-12-28 00:23:06 +01:00
Benjamin Eberlei
6bf2f22315 Add another note about how Query#setParameter() accepts named or positional parameters. 2010-12-20 22:19:02 +01:00
Benjamin Eberlei
34057c5e4b Add note about how Query#setParameter() accepts named or positional parameters. 2010-12-20 22:12:24 +01:00
Benjamin Eberlei
53ebc683c9 Update limitations and known issues section in manual. 2010-12-20 21:51:05 +01:00
Benjamin Eberlei
2eab525077 Fix some small problems in the docs. 2010-12-18 17:14:20 +01:00
Benjamin Eberlei
6a0f3f2d7b Add code-configuration directive, thank you Fabien! 2010-12-16 21:59:27 +01:00
Benjamin Eberlei
65fe9b86c5 Fix another code block 2010-12-14 23:35:17 +01:00
Benjamin Eberlei
76743431a4 Fix wrong code in Mini tutorial 2010-12-14 23:34:41 +01:00
Benjamin Eberlei
2e00e9d715 Fix another mess in Mini Tutorial. 2010-12-14 23:33:31 +01:00
Benjamin Eberlei
c8e7ff51c4 Merge branch 'master' of github.com:doctrine/orm-documentation 2010-12-14 23:32:57 +01:00
Benjamin Eberlei
6e7f47bf9e Fix mess in Mini-Tutorial of Introduction chapter. 2010-12-14 23:29:05 +01:00
ajessu
34dc2e6506 Delete duplicate item on menu 2010-12-15 00:41:09 +08:00
Benjamin Eberlei
29b47d3d44 Fix @Table not supporting schema as attribute anymore. 2010-12-12 13:18:18 +01:00
Benjamin Eberlei
0618944f8a DDC-901 - Fix documentation bug in Cookbook SQL Walker entry. 2010-12-12 13:12:44 +01:00
Albert Jessurum
d37120bb15 Fixed links 2010-12-12 18:04:13 +08:00
beberlei
5d58d9171e Merge ReST branch into master, ByeBye Markdown. 2010-12-11 12:31:31 +01:00
beberlei
9c6d3dbecd Add link to Doctrine homepage to docs layout template. 2010-12-11 11:29:37 +01:00
Benjamin Eberlei
eb0fd4d066 Add section about database and unit of work being out of sync and how this effects your code. 2010-12-11 01:01:44 +01:00
Benjamin Eberlei
01c2a09991 Add Working with DateTime chapter. 2010-12-03 22:47:33 +01:00
Benjamin Eberlei
46983465fd Finialized ReST doc changes, merged changes from latest Markdown docs. 2010-12-03 20:13:10 +01:00
Benjamin Eberlei
6789f2c8d1 Several changes and fixes to the docs. 2010-12-03 17:58:01 +01:00
Benjamin Eberlei
1b9e9c019d DDC-862 - Fix Codeigniter Cookbook entry 2010-11-16 22:03:27 +01:00
Benjamin Eberlei
49ecdff016 DDC-763 - Add note about handling merges of multiple entities which share subgraphs of objects 2010-11-10 23:49:07 +01:00
Benjamin Eberlei
f2b20e5949 DDC-736 - Add note about order of the identfication variables during fetch joins requirements. 2010-11-10 23:43:24 +01:00
goran
54a61bbbc2 Changed method name in an example for fetching class metadata 2010-11-11 03:24:14 +08:00
Timo A. Hummel
69d4e185d8 Added documentation notice regarding @version in combination with @id (DDC-873) 2010-11-11 03:23:52 +08:00
Timo A. Hummel
87c1c50bfa Fixed documentation issue for cascade="ALL" (DDC-850) 2010-11-11 03:23:11 +08:00
Benjamin Eberlei
de1d72f348 DDC-866 - Fix EBNF grammer rule 2010-11-09 22:19:07 +01:00
Benjamin Eberlei
ee042bc642 Some changes left 2010-11-09 22:18:25 +01:00
Benjamin Eberlei
c22bddc9a7 DDC-866 Fix deprecated EBNF rule 2010-11-09 22:17:31 +01:00
Benjamin Eberlei
a5a0dfa96e Converted ORM Docs into ReST 2010-11-01 22:03:50 +01:00
Benjamin Eberlei
e7e1f62f72 Add Sphinx Configs 2010-11-01 21:21:07 +01:00
Benjamin Eberlei
aa25b7cc0a Add Sphinx Configs 2010-11-01 21:21:01 +01:00
Benjamin Eberlei
1bfeaf3eaf Initial conversion from Markdown to ReST - Finalized Cookbook 2010-11-01 21:16:12 +01:00
Benjamin Eberlei
6985b671d8 Add note about float type 2010-10-31 15:13:51 +01:00
Benjamin Eberlei
468c878c92 Add hint about multiple directories in Metadata drivers to configuration section 2010-10-31 07:34:43 +01:00
Benjamin Eberlei
05f5ae1519 DDC-732 - Document sql schema requirements for inheritance strategies 2010-10-30 18:16:13 +02:00
Benjamin Eberlei
61640ef7ce Add Note that this is not a holy-grail but may need adjustments for other versions 2010-10-30 12:08:28 +02:00
Benjamin Eberlei
833a4a9319 Clarify not to use prefix blacklash in targetEntity 2010-10-29 14:12:29 +02:00
Benjamin Eberlei
3182f150c1 Fix a little render glitch 2010-10-29 13:30:02 +02:00
Jonathan H. Wage
62aef84205 Merge remote branch 'ralfas/master' 2010-10-18 17:15:38 -05:00
Benjamin Eberlei
9c63363ccc Add details on the negative performance impact of STI and CTI in many-to-one or one-to-one scenarios 2010-10-11 20:36:52 +02:00
Ralfas
e4b1357a22 fixed typos and grammar 2010-10-07 22:39:52 +01:00
Ralfas
f8ba66bb0c fixed typos 2010-10-05 22:43:56 +01:00
Ralfas
61c1f0e1ed fixed typos 2010-10-05 13:11:34 +01:00
Ralfas
8ac6d29c74 fixed typos 2010-10-05 13:09:10 +01:00
Ralfas
6b01986c48 fixed typos 2010-10-05 12:58:43 +01:00
Ralfas
efe2a18189 2010-10-04 11:29:40 -07:00
Benjamin Eberlei
e9617f1e50 DDC-798 - Clarify parameters for MEMBER OF expression 2010-09-30 22:09:49 +02:00
Benjamin Eberlei
4f18aaaf6e DDC-797 - Fix dql example bug 2010-09-30 22:05:39 +02:00
Benjamin Eberlei
d2efb5bbc8 Add NOT INSTANCE OF use-case to DQL manual 2010-09-27 22:59:50 +02:00
Benjamin Eberlei
e8eed2ebae Add legacy identifier quoting to the list of Known Issues 2010-09-23 22:48:39 +02:00
Benjamin Eberlei
7a8b69edbb Extend restriction and caution notes on identifier quoting 2010-09-23 22:40:12 +02:00
Benjamin Eberlei
bebc8cf871 Add section about deferred schema validation into association mapping chapter, add note about private/protected property in entities for lazy-laoding purposes, added subchapters on identity map internals and object graph traversal to the Working with Objects section 2010-09-21 21:55:35 +02:00
Christian Heinrich
453341c754 Updated strategy cookbook introduction
- Removed annoying tabs
- Removed some comments
- Hopefully, it will display now correctly
2010-09-20 10:53:29 -05:00
Michael Ridgway
13a99c30ea Fixed example in Establishing Associations 2010-09-09 12:39:02 -05:00
Christian Heinrich
e342b4536a Added a caution sign for case-sensitivity of mapping types.
This might help to prevent beginners from being confused when an error is raised due to
wrong spelling. (Like DateTime (wrong) <-> datetime (right))
2010-09-06 11:09:54 -05:00
Benjamin Eberlei
3d7eb3bac8 Enhanced Native SQL documentation 2010-09-04 09:19:05 +02:00
Christian Heinrich
d8dd44aa16 Added a naming convention for events 2010-09-03 10:50:56 -05:00
Benjamin Eberlei
d4489d1bdc Added large Note/Warning on SchemaTool usage and assumptions 2010-08-31 23:23:05 +02:00
Benjamin Eberlei
a6cdafe85c Merge branch 'master' of github.com:doctrine/orm-documentation 2010-08-31 23:10:45 +02:00
beberlei
088ccf58fc Updated XML Cookbook Getting Started and Tools Chapter 2010-08-29 10:50:07 +02:00
beberlei
d2d32e5439 Fix Cookbook XML Getting Started still refering to old Doctrine Console 2010-08-29 10:38:57 +02:00
Christian Heinrich
4232509427 Renamed a variable 2010-08-17 14:01:43 -05:00
Benjamin Eberlei
82874181b0 Add section on INSTANCE OF Dql Operator 2010-08-08 21:20:58 +02:00
Benjamin Eberlei
9fa64adbda Added another fact to Limitations section 2010-08-08 21:14:56 +02:00
Jonathan H. Wage
70d12fc57a [DDC-663] Making example for installing via pear more generic. 2010-08-08 12:21:03 -05:00
Your Name
732dee92ad I guess you meant "Now you can test" or "Now test the ..." 2010-08-02 08:41:31 -05:00
Your Name
fa5768b14d Fixed typos 2010-08-02 08:41:31 -05:00
Your Name
1fe35e518c Fixed typo 2010-08-02 08:41:31 -05:00
Benjamin Eberlei
d859a77b52 Fix a typo, reworked main paragraph and moved behavior section to bottom 2010-08-01 17:09:02 +02:00
Benjamin Eberlei
f89646eabe Added note about NestedSet to limitations section 2010-08-01 17:02:27 +02:00
Benjamin Eberlei
ec307a6046 Added small block on not supporting behaviors to limitations section 2010-08-01 16:56:36 +02:00
Benjamin Eberlei
437f14aa4e Fix bug in ticket link 2010-08-01 16:44:01 +02:00
Benjamin Eberlei
c5512b933e Add Limitations and Known Issues Appendix to the manual 2010-08-01 16:41:22 +02:00
Benjamin Eberlei
a6b5ee3cd3 Add Limitations and Known Issues Appendix to the manual 2010-08-01 16:37:53 +02:00
Benjamin Eberlei
93c061b7a5 Fixed some escaping issue with xml reference 2010-08-01 15:47:34 +02:00
Benjamin Eberlei
a34bab7f1e Merge branch 'master' of github.com:doctrine/orm-documentation 2010-08-01 15:44:13 +02:00
Benjamin Eberlei
96538ae2fe Seperated Change Tracking Policies and Partial Objects from Configuration Chapter, Finished XML Mapping Chapter with a reference on all tags and attributes 2010-08-01 15:41:40 +02:00
Roman S. Borschel
fcea78a6cb Updated merging docs. 2010-07-31 12:00:42 +02:00
Your Name
bf23503000 Missing field name? 2010-07-30 01:46:52 +08:00
Benjamin Eberlei
84c1cc8865 Fix bug in the documentation leading to an error 2010-07-24 15:16:13 +02:00
Benjamin Eberlei
c6e423024e Reference Configuration section for bootstrapping after each Install section 2010-07-24 14:23:35 +02:00
Benjamin Eberlei
9c28cc5b19 Rephrased some sentences in Working with Assocations 2010-07-24 10:53:35 +02:00
Benjamin Eberlei
23efc790c1 Split Working with Objects into two chapters, adding Working with Associations 2010-07-24 10:46:54 +02:00
Benjamin Eberlei
99533afd11 Added EntityManager interaction into examples 2010-07-23 23:51:25 +02:00
Benjamin Eberlei
f309190486 Clarified up and downsides of $collection->toArray() 2010-07-23 23:46:47 +02:00
Benjamin Eberlei
3b76ea9ffe Fix code box in Note 2010-07-23 23:43:44 +02:00
Benjamin Eberlei
e0c702d068 Fix little bug in Note box 2010-07-23 23:42:03 +02:00
Benjamin Eberlei
b5e5cb1c65 Removed examples of Nested Path Expressions from DQL docs 2010-07-23 23:39:36 +02:00
Benjamin Eberlei
31b8141fee Reworked Introduction a bit 2010-07-23 23:31:27 +02:00
Benjamin Eberlei
62c4f3e6fb Updated documentation on chosing inverse-owning side for many-to-many associations and came up with a significantly enhanced example for the working with associations chapter 2010-07-23 23:21:17 +02:00
Benjamin Eberlei
298773b2f8 Added section on collection field initialization and added constructors with initialization to all examples of toMany collections 2010-07-23 21:36:25 +02:00
Benjamin Eberlei
0a066533de Rephrased Obtaining Entity Manager and moved some sentences around 2010-07-22 23:38:09 +02:00
Benjamin Eberlei
f8c22abaa6 Use $applicationMode flag in obtaining entity manager example to make sure people understand that different settings for production and development are necessary 2010-07-22 23:30:17 +02:00
Benjamin Eberlei
974e31a307 Use $applicationMode flag in obtaining entity manager example to make sure people understand that different settings for production and development are necessary 2010-07-22 23:29:21 +02:00
Benjamin Eberlei
d5afa35cb8 Added dev vs production configuration section 2010-07-22 23:25:29 +02:00
Benjamin Eberlei
439cccbc0d Enhanced Bootstrap Section for more information on Autoloading in different setups (PEAR vs Git) 2010-07-22 22:55:00 +02:00
Benjamin Eberlei
b1f6fe2528 Updated Introduction to be more consistent with current Github development model 2010-07-18 22:57:20 +02:00
Benjamin Eberlei
a851e08109 Updated Introduction to be more consistent with current Github development model 2010-07-18 22:55:36 +02:00
Benjamin Eberlei
e7066d6f36 Updated Introduction to be more consistent with current Github development model 2010-07-18 22:45:17 +02:00
Benjamin Eberlei
29cb77b964 Merge branch 'master' of github.com:doctrine/orm-documentation 2010-07-18 21:13:07 +02:00
Benjamin Eberlei
4c813f60f9 Updated Aggregate Fields, Added generated SQL for all Association Mappings 2010-07-18 21:12:51 +02:00
beberlei
0c8e0450de Merge branch 'master' of github.com:doctrine/orm-documentation 2010-07-10 08:33:17 +02:00
beberlei
1017e2c6c7 Extended details on how to remove entities and their associations 2010-07-10 08:33:12 +02:00
Roman S. Borschel
0428774ec8 Added more information about flushing semantics. 2010-07-08 00:26:57 +02:00
Benjamin Eberlei
59aafe100b Added Aggregate Fields documentation 2010-07-07 22:34:51 +02:00
eXtreme
400be2a3e6 fixing codeblocks 2010-07-07 22:19:36 +08:00
Benjamin Eberlei
8d2da96480 Fixed error in Sandbox Tutorial 2010-07-04 18:57:51 +02:00
Benjamin Eberlei
80fd691880 Update docs on using own types, aswell as on using Collection::clear() 2010-07-03 16:57:02 +02:00
Lars Olesen
8e7385ccc2 Added the name space in front of Xmldriver, as it is not stated anywhere on this page which namespace is used. 2010-06-21 05:35:07 +08:00
Lars Olesen
16740b9695 Fixes typo. 2010-06-21 05:35:07 +08:00
Jonathan H. Wage
823db6071b Changing case. 2010-06-17 13:32:11 -04:00
Jonathan H. Wage
27233af0d2 Removing reference to Query object before it is introduced 2010-06-17 12:09:11 -04:00
Jonathan H. Wage
e71f00296e Fixing php code 2010-06-17 12:07:43 -04:00
Jonathan H. Wage
c7a5a695d3 [DDC-246] Added section showing DQL examples when dealing with SINGLE_TABLE and JOINED inheritance since it affects the generated SQL of a DQL query. 2010-06-17 12:03:01 -04:00
Jonathan H. Wage
cc2d84c992 Adding php syntax highlighting 2010-06-17 10:07:18 -04:00
Jonathan H. Wage
53ec0700bb Merge branch 'master' of github.com:doctrine/orm-documentation 2010-06-17 10:02:14 -04:00
Jonathan H. Wage
88e5babb56 [DDC-572] Updating documentation for inversedBy and mappedBy 2010-06-17 10:01:49 -04:00
beberlei
50e35e6bdc Merge branch 'master' of github.com:doctrine/orm-documentation 2010-06-10 23:27:28 +02:00
beberlei
d872d7f0b1 Updated Cookbook Getting Started XML Edition Tutorial with Array and Scalar Hydration examples, tweaked several passages a little bit 2010-06-10 21:38:22 +02:00
beberlei
51729cbaa7 Enhanced Description of how the different events work and what restrictions apply to them. 2010-06-10 21:06:23 +02:00
Thibault Duplessis
854a966a22 Fix Query::HYDRATE_SINGLE_SCALAR in single scalar result example 2010-06-07 16:54:22 -07:00
Jonathan H. Wage
9d2f7f0686 Updating documentation for custom hydrators. 2010-06-03 14:13:39 -04:00
Jonathan H. Wage
37124c4e0a Adding section for custom hydrators. 2010-06-02 23:41:41 -04:00
Jonathan H. Wage
30b9cfce3d [DDC-540] Doc improvement 2010-05-25 13:38:16 -04:00
Rich Bowen
e127274aa5 Fixes missing quote. 2010-05-24 15:34:58 -04:00
Roman S. Borschel
c34b5ad1a7 Added strategy cookbook entry to the index. 2010-05-22 13:52:20 +02:00
Jonathan H. Wage
10b676aa2b Merge commit '5c79ca25aabaf574d71d6bc622c13fd6045626d2' 2010-05-20 08:35:02 -04:00
Jonathan H. Wage
0698a8c455 Fixing php code 2010-05-18 11:51:49 -04:00
Jonathan H. Wage
1193c530c9 Merge branch 'master' of github.com:doctrine/orm-documentation 2010-05-18 11:50:18 -04:00
Jonathan H. Wage
18b9c6cd69 Updating documentation for converting mapping information and reverse engineering databases to entities. 2010-05-18 11:49:44 -04:00
Benjamin Eberlei
9231f54313 DDC-153 - Added cookbook entry contributed by merk (thanks!) 2010-05-16 09:50:07 +02:00
Benjamin Eberlei
72c2432586 DDC-590 - Added docs on Locking Support 2010-05-15 11:27:49 +02:00
Christian Heinrich
5c79ca25aa Updated formatting and fixed mistakes 2010-05-15 00:40:18 +02:00
Jonathan H. Wage
a59b62e3ba Merge remote branch 'mridgway/master' 2010-05-14 15:26:28 -04:00
Jonathan H. Wage
f99a096d01 Adding a little more information to the dql chapter. 2010-05-14 15:23:51 -04:00
Michael Ridgway
a3b42392b4 Fixed broken reference to DBAL section 2010-05-14 11:32:12 -07:00
Jonathan H. Wage
5a79963bd2 Removing dbal documentation from orm docs 2010-05-14 11:12:54 -04:00
Roman S. Borschel
184a402f39 Fixed typo 2010-05-13 13:14:37 +02:00
Roman S. Borschel
7d79777bfb Merge commit 'origin/master' 2010-05-13 13:06:20 +02:00
Roman S. Borschel
84c1d34028 Added documentation about control abstractions for transaction handling. 2010-05-13 13:06:16 +02:00
Christian Heinrich
21bbbb1f1f Updated query builder docs 2010-05-13 00:58:17 +02:00
Benjamin Eberlei
177a9ce4d2 Update Getting Started XML Edition to work with inversed-by attributes 2010-05-12 23:53:09 +02:00
Benjamin Eberlei
150bca0498 Merge branch 'master' of github.com:doctrine/orm-documentation 2010-05-12 23:52:38 +02:00
Jonathan H. Wage
0c60efc03b Merge remote branch 'shurakai/master' 2010-05-12 09:29:31 -04:00
Christian Heinrich
b857655992 Improved query builder section
-> Added a new section about binding params to the query
-> Added a short note on how to use $qb->expr()->in() with string values
2010-05-12 14:43:09 +02:00
Jonathan H. Wage
dd6eafbb6c Merge branch 'master' of github.com:doctrine/orm-documentation 2010-05-11 11:45:28 -04:00
Roman S. Borschel
0799a5b5e9 Polished docs on DBAL, Transactions and Concurrency. 2010-05-11 15:26:35 +02:00
Matthieu Bontemps
a1079e692c Fix a few typos in doctrine manual 2010-05-11 11:46:10 +02:00
Christian Heinrich
f9b77f9854 Added strategy cookbook preview 2010-05-10 18:26:32 +02:00
Roman S. Borschel
bc0f853b52 Clarified docs on identifier generation strategies. 2010-05-06 13:08:36 +02:00
Roman S. Borschel
a3feeef88c Clarified docs on identifier generation strategies. 2010-05-06 13:07:54 +02:00
Roman S. Borschel
c18e23b817 Clarified docs on identifier generation strategies. 2010-05-06 13:02:21 +02:00
Roman S. Borschel
4121c1ca72 Clarified docs on identifier generation strategies. 2010-05-06 12:45:46 +02:00
Roman S. Borschel
7ffdd80bb2 Clarified docs on working with objects. 2010-05-05 11:10:00 +02:00
Roman S. Borschel
51f9fb35c6 Merge commit 'origin/master' 2010-05-05 10:58:49 +02:00
Roman S. Borschel
e155e86517 Clarified docs on persisting new objects. 2010-05-05 10:58:11 +02:00
Benjamin Eberlei
d835372e93 Merge branch 'master' of github.com:doctrine/orm-documentation 2010-05-01 03:38:27 +02:00
Benjamin Eberlei
b4bc4b029d Fix DDC-560 2010-05-01 03:38:03 +02:00
Benjamin Eberlei
c0dc0112d3 Fix DDC-557 2010-05-01 03:36:40 +02:00
Jonathan H. Wage
e01510953e [DDC-443] Adding many-to-one unidirectional example 2010-04-30 16:11:35 -04:00
Roman S. Borschel
74ecfca43e Fixed section about partial objects. 2010-04-29 23:44:25 +02:00
Benjamin Eberlei
6d34b91425 DDC-539 - Fix typo 2010-04-26 21:54:10 +02:00
Jonathan H. Wage
605ee881c5 Misc. fixes and initial entry of PHP Mapping and Metadata Drivers chapters. 2010-04-26 11:55:43 -04:00
Jonathan H. Wage
fc290404e1 Changing note to caution 2010-04-23 12:16:31 -04:00
Benjamin Eberlei
d837a2110b Updated XML Getting Started Tutorial to comply with current Console API 2010-04-18 19:31:41 +02:00
Benjamin Eberlei
8426a3da11 DDC-510 - Updated docs to reflect that Annotations Metadata Driver is not a default anymore, but required to specifiy 2010-04-12 21:58:21 +02:00
Benjamin Eberlei
2a1f5e121b DDC-442 - Fix example for timestamp optimistic lock 2010-04-11 14:38:19 +02:00
Benjamin Eberlei
997ef97521 Updated SchemaTool usage docs with mapping paths information example 2010-04-10 12:04:23 +02:00
Benjamin Eberlei
8aed5c72df Updated ORM Tools Documentation 2010-04-10 11:50:40 +02:00
Guilherme Blanco
d1fbaae91f [2.0-DOC] Changed manual with new Console implementation 2010-04-09 01:09:14 -03:00
Jonathan H. Wage
ee34c42697 Adding dbal chapter back 2010-04-06 14:43:34 -04:00
Jonathan H. Wage
2adf9378e4 - 2010-04-06 14:37:15 -04:00
Jonathan H. Wage
1e7193134a - 2010-04-06 14:36:40 -04:00
Jonathan H. Wage
33ff1df4ec Adding cookbook 2010-04-06 14:30:12 -04:00
Jonathan H. Wage
69158cd4f3 first commit 2010-04-06 14:27:51 -04:00
1180 changed files with 110903 additions and 16138 deletions

4
.coveralls.yml Normal file
View File

@@ -0,0 +1,4 @@
# for php-coveralls
service_name: travis-ci
src_dir: lib
coverage_clover: build/logs/clover*.xml

12
.gitattributes vendored Normal file
View File

@@ -0,0 +1,12 @@
/tests export-ignore
/tools export-ignore
.gitattributes export-ignore
.gitignore export-ignore
.gitmodules export-ignore
.travis.yml export-ignore
build.properties export-ignore
build.properties.dev export-ignore
build.xml export-ignore
CONTRIBUTING.md export-ignore
phpunit.xml.dist export-ignore
run-all.sh export-ignore

3
.gitignore vendored
View File

@@ -9,3 +9,6 @@ lib/Doctrine/DBAL
/.settings/
.buildpath
.project
.idea
vendor/
composer.lock

19
.gitmodules vendored
View File

@@ -1,15 +1,6 @@
[submodule "lib/vendor/doctrine-common"]
path = lib/vendor/doctrine-common
url = git://github.com/doctrine/common.git
[submodule "lib/vendor/doctrine-dbal"]
path = lib/vendor/doctrine-dbal
url = git://github.com/doctrine/dbal.git
[submodule "lib/vendor/Symfony/Component/Console"]
path = lib/vendor/Symfony/Component/Console
url = git://github.com/symfony/Console.git
[submodule "lib/vendor/Symfony/Component/Yaml"]
path = lib/vendor/Symfony/Component/Yaml
url = git://github.com/symfony/Yaml.git
[submodule "docs/en/_theme"]
path = docs/en/_theme
url = git://github.com/doctrine/doctrine-sphinx-theme.git
[submodule "lib/vendor/doctrine-build-common"]
path = lib/vendor/doctrine-build-common
url = https://github.com/doctrine/doctrine-build-common.git
path = lib/vendor/doctrine-build-common
url = git://github.com/doctrine/doctrine-build-common.git

View File

@@ -1,19 +1,31 @@
language: php
php:
- 5.3
- 5.4
- 5.5
- 5.6
- 7.0
env:
- DB=mysql
- DB=pgsql
- DB=sqlite
before_script:
- sh -c "if [ '$DB' = 'pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS doctrine_tests;' -U postgres; fi"
- sh -c "if [ '$DB' = 'pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS doctrine_tests_tmp;' -U postgres; fi"
- sh -c "if [ '$DB' = 'pgsql' ]; then psql -c 'create database doctrine_tests;' -U postgres; fi"
- sh -c "if [ '$DB' = 'pgsql' ]; then psql -c 'create database doctrine_tests_tmp;' -U postgres; fi"
- sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'create database IF NOT EXISTS doctrine_tests_tmp;create database IF NOT EXISTS doctrine_tests;'; fi"
- git submodule update --init
- if [[ $TRAVIS_PHP_VERSION = '5.6' && $DB = 'sqlite' ]]; then PHPUNIT_FLAGS="--coverage-clover ./build/logs/clover.xml"; else PHPUNIT_FLAGS=""; fi
- if [[ $PHPUNIT_FLAGS == "" ]]; then phpenv config-rm xdebug.ini; fi
- composer self-update
- composer install --prefer-source --dev
script: phpunit --configuration tests/travis/$DB.travis.xml
script:
- ENABLE_SECOND_LEVEL_CACHE=0 ./vendor/bin/phpunit -v -c tests/travis/$DB.travis.xml $PHPUNIT_FLAGS
- ENABLE_SECOND_LEVEL_CACHE=1 ./vendor/bin/phpunit -v -c tests/travis/$DB.travis.xml --exclude-group performance,non-cacheable,locking_functional
matrix:
fast_finish: true
allow_failures:
- php: 7.0
cache:
directories:
- $HOME/.composer/cache

78
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,78 @@
# Contribute to Doctrine
Thank you for contributing to Doctrine!
Before we can merge your Pull-Request here are some guidelines that you need to follow.
These guidelines exist not to annoy you, but to keep the code base clean,
unified and future proof.
## We only accept PRs to "master"
Our branching strategy is "everything to master first", even
bugfixes and we then merge them into the stable branches. You should only
open pull requests against the master branch. Otherwise we cannot accept the PR.
There is one exception to the rule, when we merged a bug into some stable branches
we do occasionally accept pull requests that merge the same bug fix into earlier
branches.
## Coding Standard
We use PSR-1 and PSR-2:
* https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md
* https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
with some exceptions/differences:
* Keep the nesting of control structures per method as small as possible
* Align equals (=) signs
* Add spaces between assignment, control and return statements
* Prefer early exit over nesting conditions
* Add spaces around a negation if condition ``if ( ! $cond)``
## Unit-Tests
Please try to add a test for your pull-request.
* If you want to fix a bug or provide a reproduce case, create a test file in
``tests/Doctrine/Tests/ORM/Functional/Ticket`` with the name of the ticket,
``DDC1234Test.php`` for example.
* If you want to contribute new functionality add unit- or functional tests
depending on the scope of the feature.
You can run the unit-tests by calling ``phpunit`` from the root of the project.
It will run all the tests with an in memory SQLite database.
To run the testsuite against another database, copy the ``phpunit.xml.dist``
to for example ``mysql.phpunit.xml`` and edit the parameters. You can
take a look at the ``tests/travis`` folder for some examples. Then run:
phpunit -c mysql.phpunit.xml
Tips for creating unittests:
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/doctrine2/tree/master/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2306Test.php` for an
example.
## Travis
We automatically run your pull request through [Travis CI](http://www.travis-ci.org)
against SQLite, MySQL and PostgreSQL. If you break the tests, we cannot merge your code,
so please make sure that your code is working before opening up a Pull-Request.
## DoctrineBot, Tickets and Jira
DoctrineBot will synchronize your Pull-Request into our [Jira](http://www.doctrine-project.org).
Make sure to add any existing Jira ticket into the Pull-Request Title, for example:
"[DDC-123] My Pull Request"
## Getting merged
Please allow us time to review your pull requests. We will give our best to review
everything as fast as possible, but cannot always live up to our own expectations.
Thank you very much again for your contribution!

523
LICENSE
View File

@@ -1,504 +1,19 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
Copyright (c) 2006-2012 Doctrine Project
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,18 +1,30 @@
# Doctrine 2 ORM
| [Master][Master] | [2.4][2.4] | [2.3][2.3] | [2.2][2.2] | [2.1][2.1] |
|:----------------:|:----------:|:----------:|:----------:|:----------:|
| [![Build status][Master image]][Master] | [![Build status][2.4 image]][2.4] | [![Build status][2.3 image]][2.3] | [![Build status][2.2 image]][2.2] | [![Build status][2.1 image]][2.1] |
| [![Coverage Status][Master coverage image]][Master coverage] |
Master: [![Build Status](https://secure.travis-ci.org/doctrine/doctrine2.png?branch=master)](http://travis-ci.org/doctrine/doctrine2)
2.1.x: [![Build Status](https://secure.travis-ci.org/doctrine/doctrine2.png?branch=2.1.x)](http://travis-ci.org/doctrine/doctrine2)
Doctrine 2 is an object-relational mapper (ORM) for PHP 5.3.2+ that provides transparent persistence
Doctrine 2 is an object-relational mapper (ORM) for PHP 5.4+ 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 Hibernates HQL. This provides developers with a powerful alternative to SQL that maintains flexibility
inspired by Hibernate's HQL. This provides developers with a powerful alternative to SQL that maintains flexibility
without requiring unnecessary code duplication.
## More resources:
* [Website](http://www.doctrine-project.org)
* [Documentation](http://www.doctrine-project.org/projects/orm/2.0/docs/reference/introduction/en)
* [Documentation](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/index.html)
* [Issue Tracker](http://www.doctrine-project.org/jira/browse/DDC)
* [Downloads](http://github.com/doctrine/doctrine2/downloads)
[Master image]: https://travis-ci.org/doctrine/doctrine2.svg?branch=master
[Master]: https://travis-ci.org/doctrine/doctrine2
[Master coverage image]: https://coveralls.io/repos/doctrine/doctrine2/badge.png?branch=master
[Master coverage]: https://coveralls.io/r/doctrine/doctrine2?branch=master
[2.4 image]: https://travis-ci.org/doctrine/doctrine2.svg?branch=2.4
[2.4]: https://github.com/doctrine/doctrine2/tree/2.4
[2.3 image]: https://travis-ci.org/doctrine/doctrine2.svg?branch=2.3
[2.3]: https://github.com/doctrine/doctrine2/tree/2.3
[2.2 image]: https://travis-ci.org/doctrine/doctrine2.svg?branch=2.2
[2.2]: https://github.com/doctrine/doctrine2/tree/2.2
[2.1 image]: https://travis-ci.org/doctrine/doctrine2.svg?branch=2.1.x
[2.1]: https://github.com/doctrine/doctrine2/tree/2.1.x

18
SECURITY.md Normal file
View File

@@ -0,0 +1,18 @@
Security
========
The Doctrine library is operating very close to your database and as such needs
to handle and make assumptions about SQL injection vulnerabilities.
It is vital that you understand how Doctrine approaches security, because
we cannot protect you from SQL injection.
Please read the documentation chapter on Security in Doctrine DBAL and ORM to
understand the assumptions we make.
- [DBAL Security Page](https://github.com/doctrine/dbal/blob/master/docs/en/reference/security.rst)
- [ORM Security Page](https://github.com/doctrine/doctrine2/blob/master/docs/en/reference/security.rst)
If you find a Security bug in Doctrine, please report it on Jira and change the
Security Level to "Security Issues". It will be visible to Doctrine Core
developers and you only.

681
UPGRADE.md Normal file
View File

@@ -0,0 +1,681 @@
# Upgrade to 2.5
## Minor BC BREAK: query cache key time is now a float
As of 2.5.5, the `QueryCacheEntry#time` property will contain a float value
instead of an integer in order to have more precision and also to be consistent
with the `TimestampCacheEntry#time`.
## Minor BC BREAK: discriminator map must now include all non-transient classes
It is now required that you declare the root of an inheritance in the
discriminator map.
When declaring an inheritance map, it was previously possible to skip the root
of the inheritance in the discriminator map. This was actually a validation
mistake by Doctrine2 and led to problems when trying to persist instances of
that class.
If you don't plan to persist instances some classes in your inheritance, then
either:
- make those classes `abstract`
- map those classes as `MappedSuperclass`
## Minor BC BREAK: ``EntityManagerInterface`` instead of ``EntityManager`` in type-hints
As of 2.5, classes requiring the ``EntityManager`` in any method signature will now require
an ``EntityManagerInterface`` instead.
If you are extending any of the following classes, then you need to check following
signatures:
- ``Doctrine\ORM\Tools\DebugUnitOfWorkListener#dumpIdentityMap(EntityManagerInterface $em)``
- ``Doctrine\ORM\Mapping\ClassMetadataFactory#setEntityManager(EntityManagerInterface $em)``
## Minor BC BREAK: Custom Hydrators API change
As of 2.5, `AbstractHydrator` does not enforce the usage of cache as part of
API, and now provides you a clean API for column information through the method
`hydrateColumnInfo($column)`.
Cache variable being passed around by reference is no longer needed since
Hydrators are per query instantiated since Doctrine 2.4.
## Minor BC BREAK: Entity based ``EntityManager#clear()`` calls follow cascade detach
Whenever ``EntityManager#clear()`` method gets called with a given entity class
name, until 2.4, it was only detaching the specific requested entity.
As of 2.5, ``EntityManager`` will follow configured cascades, providing a better
memory management since associations will be garbage collected, optimizing
resources consumption on long running jobs.
## BC BREAK: NamingStrategy interface changes
1. A new method ``embeddedFieldToColumnName($propertyName, $embeddedColumnName)``
This method generates the column name for fields of embedded objects. If you implement your custom NamingStrategy, you
now also need to implement this new method.
2. A change to method ``joinColumnName()`` to include the $className
## Updates on entities scheduled for deletion are no longer processed
In Doctrine 2.4, if you modified properties of an entity scheduled for deletion, UnitOfWork would
produce an UPDATE statement to be executed right before the DELETE statement. The entity in question
was therefore present in ``UnitOfWork#entityUpdates``, which means that ``preUpdate`` and ``postUpdate``
listeners were (quite pointlessly) called. In ``preFlush`` listeners, it used to be possible to undo
the scheduled deletion for updated entities (by calling ``persist()`` if the entity was found in both
``entityUpdates`` and ``entityDeletions``). This does not work any longer, because the entire changeset
calculation logic is optimized away.
## Minor BC BREAK: Default lock mode changed from LockMode::NONE to null in method signatures
A misconception concerning default lock mode values in method signatures lead to unexpected behaviour
in SQL statements on SQL Server. With a default lock mode of ``LockMode::NONE`` throughout the
method signatures in ORM, the table lock hint ``WITH (NOLOCK)`` was appended to all locking related
queries by default. This could result in unpredictable results because an explicit ``WITH (NOLOCK)``
table hint tells SQL Server to run a specific query in transaction isolation level READ UNCOMMITTED
instead of the default READ COMMITTED transaction isolation level.
Therefore there now is a distinction between ``LockMode::NONE`` and ``null`` to be able to tell
Doctrine whether to add table lock hints to queries by intention or not. To achieve this, the following
method signatures have been changed to declare ``$lockMode = null`` instead of ``$lockMode = LockMode::NONE``:
- ``Doctrine\ORM\Cache\Persister\AbstractEntityPersister#getSelectSQL()``
- ``Doctrine\ORM\Cache\Persister\AbstractEntityPersister#load()``
- ``Doctrine\ORM\Cache\Persister\AbstractEntityPersister#refresh()``
- ``Doctrine\ORM\Decorator\EntityManagerDecorator#find()``
- ``Doctrine\ORM\EntityManager#find()``
- ``Doctrine\ORM\EntityRepository#find()``
- ``Doctrine\ORM\Persisters\BasicEntityPersister#getSelectSQL()``
- ``Doctrine\ORM\Persisters\BasicEntityPersister#load()``
- ``Doctrine\ORM\Persisters\BasicEntityPersister#refresh()``
- ``Doctrine\ORM\Persisters\EntityPersister#getSelectSQL()``
- ``Doctrine\ORM\Persisters\EntityPersister#load()``
- ``Doctrine\ORM\Persisters\EntityPersister#refresh()``
- ``Doctrine\ORM\Persisters\JoinedSubclassPersister#getSelectSQL()``
You should update signatures for these methods if you have subclassed one of the above classes.
Please also check the calling code of these methods in your application and update if necessary.
**Note:**
This in fact is really a minor BC BREAK and should not have any affect on database vendors
other than SQL Server because it is the only one that supports and therefore cares about
``LockMode::NONE``. It's really just a FIX for SQL Server environments using ORM.
## Minor BC BREAK: `__clone` method not called anymore when entities are instantiated via metadata API
As of PHP 5.6, instantiation of new entities is deferred to the
[`doctrine/instantiator`](https://github.com/doctrine/instantiator) library, which will avoid calling `__clone`
or any public API on instantiated objects.
## BC BREAK: `Doctrine\ORM\Repository\DefaultRepositoryFactory` is now `final`
Please implement the `Doctrine\ORM\Repository\RepositoryFactory` interface instead of extending
the `Doctrine\ORM\Repository\DefaultRepositoryFactory`.
## BC BREAK: New object expression DQL queries now respects user provided aliasing and not return consumed fields
When executing DQL queries with new object expressions, instead of returning DTOs numerically indexes, it will now respect user provided aliases. Consider the following query:
SELECT new UserDTO(u.id,u.name) as user,new AddressDTO(a.street,a.postalCode) as address, a.id as addressId FROM User u INNER JOIN u.addresses a WITH a.isPrimary = true
Previously, your result would be similar to this:
array(
0=>array(
0=>{UserDTO object},
1=>{AddressDTO object},
2=>{u.id scalar},
3=>{u.name scalar},
4=>{a.street scalar},
5=>{a.postalCode scalar},
'addressId'=>{a.id scalar},
),
...
)
From now on, the resultset will look like this:
array(
0=>array(
'user'=>{UserDTO object},
'address'=>{AddressDTO object},
'addressId'=>{a.id scalar}
),
...
)
## Minor BC BREAK: added second parameter $indexBy in EntityRepository#createQueryBuilder method signature
Added way to access the underlying QueryBuilder#from() method's 'indexBy' parameter when using EntityRepository#createQueryBuilder()
# Upgrade to 2.4
## BC BREAK: Compatibility Bugfix in PersistentCollection#matching()
In Doctrine 2.3 it was possible to use the new ``matching($criteria)``
functionality by adding constraints for assocations based on ID:
Criteria::expr()->eq('association', $assocation->getId());
This functionality does not work on InMemory collections however, because
in memory criteria compares object values based on reference.
As of 2.4 the above code will throw an exception. You need to change
offending code to pass the ``$assocation`` reference directly:
Criteria::expr()->eq('association', $assocation);
## Composer is now the default autoloader
The test suite now runs with composer autoloading. Support for PEAR, and tarball autoloading is deprecated.
Support for GIT submodules is removed.
## OnFlush and PostFlush event always called
Before 2.4 the postFlush and onFlush events were only called when there were
actually entities that changed. Now these events are called no matter if there
are entities in the UoW or changes are found.
## Parenthesis are now considered in arithmetic expression
Before 2.4 parenthesis are not considered in arithmetic primary expression.
That's conceptually wrong, since it might result in wrong values. For example:
The DQL:
SELECT 100 / ( 2 * 2 ) FROM MyEntity
Before 2.4 it generates the SQL:
SELECT 100 / 2 * 2 FROM my_entity
Now parenthesis are considered, the previous DQL will generate:
SELECT 100 / (2 * 2) FROM my_entity
# Upgrade to 2.3
## Auto Discriminator Map breaks userland implementations with Listener
The new feature to detect discriminator maps automatically when none
are provided breaks userland implementations doing this with a
listener in ``loadClassMetadata`` event.
## EntityManager#find() not calls EntityRepository#find() anymore
Previous to 2.3, calling ``EntityManager#find()`` would be delegated to
``EntityRepository#find()``. This has lead to some unexpected behavior in the
core of Doctrine when people have overwritten the find method in their
repositories. That is why this behavior has been reversed in 2.3, and
``EntityRepository#find()`` calls ``EntityManager#find()`` instead.
## EntityGenerator add*() method generation
When generating an add*() method for a collection the EntityGenerator will now not
use the Type-Hint to get the singular for the collection name, but use the field-name
and strip a trailing "s" character if there is one.
## Merge copies non persisted properties too
When merging an entity in UoW not only mapped properties are copied, but also others.
## Query, QueryBuilder and NativeQuery parameters *BC break*
From now on, parameters in queries is an ArrayCollection instead of a simple array.
This affects heavily the usage of setParameters(), because it will not append anymore
parameters to query, but will actually override the already defined ones.
Whenever you are retrieving a parameter (ie. $query->getParameter(1)), you will
receive an instance of Query\Parameter, which contains the methods "getName",
"getValue" and "getType". Parameters are also only converted to when necessary, and
not when they are set.
Also, related functions were affected:
* execute($parameters, $hydrationMode) the argument $parameters can be either an key=>value array or an ArrayCollection instance
* iterate($parameters, $hydrationMode) the argument $parameters can be either an key=>value array or an ArrayCollection instance
* setParameters($parameters) the argument $parameters can be either an key=>value array or an ArrayCollection instance
* getParameters() now returns ArrayCollection instead of array
* getParameter($key) now returns Parameter instance instead of parameter value
## Query TreeWalker method renamed
Internal changes were made to DQL and SQL generation. If you have implemented your own TreeWalker,
you probably need to update it. The method walkJoinVariableDeclaration is now named walkJoin.
## New methods in TreeWalker interface *BC break*
Two methods getQueryComponents() and setQueryComponent() were added to the TreeWalker interface and all its implementations
including TreeWalkerAdapter, TreeWalkerChain and SqlWalker. If you have your own implementation not inheriting from one of the
above you must implement these new methods.
## Metadata Drivers
Metadata drivers have been rewritten to reuse code from Doctrine\Common. Anyone who is using the
`Doctrine\ORM\Mapping\Driver\Driver` interface should instead refer to
`Doctrine\Common\Persistence\Mapping\Driver\MappingDriver`. Same applies to
`Doctrine\ORM\Mapping\Driver\AbstractFileDriver`: you should now refer to
`Doctrine\Common\Persistence\Mapping\Driver\FileDriver`.
Also, following mapping drivers have been deprecated, please use their replacements in Doctrine\Common as listed:
* `Doctrine\ORM\Mapping\Driver\DriverChain` => `Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain`
* `Doctrine\ORM\Mapping\Driver\PHPDriver` => `Doctrine\Common\Persistence\Mapping\Driver\PHPDriver`
* `Doctrine\ORM\Mapping\Driver\StaticPHPDriver` => `Doctrine\Common\Persistence\Mapping\Driver\StaticPHPDriver`
# Upgrade to 2.2
## ResultCache implementation rewritten
The result cache is completely rewritten and now works on the database result level, not inside the ORM AbstractQuery
anymore. This means that for result cached queries the hydration will now always be performed again, regardless of
the hydration mode. Affected areas are:
1. Fixes the problem that entities coming from the result cache were not registered in the UnitOfWork
leading to problems during EntityManager#flush. Calls to EntityManager#merge are not necessary anymore.
2. Affects the array hydrator which now includes the overhead of hydration compared to caching the final result.
The API is backwards compatible however most of the getter methods on the `AbstractQuery` object are now
deprecated in favor of calling AbstractQuery#getQueryCacheProfile(). This method returns a `Doctrine\DBAL\Cache\QueryCacheProfile`
instance with access to result cache driver, lifetime and cache key.
## EntityManager#getPartialReference() creates read-only entity
Entities returned from EntityManager#getPartialReference() are now marked as read-only if they
haven't been in the identity map before. This means objects of this kind never lead to changes
in the UnitOfWork.
## Fields omitted in a partial DQL query or a native query are never updated
Fields of an entity that are not returned from a partial DQL Query or native SQL query
will never be updated through an UPDATE statement.
## Removed support for onUpdate in @JoinColumn
The onUpdate foreign key handling makes absolutely no sense in an ORM. Additionally Oracle doesn't even support it. Support for it is removed.
## Changes in Annotation Handling
There have been some changes to the annotation handling in Common 2.2 again, that affect how people with old configurations
from 2.0 have to configure the annotation driver if they don't use `Configuration::newDefaultAnnotationDriver()`:
// Register the ORM Annotations in the AnnotationRegistry
AnnotationRegistry::registerFile('path/to/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php');
$reader = new \Doctrine\Common\Annotations\SimpleAnnotationReader();
$reader->addNamespace('Doctrine\ORM\Mapping');
$reader = new \Doctrine\Common\Annotations\CachedReader($reader, new ArrayCache());
$driver = new AnnotationDriver($reader, (array)$paths);
$config->setMetadataDriverImpl($driver);
## Scalar mappings can now be omitted from DQL result
You are now allowed to mark scalar SELECT expressions as HIDDEN an they are not hydrated anymore.
Example:
SELECT u, SUM(a.id) AS HIDDEN numArticles FROM User u LEFT JOIN u.Articles a ORDER BY numArticles DESC HAVING numArticles > 10
Your result will be a collection of Users, and not an array with key 0 as User object instance and "numArticles" as the number of articles per user
## Map entities as scalars in DQL result
When hydrating to array or even a mixed result in object hydrator, previously you had the 0 index holding you entity instance.
You are now allowed to alias this, providing more flexibility for you code.
Example:
SELECT u AS user FROM User u
Will now return a collection of arrays with index "user" pointing to the User object instance.
## Performance optimizations
Thousands of lines were completely reviewed and optimized for best performance.
Removed redundancy and improved code readability made now internal Doctrine code easier to understand.
Also, Doctrine 2.2 now is around 10-15% faster than 2.1.
## EntityManager#find(null)
Previously EntityManager#find(null) returned null. It now throws an exception.
# Upgrade to 2.1
## Interface for EntityRepository
The EntityRepository now has an interface Doctrine\Common\Persistence\ObjectRepository. This means that your classes that override EntityRepository and extend find(), findOneBy() or findBy() must be adjusted to follow this interface.
## AnnotationReader changes
The annotation reader was heavily refactored between 2.0 and 2.1-RC1. In theory the operation of the new reader should be backwards compatible, but it has to be setup differently to work that way:
// new call to the AnnotationRegistry
\Doctrine\Common\Annotations\AnnotationRegistry::registerFile('/doctrine-src/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php');
$reader = new \Doctrine\Common\Annotations\AnnotationReader();
$reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\');
// new code necessary starting here
$reader->setIgnoreNotImportedAnnotations(true);
$reader->setEnableParsePhpImports(false);
$reader = new \Doctrine\Common\Annotations\CachedReader(
new \Doctrine\Common\Annotations\IndexedReader($reader), new ArrayCache()
);
This is already done inside the ``$config->newDefaultAnnotationDriver``, so everything should automatically work if you are using this method. You can verify if everything still works by executing a console command such as schema-validate that loads all metadata into memory.
# Update from 2.0-BETA3 to 2.0-BETA4
## XML Driver <change-tracking-policy /> element demoted to attribute
We changed how the XML Driver allows to define the change-tracking-policy. The working case is now:
<entity change-tracking-policy="DEFERRED_IMPLICT" />
# Update from 2.0-BETA2 to 2.0-BETA3
## Serialization of Uninitialized Proxies
As of Beta3 you can now serialize uninitialized proxies, an exception will only be thrown when
trying to access methods on the unserialized proxy as long as it has not been re-attached to the
EntityManager using `EntityManager#merge()`. See this example:
$proxy = $em->getReference('User', 1);
$serializedProxy = serialize($proxy);
$detachedProxy = unserialized($serializedProxy);
echo $em->contains($detachedProxy); // FALSE
try {
$detachedProxy->getId(); // uninitialized detached proxy
} catch(Exception $e) {
}
$attachedProxy = $em->merge($detachedProxy);
echo $attackedProxy->getId(); // works!
## Changed SQL implementation of Postgres and Oracle DateTime types
The DBAL Type "datetime" included the Timezone Offset in both Postgres and Oracle. As of this version they are now
generated without Timezone (TIMESTAMP WITHOUT TIME ZONE instead of TIMESTAMP WITH TIME ZONE).
See [this comment to Ticket DBAL-22](http://www.doctrine-project.org/jira/browse/DBAL-22?focusedCommentId=13396&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#action_13396)
for more details as well as migration issues for PostgreSQL and Oracle.
Both Postgres and Oracle will throw Exceptions during hydration of Objects with "DateTime" fields unless migration steps are taken!
## Removed multi-dot/deep-path expressions in DQL
The support for implicit joins in DQL through the multi-dot/Deep Path Expressions
was dropped. For example:
SELECT u FROM User u WHERE u.group.name = ?1
See the "u.group.id" here is using multi dots (deep expression) to walk
through the graph of objects and properties. Internally the DQL parser
would rewrite these queries to:
SELECT u FROM User u JOIN u.group g WHERE g.name = ?1
This explicit notation will be the only supported notation as of now. The internal
handling of multi-dots in the DQL Parser was very complex, error prone in edge cases
and required special treatment for several features we added. Additionally
it had edge cases that could not be solved without making the DQL Parser
even much more complex. For this reason we will drop the support for the
deep path expressions to increase maintainability and overall performance
of the DQL parsing process. This will benefit any DQL query being parsed,
even those not using deep path expressions.
Note that the generated SQL of both notations is exactly the same! You
don't loose anything through this.
## Default Allocation Size for Sequences
The default allocation size for sequences has been changed from 10 to 1. This step was made
to not cause confusion with users and also because it is partly some kind of premature optimization.
# Update from 2.0-BETA1 to 2.0-BETA2
There are no backwards incompatible changes in this release.
# Upgrade from 2.0-ALPHA4 to 2.0-BETA1
## EntityRepository deprecates access to protected variables
Instead of accessing protected variables for the EntityManager in
a custom EntityRepository it is now required to use the getter methods
for all the three instance variables:
* `$this->_em` now accessible through `$this->getEntityManager()`
* `$this->_class` now accessible through `$this->getClassMetadata()`
* `$this->_entityName` now accessible through `$this->getEntityName()`
Important: For Beta 2 the protected visibility of these three properties will be
changed to private!
## Console migrated to Symfony Console
The Doctrine CLI has been replaced by Symfony Console Configuration
Instead of having to specify:
[php]
$cliConfig = new CliConfiguration();
$cliConfig->setAttribute('em', $entityManager);
You now have to configure the script like:
[php]
$helperSet = new \Symfony\Components\Console\Helper\HelperSet(array(
'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
));
## Console: No need for Mapping Paths anymore
In previous versions you had to specify the --from and --from-path options
to show where your mapping paths are from the console. However this information
is already known from the Mapping Driver configuration, so the requirement
for this options were dropped.
Instead for each console command all the entities are loaded and to
restrict the operation to one or more sub-groups you can use the --filter flag.
## AnnotationDriver is not a default mapping driver anymore
In conjunction with the recent changes to Console we realized that the
annotations driver being a default metadata driver lead to lots of glue
code in the console components to detect where entities lie and how to load
them for batch updates like SchemaTool and other commands. However the
annotations driver being a default driver does not really help that much
anyways.
Therefore we decided to break backwards compatibility in this issue and drop
the support for Annotations as Default Driver and require our users to
specify the driver explicitly (which allows us to ask for the path to all
entities).
If you are using the annotations metadata driver as default driver, you
have to add the following lines to your bootstrap code:
$driverImpl = $config->newDefaultAnnotationDriver(array(__DIR__."/Entities"));
$config->setMetadataDriverImpl($driverImpl);
You have to specify the path to your entities as either string of a single
path or array of multiple paths
to your entities. This information will be used by all console commands to
access all entities.
Xml and Yaml Drivers work as before!
## New inversedBy attribute
It is now *mandatory* that the owning side of a bidirectional association specifies the
'inversedBy' attribute that points to the name of the field on the inverse side that completes
the association. Example:
[php]
// BEFORE (ALPHA4 AND EARLIER)
class User
{
//...
/** @OneToOne(targetEntity="Address", mappedBy="user") */
private $address;
//...
}
class Address
{
//...
/** @OneToOne(targetEntity="User") */
private $user;
//...
}
// SINCE BETA1
// User class DOES NOT CHANGE
class Address
{
//...
/** @OneToOne(targetEntity="User", inversedBy="address") */
private $user;
//...
}
Thus, the inversedBy attribute is the counterpart to the mappedBy attribute. This change
was necessary to enable some simplifications and further performance improvements. We
apologize for the inconvenience.
## Default Property for Field Mappings
The "default" option for database column defaults has been removed. If desired, database column defaults can
be implemented by using the columnDefinition attribute of the @Column annotation (or the appropriate XML and YAML equivalents).
Prefer PHP default values, if possible.
## Selecting Partial Objects
Querying for partial objects now has a new syntax. The old syntax to query for partial objects
now has a different meaning. This is best illustrated by an example. If you previously
had a DQL query like this:
[sql]
SELECT u.id, u.name FROM User u
Since BETA1, simple state field path expressions in the select clause are used to select
object fields as plain scalar values (something that was not possible before).
To achieve the same result as previously (that is, a partial object with only id and name populated)
you need to use the following, explicit syntax:
[sql]
SELECT PARTIAL u.{id,name} FROM User u
## XML Mapping Driver
The 'inheritance-type' attribute changed to take last bit of ClassMetadata constant names, i.e.
NONE, SINGLE_TABLE, INHERITANCE_TYPE_JOINED
## YAML Mapping Driver
The way to specify lifecycle callbacks in YAML Mapping driver was changed to allow for multiple callbacks
per event. The Old syntax ways:
[yaml]
lifecycleCallbacks:
doStuffOnPrePersist: prePersist
doStuffOnPostPersist: postPersist
The new syntax is:
[yaml]
lifecycleCallbacks:
prePersist: [ doStuffOnPrePersist, doOtherStuffOnPrePersistToo ]
postPersist: [ doStuffOnPostPersist ]
## PreUpdate Event Listeners
Event Listeners listening to the 'preUpdate' event can only affect the primitive values of entity changesets
by using the API on the `PreUpdateEventArgs` instance passed to the preUpdate listener method. Any changes
to the state of the entitys properties won't affect the database UPDATE statement anymore. This gives drastic
performance benefits for the preUpdate event.
## Collection API
The Collection interface in the Common package has been updated with some missing methods
that were present only on the default implementation, ArrayCollection. Custom collection
implementations need to be updated to adhere to the updated interface.
# Upgrade from 2.0-ALPHA3 to 2.0-ALPHA4
## CLI Controller changes
CLI main object changed its name and namespace. Renamed from Doctrine\ORM\Tools\Cli to Doctrine\Common\Cli\CliController.
Doctrine\Common\Cli\CliController now only deals with namespaces. Ready to go, Core, Dbal and Orm are available and you can subscribe new tasks by retrieving the namespace and including new task. Example:
[php]
$cli->getNamespace('Core')->addTask('my-example', '\MyProject\Tools\Cli\Tasks\MyExampleTask');
## CLI Tasks documentation
Tasks have implemented a new way to build documentation. Although it is still possible to define the help manually by extending the basicHelp and extendedHelp, they are now optional.
With new required method AbstractTask::buildDocumentation, its implementation defines the TaskDocumentation instance (accessible through AbstractTask::getDocumentation()), basicHelp and extendedHelp are now not necessary to be implemented.
## Changes in Method Signatures
* A bunch of Methods on both Doctrine\DBAL\Platforms\AbstractPlatform and Doctrine\DBAL\Schema\AbstractSchemaManager
have changed quite significantly by adopting the new Schema instance objects.
## Renamed Methods
* Doctrine\ORM\AbstractQuery::setExpireResultCache() -> expireResultCache()
* Doctrine\ORM\Query::setExpireQueryCache() -> expireQueryCache()
## SchemaTool Changes
* "doctrine schema-tool --drop" now always drops the complete database instead of
only those tables defined by the current database model. The previous method had
problems when foreign keys of orphaned tables pointed to tables that were scheduled
for deletion.
* Use "doctrine schema-tool --update" to get a save incremental update for your
database schema without deleting any unused tables, sequences or foreign keys.
* Use "doctrine schema-tool --complete-update" to do a full incremental update of
your schema.
# Upgrade from 2.0-ALPHA2 to 2.0-ALPHA3
This section details the changes made to Doctrine 2.0-ALPHA3 to make it easier for you
to upgrade your projects to use this version.
## CLI Changes
The $args variable used in the cli-config.php for configuring the Doctrine CLI has been renamed to $globalArguments.
## Proxy class changes
You are now required to make supply some minimalist configuration with regards to proxy objects. That involves 2 new configuration options. First, the directory where generated proxy classes should be placed needs to be specified. Secondly, you need to configure the namespace used for proxy classes. The following snippet shows an example:
[php]
// step 1: configure directory for proxy classes
// $config instanceof Doctrine\ORM\Configuration
$config->setProxyDir('/path/to/myproject/lib/MyProject/Generated/Proxies');
$config->setProxyNamespace('MyProject\Generated\Proxies');
Note that proxy classes behave exactly like any other classes when it comes to class loading. Therefore you need to make sure the proxy classes can be loaded by some class loader. If you place the generated proxy classes in a namespace and directory under your projects class files, like in the example above, it would be sufficient to register the MyProject namespace on a class loader. Since the proxy classes are contained in that namespace and adhere to the standards for class loading, no additional work is required.
Generating the proxy classes into a namespace within your class library is the recommended setup.
Entities with initialized proxy objects can now be serialized and unserialized properly from within the same application.
For more details refer to the Configuration section of the manual.
## Removed allowPartialObjects configuration option
The allowPartialObjects configuration option together with the `Configuration#getAllowPartialObjects` and `Configuration#setAllowPartialObjects` methods have been removed.
The new behavior is as if the option were set to FALSE all the time, basically disallowing partial objects globally. However, you can still use the `Query::HINT_FORCE_PARTIAL_LOAD` query hint to force a query to return partial objects for optimization purposes.
## Renamed Methods
* Doctrine\ORM\Configuration#getCacheDir() to getProxyDir()
* Doctrine\ORM\Configuration#setCacheDir($dir) to setProxyDir($dir)

View File

@@ -1,240 +0,0 @@
# Update from 2.0-BETA3 to 2.0-BETA4
## XML Driver <change-tracking-policy /> element demoted to attribute
We changed how the XML Driver allows to define the change-tracking-policy. The working case is now:
<entity change-tracking-policy="DEFERRED_IMPLICT" />
# Update from 2.0-BETA2 to 2.0-BETA3
## Serialization of Uninitialized Proxies
As of Beta3 you can now serialize uninitialized proxies, an exception will only be thrown when
trying to access methods on the unserialized proxy as long as it has not been re-attached to the
EntityManager using `EntityManager#merge()`. See this example:
$proxy = $em->getReference('User', 1);
$serializedProxy = serialize($proxy);
$detachedProxy = unserialized($serializedProxy);
echo $em->contains($detachedProxy); // FALSE
try {
$detachedProxy->getId(); // uninitialized detached proxy
} catch(Exception $e) {
}
$attachedProxy = $em->merge($detachedProxy);
echo $attackedProxy->getId(); // works!
## Changed SQL implementation of Postgres and Oracle DateTime types
The DBAL Type "datetime" included the Timezone Offset in both Postgres and Oracle. As of this version they are now
generated without Timezone (TIMESTAMP WITHOUT TIME ZONE instead of TIMESTAMP WITH TIME ZONE).
See [this comment to Ticket DBAL-22](http://www.doctrine-project.org/jira/browse/DBAL-22?focusedCommentId=13396&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#action_13396)
for more details as well as migration issues for PostgreSQL and Oracle.
Both Postgres and Oracle will throw Exceptions during hydration of Objects with "DateTime" fields unless migration steps are taken!
## Removed multi-dot/deep-path expressions in DQL
The support for implicit joins in DQL through the multi-dot/Deep Path Expressions
was dropped. For example:
SELECT u FROM User u WHERE u.group.name = ?1
See the "u.group.id" here is using multi dots (deep expression) to walk
through the graph of objects and properties. Internally the DQL parser
would rewrite these queries to:
SELECT u FROM User u JOIN u.group g WHERE g.name = ?1
This explicit notation will be the only supported notation as of now. The internal
handling of multi-dots in the DQL Parser was very complex, error prone in edge cases
and required special treatment for several features we added. Additionally
it had edge cases that could not be solved without making the DQL Parser
even much more complex. For this reason we will drop the support for the
deep path expressions to increase maintainability and overall performance
of the DQL parsing process. This will benefit any DQL query being parsed,
even those not using deep path expressions.
Note that the generated SQL of both notations is exactly the same! You
don't loose anything through this.
## Default Allocation Size for Sequences
The default allocation size for sequences has been changed from 10 to 1. This step was made
to not cause confusion with users and also because it is partly some kind of premature optimization.
# Update from 2.0-BETA1 to 2.0-BETA2
There are no backwards incompatible changes in this release.
# Upgrade from 2.0-ALPHA4 to 2.0-BETA1
## EntityRepository deprecates access to protected variables
Instead of accessing protected variables for the EntityManager in
a custom EntityRepository it is now required to use the getter methods
for all the three instance variables:
* `$this->_em` now accessible through `$this->getEntityManager()`
* `$this->_class` now accessible through `$this->getClassMetadata()`
* `$this->_entityName` now accessible through `$this->getEntityName()`
Important: For Beta 2 the protected visibility of these three properties will be
changed to private!
## Console migrated to Symfony Console
The Doctrine CLI has been replaced by Symfony Console Configuration
Instead of having to specify:
[php]
$cliConfig = new CliConfiguration();
$cliConfig->setAttribute('em', $entityManager);
You now have to configure the script like:
[php]
$helperSet = new \Symfony\Components\Console\Helper\HelperSet(array(
'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
));
## Console: No need for Mapping Paths anymore
In previous versions you had to specify the --from and --from-path options
to show where your mapping paths are from the console. However this information
is already known from the Mapping Driver configuration, so the requirement
for this options were dropped.
Instead for each console command all the entities are loaded and to
restrict the operation to one or more sub-groups you can use the --filter flag.
## AnnotationDriver is not a default mapping driver anymore
In conjunction with the recent changes to Console we realized that the
annotations driver being a default metadata driver lead to lots of glue
code in the console components to detect where entities lie and how to load
them for batch updates like SchemaTool and other commands. However the
annotations driver being a default driver does not really help that much
anyways.
Therefore we decided to break backwards compability in this issue and drop
the support for Annotations as Default Driver and require our users to
specify the driver explicitly (which allows us to ask for the path to all
entities).
If you are using the annotations metadata driver as default driver, you
have to add the following lines to your bootstrap code:
$driverImpl = $config->newDefaultAnnotationDriver(array(__DIR__."/Entities"));
$config->setMetadataDriverImpl($driverImpl);
You have to specify the path to your entities as either string of a single
path or array of multiple paths
to your entities. This information will be used by all console commands to
access all entities.
Xml and Yaml Drivers work as before!
## New inversedBy attribute
It is now *mandatory* that the owning side of a bidirectional association specifies the
'inversedBy' attribute that points to the name of the field on the inverse side that completes
the association. Example:
[php]
// BEFORE (ALPHA4 AND EARLIER)
class User
{
//...
/** @OneToOne(targetEntity="Address", mappedBy="user") */
private $address;
//...
}
class Address
{
//...
/** @OneToOne(targetEntity="User") */
private $user;
//...
}
// SINCE BETA1
// User class DOES NOT CHANGE
class Address
{
//...
/** @OneToOne(targetEntity="User", inversedBy="address") */
private $user;
//...
}
Thus, the inversedBy attribute is the counterpart to the mappedBy attribute. This change
was necessary to enable some simplifications and further performance improvements. We
apologize for the inconvenience.
## Default Property for Field Mappings
The "default" option for database column defaults has been removed. If desired, database column defaults can
be implemented by using the columnDefinition attribute of the @Column annotation (or the approriate XML and YAML equivalents).
Prefer PHP default values, if possible.
## Selecting Partial Objects
Querying for partial objects now has a new syntax. The old syntax to query for partial objects
now has a different meaning. This is best illustrated by an example. If you previously
had a DQL query like this:
[sql]
SELECT u.id, u.name FROM User u
Since BETA1, simple state field path expressions in the select clause are used to select
object fields as plain scalar values (something that was not possible before).
To achieve the same result as previously (that is, a partial object with only id and name populated)
you need to use the following, explicit syntax:
[sql]
SELECT PARTIAL u.{id,name} FROM User u
## XML Mapping Driver
The 'inheritance-type' attribute changed to take last bit of ClassMetadata constant names, i.e.
NONE, SINGLE_TABLE, INHERITANCE_TYPE_JOINED
## YAML Mapping Driver
The way to specify lifecycle callbacks in YAML Mapping driver was changed to allow for multiple callbacks
per event. The Old syntax ways:
[yaml]
lifecycleCallbacks:
doStuffOnPrePersist: prePersist
doStuffOnPostPersist: postPersist
The new syntax is:
[yaml]
lifecycleCallbacks:
prePersist: [ doStuffOnPrePersist, doOtherStuffOnPrePersistToo ]
postPersist: [ doStuffOnPostPersist ]
## PreUpdate Event Listeners
Event Listeners listening to the 'preUpdate' event can only affect the primitive values of entity changesets
by using the API on the `PreUpdateEventArgs` instance passed to the preUpdate listener method. Any changes
to the state of the entitys properties won't affect the database UPDATE statement anymore. This gives drastic
performance benefits for the preUpdate event.
## Collection API
The Collection interface in the Common package has been updated with some missing methods
that were present only on the default implementation, ArrayCollection. Custom collection
implementations need to be updated to adhere to the updated interface.

View File

@@ -1,25 +0,0 @@
This document details all the possible changes that you should investigate when updating
your project from Doctrine 2.0.x to 2.1
## Interface for EntityRepository
The EntityRepository now has an interface Doctrine\Common\Persistence\ObjectRepository. This means that your classes that override EntityRepository and extend find(), findOneBy() or findBy() must be adjusted to follow this interface.
## AnnotationReader changes
The annotation reader was heavily refactored between 2.0 and 2.1-RC1. In theory the operation of the new reader should be backwards compatible, but it has to be setup differently to work that way:
// new call to the AnnotationRegistry
\Doctrine\Common\Annotations\AnnotationRegistry::registerFile('/doctrine-src/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php');
$reader = new \Doctrine\Common\Annotations\AnnotationReader();
$reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\');
// new code necessary starting here
$reader->setIgnoreNotImportedAnnotations(true);
$reader->setEnableParsePhpImports(false);
$reader = new \Doctrine\Common\Annotations\CachedReader(
new \Doctrine\Common\Annotations\IndexedReader($reader), new ArrayCache()
);
This is already done inside the ``$config->newDefaultAnnotationDriver``, so everything should automatically work if you are using this method. You can verify if everything still works by executing a console command such as schema-validate that loads all metadata into memory.

View File

@@ -1,76 +0,0 @@
# ResultCache implementation rewritten
The result cache is completely rewritten and now works on the database result level, not inside the ORM AbstractQuery
anymore. This means that for result cached queries the hydration will now always be performed again, regardless of
the hydration mode. Affected areas are:
1. Fixes the problem that entities coming from the result cache were not registered in the UnitOfWork
leading to problems during EntityManager#flush. Calls to EntityManager#merge are not necessary anymore.
2. Affects the array hydrator which now includes the overhead of hydration compared to caching the final result.
The API is backwards compatible however most of the getter methods on the `AbstractQuery` object are now
deprecated in favor of calling AbstractQuery#getQueryCacheProfile(). This method returns a `Doctrine\DBAL\Cache\QueryCacheProfile`
instance with access to result cache driver, lifetime and cache key.
# EntityManager#getPartialReference() creates read-only entity
Entities returned from EntityManager#getPartialReference() are now marked as read-only if they
haven't been in the identity map before. This means objects of this kind never lead to changes
in the UnitOfWork.
# Fields omitted in a partial DQL query or a native query are never updated
Fields of an entity that are not returned from a partial DQL Query or native SQL query
will never be updated through an UPDATE statement.
# Removed support for onUpdate in @JoinColumn
The onUpdate foreign key handling makes absolutely no sense in an ORM. Additionally Oracle doesn't even support it. Support for it is removed.
# Changes in Annotation Handling
There have been some changes to the annotation handling in Common 2.2 again, that affect how people with old configurations
from 2.0 have to configure the annotation driver if they don't use `Configuration::newDefaultAnnotationDriver()`:
// Register the ORM Annotations in the AnnotationRegistry
AnnotationRegistry::registerFile('path/to/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php');
$reader = new \Doctrine\Common\Annotations\SimpleAnnotationReader();
$reader->addNamespace('Doctrine\ORM\Mapping');
$reader = new \Doctrine\Common\Annotations\CachedReader($reader, new ArrayCache());
$driver = new AnnotationDriver($reader, (array)$paths);
$config->setMetadataDriverImpl($driver);
# Scalar mappings can now be ommitted from DQL result
You are now allowed to mark scalar SELECT expressions as HIDDEN an they are not hydrated anymore.
Example:
SELECT u, SUM(a.id) AS HIDDEN numArticles FROM User u LEFT JOIN u.Articles a ORDER BY numArticles DESC HAVING numArticles > 10
Your result will be a collection of Users, and not an array with key 0 as User object instance and "numArticles" as the number of articles per user
# Map entities as scalars in DQL result
When hydrating to array or even a mixed result in object hydrator, previously you had the 0 index holding you entity instance.
You are now allowed to alias this, providing more flexibility for you code.
Example:
SELECT u AS user FROM User u
Will now return a collection of arrays with index "user" pointing to the User object instance.
# Performance optimizations
Thousands of lines were completely reviewed and optimized for best performance.
Removed redundancy and improved code readability made now internal Doctrine code easier to understand.
Also, Doctrine 2.2 now is around 10-15% faster than 2.1.

View File

@@ -1,35 +0,0 @@
# Upgrade from 2.0-ALPHA2 to 2.0-ALPHA3
This section details the changes made to Doctrine 2.0-ALPHA3 to make it easier for you
to upgrade your projects to use this version.
## CLI Changes
The $args variable used in the cli-config.php for configuring the Doctrine CLI has been renamed to $globalArguments.
## Proxy class changes
You are now required to make supply some minimalist configuration with regards to proxy objects. That involves 2 new configuration options. First, the directory where generated proxy classes should be placed needs to be specified. Secondly, you need to configure the namespace used for proxy classes. The following snippet shows an example:
[php]
// step 1: configure directory for proxy classes
// $config instanceof Doctrine\ORM\Configuration
$config->setProxyDir('/path/to/myproject/lib/MyProject/Generated/Proxies');
$config->setProxyNamespace('MyProject\Generated\Proxies');
Note that proxy classes behave exactly like any other classes when it comes to class loading. Therefore you need to make sure the proxy classes can be loaded by some class loader. If you place the generated proxy classes in a namespace and directory under your projects class files, like in the example above, it would be sufficient to register the MyProject namespace on a class loader. Since the proxy classes are contained in that namespace and adhere to the standards for class loading, no additional work is required.
Generating the proxy classes into a namespace within your class library is the recommended setup.
Entities with initialized proxy objects can now be serialized and unserialized properly from within the same application.
For more details refer to the Configuration section of the manual.
## Removed allowPartialObjects configuration option
The allowPartialObjects configuration option together with the `Configuration#getAllowPartialObjects` and `Configuration#setAllowPartialObjects` methods have been removed.
The new behavior is as if the option were set to FALSE all the time, basically disallowing partial objects globally. However, you can still use the `Query::HINT_FORCE_PARTIAL_LOAD` query hint to force a query to return partial objects for optimization purposes.
## Renamed Methods
* Doctrine\ORM\Configuration#getCacheDir() to getProxyDir()
* Doctrine\ORM\Configuration#setCacheDir($dir) to setProxyDir($dir)

View File

@@ -1,36 +0,0 @@
# Upgrade from 2.0-ALPHA3 to 2.0-ALPHA4
## CLI Controller changes
CLI main object changed its name and namespace. Renamed from Doctrine\ORM\Tools\Cli to Doctrine\Common\Cli\CliController.
Doctrine\Common\Cli\CliController now only deals with namespaces. Ready to go, Core, Dbal and Orm are available and you can subscribe new tasks by retrieving the namespace and including new task. Example:
[php]
$cli->getNamespace('Core')->addTask('my-example', '\MyProject\Tools\Cli\Tasks\MyExampleTask');
## CLI Tasks documentation
Tasks have implemented a new way to build documentation. Although it is still possible to define the help manually by extending the basicHelp and extendedHelp, they are now optional.
With new required method AbstractTask::buildDocumentation, its implementation defines the TaskDocumentation instance (accessible through AbstractTask::getDocumentation()), basicHelp and extendedHelp are now not necessary to be implemented.
## Changes in Method Signatures
* A bunch of Methods on both Doctrine\DBAL\Platforms\AbstractPlatform and Doctrine\DBAL\Schema\AbstractSchemaManager
have changed quite significantly by adopting the new Schema instance objects.
## Renamed Methods
* Doctrine\ORM\AbstractQuery::setExpireResultCache() -> expireResultCache()
* Doctrine\ORM\Query::setExpireQueryCache() -> expireQueryCache()
## SchemaTool Changes
* "doctrine schema-tool --drop" now always drops the complete database instead of
only those tables defined by the current database model. The previous method had
problems when foreign keys of orphaned tables pointed to tables that were schedulded
for deletion.
* Use "doctrine schema-tool --update" to get a save incremental update for your
database schema without deleting any unused tables, sequences or foreign keys.
* Use "doctrine schema-tool --complete-update" to do a full incremental update of
your schema.

2
bin/doctrine Normal file → Executable file
View File

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

50
bin/doctrine-pear.php Normal file
View File

@@ -0,0 +1,50 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.doctrine-project.org>.
*/
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_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);

56
bin/doctrine.php Normal file → Executable file
View File

@@ -13,38 +13,54 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
require_once 'Doctrine/Common/ClassLoader.php';
use Symfony\Component\Console\Helper\HelperSet;
use Doctrine\ORM\Tools\Console\ConsoleRunner;
$classLoader = new \Doctrine\Common\ClassLoader('Doctrine');
$classLoader->register();
$autoloadFiles = array(__DIR__ . '/../vendor/autoload.php',
__DIR__ . '/../../../autoload.php');
$classLoader = new \Doctrine\Common\ClassLoader('Symfony', 'Doctrine');
$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_ERROR
);
foreach ($autoloadFiles as $autoloadFile) {
if (file_exists($autoloadFile)) {
require_once $autoloadFile;
}
}
require $configFile;
$directories = array(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 = array();
$helperSet = require $configFile;
if ( ! ($helperSet instanceof HelperSet)) {
foreach ($GLOBALS as $helperSetCandidate) {
if ($helperSetCandidate instanceof \Symfony\Component\Console\Helper\HelperSet) {
if ($helperSetCandidate instanceof HelperSet) {
$helperSet = $helperSetCandidate;
break;
}
}
}
$helperSet = ($helperSet) ?: new \Symfony\Component\Console\Helper\HelperSet();
\Doctrine\ORM\Tools\Console\ConsoleRunner::run($helperSet);
\Doctrine\ORM\Tools\Console\ConsoleRunner::run($helperSet, $commands);

View File

@@ -1,11 +1,3 @@
# Project Name
project.name=DoctrineORM
# Dependency minimum versions
dependencies.common=2.2.0beta1
dependencies.dbal=2.2.0beta1
dependencies.sfconsole=2.0.0
# Version class and file
project.version_class = Doctrine\ORM\Version
project.version_class = Doctrine\\ORM\\Version
project.version_file = lib/Doctrine/ORM/Version.php

199
build.xml
View File

@@ -1,114 +1,101 @@
<?xml version="1.0"?>
<project name="DoctrineORM" default="build" basedir=".">
<taskdef classname="phing.tasks.ext.d51PearPkg2Task" name="d51pearpkg2" />
<import file="${project.basedir}/lib/vendor/doctrine-build-common/packaging.xml" />
<property file="build.properties" />
<!--
Fileset for artifacts shared across all distributed packages.
-->
<fileset id="shared-artifacts" dir=".">
<include name="LICENSE"/>
<include name="UPGRADE*" />
<include name="doctrine-mapping.xsd" />
</fileset>
<!--
Fileset for command line scripts
-->
<fileset id="bin-scripts" dir="./bin">
<include name="doctrine"/>
<include name="doctrine.php"/>
<include name="doctrine.bat"/>
</fileset>
<!--
Fileset for the sources of the Doctrine Common dependency.
-->
<fileset id="common-sources" dir="./lib/vendor/doctrine-common/lib">
<include name="Doctrine/Common/**"/>
</fileset>
<!--
Fileset for the sources of the Doctrine DBAL dependency.
-->
<fileset id="dbal-sources" dir="./lib/vendor/doctrine-dbal/lib">
<include name="Doctrine/DBAL/**"/>
</fileset>
<!--
Fileset for the sources of the Doctrine ORM.
-->
<fileset id="orm-sources" dir="./lib">
<include name="Doctrine/ORM/**"/>
</fileset>
<!--
Fileset for source of the Symfony YAML and Console components.
-->
<fileset id="symfony-sources" dir="./lib/vendor">
<include name="Symfony/Component/**"/>
<exclude name="**/.git/**" />
</fileset>
<!--
Builds ORM package, preparing it for distribution.
-->
<target name="copy-files" depends="prepare">
<copy todir="${build.dir}/${project.name}-${version}">
<fileset refid="shared-artifacts"/>
</copy>
<copy todir="${build.dir}/${project.name}-${version}">
<fileset refid="common-sources"/>
<fileset refid="dbal-sources"/>
<fileset refid="orm-sources"/>
</copy>
<copy todir="${build.dir}/${project.name}-${version}/Doctrine">
<fileset refid="symfony-sources"/>
</copy>
<copy todir="${build.dir}/${project.name}-${version}/bin">
<fileset refid="bin-scripts"/>
</copy>
<target name="php">
<exec executable="which" outputproperty="php_executable">
<arg value="php" />
</exec>
</target>
<!--
Builds distributable PEAR packages.
-->
<target name="define-pear-package" depends="copy-files">
<d51pearpkg2 baseinstalldir="/" dir="${build.dir}/${project.name}-${version}">
<name>DoctrineORM</name>
<summary>Doctrine Object Relational Mapper</summary>
<channel>pear.doctrine-project.org</channel>
<description>The Doctrine ORM package is the primary package containing the object relational mapper.</description>
<lead user="jwage" name="Jonathan H. Wage" email="jonwage@gmail.com" />
<lead user="guilhermeblanco" name="Guilherme Blanco" email="guilhermeblanco@gmail.com" />
<lead user="romanb" name="Roman Borschel" email="roman@code-factory.org" />
<lead user="beberlei" name="Benjamin Eberlei" email="kontakt@beberlei.de" />
<license>LGPL</license>
<version release="${pear.version}" api="${pear.version}" />
<stability release="${pear.stability}" api="${pear.stability}" />
<notes>-</notes>
<dependencies>
<php minimum_version="5.3.0" />
<pear minimum_version="1.6.0" recommended_version="1.6.1" />
<package name="DoctrineCommon" channel="pear.doctrine-project.org" minimum_version="${dependencies.common}" />
<package name="DoctrineDBAL" channel="pear.doctrine-project.org" minimum_version="${dependencies.dbal}" />
<package name="Console" channel="pear.symfony.com" minimum_version="2.0.0" />
<package name="Yaml" channel="pear.symfony.com" minimum_version="2.0.0" />
</dependencies>
<dirroles key="bin">script</dirroles>
<ignore>Doctrine/Common/</ignore>
<ignore>Doctrine/DBAL/</ignore>
<ignore>Symfony/Component/Yaml/</ignore>
<ignore>Symfony/Component/Console/</ignore>
<release>
<install as="doctrine" name="bin/doctrine" />
<install as="doctrine.php" name="bin/doctrine.php" />
<install as="doctrine.bat" name="bin/doctrine.bat" />
</release>
<replacement path="bin/doctrine" type="pear-config" from="@php_bin@" to="php_bin" />
<replacement path="bin/doctrine.bat" type="pear-config" from="@bin_dir@" to="bin_dir" />
</d51pearpkg2>
<target name="prepare">
<mkdir dir="build" />
</target>
<target name="build" depends="check-git-checkout-clean,prepare,php,composer">
<exec executable="${php_executable}">
<arg value="build/composer.phar" />
<arg value="archive" />
<arg value="--dir=build" />
</exec>
</target>
<target name="composer" depends="php,composer-check,composer-download">
<exec executable="${php_executable}">
<arg value="build/composer.phar" />
<arg value="install" />
</exec>
</target>
<target name="composer-check" depends="prepare">
<available file="build/composer.phar" property="composer.present"/>
</target>
<target name="composer-download" unless="composer.present">
<exec executable="wget">
<arg value="-Obuild/composer.phar" />
<arg value="http://getcomposer.org/composer.phar" />
</exec>
</target>
<target name="make-release" depends="check-git-checkout-clean,prepare,php">
<replace file="${project.version_file}" token="-DEV" value="" failOnNoReplacements="true" />
<exec executable="${php_executable}" outputproperty="doctrine.current_version" failonerror="true">
<arg value="-r" />
<arg value="require_once '${project.version_file}';echo ${project.version_class}::VERSION;" />
</exec>
<exec executable="${php_executable}" outputproperty="doctrine.next_version" failonerror="true">
<arg value="-r" />
<arg value="$parts = explode('.', str_ireplace(array('-DEV', '-ALPHA', '-BETA'), '', '${doctrine.current_version}'));
if (count($parts) != 3) {
throw new \InvalidArgumentException('Version is assumed in format x.y.z, ${doctrine.current_version} given');
}
$parts[2]++;
echo implode('.', $parts);
" />
</exec>
<git-commit file="${project.version_file}" message="Release ${doctrine.current_version}" />
<git-tag version="${doctrine.current_version}" />
<replace file="${project.version_file}" token="${doctrine.current_version}" value="${doctrine.next_version}-DEV" />
<git-commit file="${project.version_file}" message="Bump version to ${doctrine.next_version}" />
</target>
<target name="check-git-checkout-clean">
<exec executable="git" failonerror="true">
<arg value="diff-index" />
<arg value="--quiet" />
<arg value="HEAD" />
</exec>
</target>
<macrodef name="git-commit">
<attribute name="file" default="NOT SET"/>
<attribute name="message" default="NOT SET"/>
<sequential>
<exec executable="git">
<arg value="add" />
<arg value="@{file}" />
</exec>
<exec executable="git">
<arg value="commit" />
<arg value="-m" />
<arg value="@{message}" />
</exec>
</sequential>
</macrodef>
<macrodef name="git-tag">
<attribute name="version" default="NOT SET" />
<sequential>
<exec executable="git">
<arg value="tag" />
<arg value="-m" />
<arg value="v@{version}" />
<arg value="v@{version}" />
</exec>
</sequential>
</macrodef>
</project>

View File

@@ -4,20 +4,44 @@
"description": "Object-Relational-Mapper for PHP",
"keywords": ["orm", "database"],
"homepage": "http://www.doctrine-project.org",
"license": "LGPL",
"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"}
],
"minimum-stability": "dev",
"require": {
"php": ">=5.3.2",
"php": ">=5.4",
"ext-pdo": "*",
"doctrine/common": "master-dev",
"doctrine/dbal": "master-dev"
"doctrine/collections": "~1.2",
"doctrine/dbal": ">=2.5-dev,<2.7-dev",
"doctrine/instantiator": "^1.0.1",
"doctrine/common": ">=2.5-dev,<2.9-dev",
"doctrine/cache": "~1.4",
"symfony/console": "~2.5|~3.0|~4.0"
},
"require-dev": {
"symfony/yaml": "~2.3|~3.0|~4.0",
"phpunit/phpunit": "~4.0"
},
"suggest": {
"symfony/yaml": "If you want to use YAML Metadata Mapping Driver"
},
"autoload": {
"psr-0": { "Doctrine\\ORM": "lib/" }
"psr-0": { "Doctrine\\ORM\\": "lib/" }
},
"autoload-dev": {
"psr-0": { "Doctrine\\Tests\\": "tests/" }
},
"bin": ["bin/doctrine", "bin/doctrine.php"],
"extra": {
"branch-alias": {
"dev-master": "2.6.x-dev"
}
},
"archive": {
"exclude": ["!vendor", "tests", "*phpunit.xml", ".travis.yml", "build.xml", "build.properties", "composer.phar", "vendor/satooshi", "lib/vendor", "*.swp", "*coveralls.yml"]
}
}

4
docs/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
en/_exts/configurationblock.pyc
build
en/_build
.idea

3
docs/.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "en/_theme"]
path = en/_theme
url = https://github.com/doctrine/doctrine-sphinx-theme.git

363
docs/LICENSE.md Normal file
View File

@@ -0,0 +1,363 @@
The Doctrine2 documentation is licensed under [CC BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_US)
Creative Commons Legal Code
Attribution-NonCommercial-ShareAlike 3.0 Unported
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR
DAMAGES RESULTING FROM ITS USE.
License
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
CONDITIONS.
1. Definitions
a. "Adaptation" means a work based upon the Work, or upon the Work and
other pre-existing works, such as a translation, adaptation,
derivative work, arrangement of music or other alterations of a
literary or artistic work, or phonogram or performance and includes
cinematographic adaptations or any other form in which the Work may be
recast, transformed, or adapted including in any form recognizably
derived from the original, except that a work that constitutes a
Collection will not be considered an Adaptation for the purpose of
this License. For the avoidance of doubt, where the Work is a musical
work, performance or phonogram, the synchronization of the Work in
timed-relation with a moving image ("synching") will be considered an
Adaptation for the purpose of this License.
b. "Collection" means a collection of literary or artistic works, such as
encyclopedias and anthologies, or performances, phonograms or
broadcasts, or other works or subject matter other than works listed
in Section 1(g) below, which, by reason of the selection and
arrangement of their contents, constitute intellectual creations, in
which the Work is included in its entirety in unmodified form along
with one or more other contributions, each constituting separate and
independent works in themselves, which together are assembled into a
collective whole. A work that constitutes a Collection will not be
considered an Adaptation (as defined above) for the purposes of this
License.
c. "Distribute" means to make available to the public the original and
copies of the Work or Adaptation, as appropriate, through sale or
other transfer of ownership.
d. "License Elements" means the following high-level license attributes
as selected by Licensor and indicated in the title of this License:
Attribution, Noncommercial, ShareAlike.
e. "Licensor" means the individual, individuals, entity or entities that
offer(s) the Work under the terms of this License.
f. "Original Author" means, in the case of a literary or artistic work,
the individual, individuals, entity or entities who created the Work
or if no individual or entity can be identified, the publisher; and in
addition (i) in the case of a performance the actors, singers,
musicians, dancers, and other persons who act, sing, deliver, declaim,
play in, interpret or otherwise perform literary or artistic works or
expressions of folklore; (ii) in the case of a phonogram the producer
being the person or legal entity who first fixes the sounds of a
performance or other sounds; and, (iii) in the case of broadcasts, the
organization that transmits the broadcast.
g. "Work" means the literary and/or artistic work offered under the terms
of this License including without limitation any production in the
literary, scientific and artistic domain, whatever may be the mode or
form of its expression including digital form, such as a book,
pamphlet and other writing; a lecture, address, sermon or other work
of the same nature; a dramatic or dramatico-musical work; a
choreographic work or entertainment in dumb show; a musical
composition with or without words; a cinematographic work to which are
assimilated works expressed by a process analogous to cinematography;
a work of drawing, painting, architecture, sculpture, engraving or
lithography; a photographic work to which are assimilated works
expressed by a process analogous to photography; a work of applied
art; an illustration, map, plan, sketch or three-dimensional work
relative to geography, topography, architecture or science; a
performance; a broadcast; a phonogram; a compilation of data to the
extent it is protected as a copyrightable work; or a work performed by
a variety or circus performer to the extent it is not otherwise
considered a literary or artistic work.
h. "You" means an individual or entity exercising rights under this
License who has not previously violated the terms of this License with
respect to the Work, or who has received express permission from the
Licensor to exercise rights under this License despite a previous
violation.
i. "Publicly Perform" means to perform public recitations of the Work and
to communicate to the public those public recitations, by any means or
process, including by wire or wireless means or public digital
performances; to make available to the public Works in such a way that
members of the public may access these Works from a place and at a
place individually chosen by them; to perform the Work to the public
by any means or process and the communication to the public of the
performances of the Work, including by public digital performance; to
broadcast and rebroadcast the Work by any means including signs,
sounds or images.
j. "Reproduce" means to make copies of the Work by any means including
without limitation by sound or visual recordings and the right of
fixation and reproducing fixations of the Work, including storage of a
protected performance or phonogram in digital form or other electronic
medium.
2. Fair Dealing Rights. Nothing in this License is intended to reduce,
limit, or restrict any uses free from copyright or rights arising from
limitations or exceptions that are provided for in connection with the
copyright protection under copyright law or other applicable laws.
3. License Grant. Subject to the terms and conditions of this License,
Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
perpetual (for the duration of the applicable copyright) license to
exercise the rights in the Work as stated below:
a. to Reproduce the Work, to incorporate the Work into one or more
Collections, and to Reproduce the Work as incorporated in the
Collections;
b. to create and Reproduce Adaptations provided that any such Adaptation,
including any translation in any medium, takes reasonable steps to
clearly label, demarcate or otherwise identify that changes were made
to the original Work. For example, a translation could be marked "The
original work was translated from English to Spanish," or a
modification could indicate "The original work has been modified.";
c. to Distribute and Publicly Perform the Work including as incorporated
in Collections; and,
d. to Distribute and Publicly Perform Adaptations.
The above rights may be exercised in all media and formats whether now
known or hereafter devised. The above rights include the right to make
such modifications as are technically necessary to exercise the rights in
other media and formats. Subject to Section 8(f), all rights not expressly
granted by Licensor are hereby reserved, including but not limited to the
rights described in Section 4(e).
4. Restrictions. The license granted in Section 3 above is expressly made
subject to and limited by the following restrictions:
a. You may Distribute or Publicly Perform the Work only under the terms
of this License. You must include a copy of, or the Uniform Resource
Identifier (URI) for, this License with every copy of the Work You
Distribute or Publicly Perform. You may not offer or impose any terms
on the Work that restrict the terms of this License or the ability of
the recipient of the Work to exercise the rights granted to that
recipient under the terms of the License. You may not sublicense the
Work. You must keep intact all notices that refer to this License and
to the disclaimer of warranties with every copy of the Work You
Distribute or Publicly Perform. When You Distribute or Publicly
Perform the Work, You may not impose any effective technological
measures on the Work that restrict the ability of a recipient of the
Work from You to exercise the rights granted to that recipient under
the terms of the License. This Section 4(a) applies to the Work as
incorporated in a Collection, but this does not require the Collection
apart from the Work itself to be made subject to the terms of this
License. If You create a Collection, upon notice from any Licensor You
must, to the extent practicable, remove from the Collection any credit
as required by Section 4(d), as requested. If You create an
Adaptation, upon notice from any Licensor You must, to the extent
practicable, remove from the Adaptation any credit as required by
Section 4(d), as requested.
b. You may Distribute or Publicly Perform an Adaptation only under: (i)
the terms of this License; (ii) a later version of this License with
the same License Elements as this License; (iii) a Creative Commons
jurisdiction license (either this or a later license version) that
contains the same License Elements as this License (e.g.,
Attribution-NonCommercial-ShareAlike 3.0 US) ("Applicable License").
You must include a copy of, or the URI, for Applicable License with
every copy of each Adaptation You Distribute or Publicly Perform. You
may not offer or impose any terms on the Adaptation that restrict the
terms of the Applicable License or the ability of the recipient of the
Adaptation to exercise the rights granted to that recipient under the
terms of the Applicable License. You must keep intact all notices that
refer to the Applicable License and to the disclaimer of warranties
with every copy of the Work as included in the Adaptation You
Distribute or Publicly Perform. When You Distribute or Publicly
Perform the Adaptation, You may not impose any effective technological
measures on the Adaptation that restrict the ability of a recipient of
the Adaptation from You to exercise the rights granted to that
recipient under the terms of the Applicable License. This Section 4(b)
applies to the Adaptation as incorporated in a Collection, but this
does not require the Collection apart from the Adaptation itself to be
made subject to the terms of the Applicable License.
c. You may not exercise any of the rights granted to You in Section 3
above in any manner that is primarily intended for or directed toward
commercial advantage or private monetary compensation. The exchange of
the Work for other copyrighted works by means of digital file-sharing
or otherwise shall not be considered to be intended for or directed
toward commercial advantage or private monetary compensation, provided
there is no payment of any monetary compensation in con-nection with
the exchange of copyrighted works.
d. If You Distribute, or Publicly Perform the Work or any Adaptations or
Collections, You must, unless a request has been made pursuant to
Section 4(a), keep intact all copyright notices for the Work and
provide, reasonable to the medium or means You are utilizing: (i) the
name of the Original Author (or pseudonym, if applicable) if supplied,
and/or if the Original Author and/or Licensor designate another party
or parties (e.g., a sponsor institute, publishing entity, journal) for
attribution ("Attribution Parties") in Licensor's copyright notice,
terms of service or by other reasonable means, the name of such party
or parties; (ii) the title of the Work if supplied; (iii) to the
extent reasonably practicable, the URI, if any, that Licensor
specifies to be associated with the Work, unless such URI does not
refer to the copyright notice or licensing information for the Work;
and, (iv) consistent with Section 3(b), in the case of an Adaptation,
a credit identifying the use of the Work in the Adaptation (e.g.,
"French translation of the Work by Original Author," or "Screenplay
based on original Work by Original Author"). The credit required by
this Section 4(d) may be implemented in any reasonable manner;
provided, however, that in the case of a Adaptation or Collection, at
a minimum such credit will appear, if a credit for all contributing
authors of the Adaptation or Collection appears, then as part of these
credits and in a manner at least as prominent as the credits for the
other contributing authors. For the avoidance of doubt, You may only
use the credit required by this Section for the purpose of attribution
in the manner set out above and, by exercising Your rights under this
License, You may not implicitly or explicitly assert or imply any
connection with, sponsorship or endorsement by the Original Author,
Licensor and/or Attribution Parties, as appropriate, of You or Your
use of the Work, without the separate, express prior written
permission of the Original Author, Licensor and/or Attribution
Parties.
e. For the avoidance of doubt:
i. Non-waivable Compulsory License Schemes. In those jurisdictions in
which the right to collect royalties through any statutory or
compulsory licensing scheme cannot be waived, the Licensor
reserves the exclusive right to collect such royalties for any
exercise by You of the rights granted under this License;
ii. Waivable Compulsory License Schemes. In those jurisdictions in
which the right to collect royalties through any statutory or
compulsory licensing scheme can be waived, the Licensor reserves
the exclusive right to collect such royalties for any exercise by
You of the rights granted under this License if Your exercise of
such rights is for a purpose or use which is otherwise than
noncommercial as permitted under Section 4(c) and otherwise waives
the right to collect royalties through any statutory or compulsory
licensing scheme; and,
iii. Voluntary License Schemes. The Licensor reserves the right to
collect royalties, whether individually or, in the event that the
Licensor is a member of a collecting society that administers
voluntary licensing schemes, via that society, from any exercise
by You of the rights granted under this License that is for a
purpose or use which is otherwise than noncommercial as permitted
under Section 4(c).
f. Except as otherwise agreed in writing by the Licensor or as may be
otherwise permitted by applicable law, if You Reproduce, Distribute or
Publicly Perform the Work either by itself or as part of any
Adaptations or Collections, You must not distort, mutilate, modify or
take other derogatory action in relation to the Work which would be
prejudicial to the Original Author's honor or reputation. Licensor
agrees that in those jurisdictions (e.g. Japan), in which any exercise
of the right granted in Section 3(b) of this License (the right to
make Adaptations) would be deemed to be a distortion, mutilation,
modification or other derogatory action prejudicial to the Original
Author's honor and reputation, the Licensor will waive or not assert,
as appropriate, this Section, to the fullest extent permitted by the
applicable national law, to enable You to reasonably exercise Your
right under Section 3(b) of this License (right to make Adaptations)
but not otherwise.
5. Representations, Warranties and Disclaimer
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING AND TO THE
FULLEST EXTENT PERMITTED BY APPLICABLE LAW, LICENSOR OFFERS THE WORK AS-IS
AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE
WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT
LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT
DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED
WARRANTIES, SO THIS EXCLUSION MAY NOT APPLY TO YOU.
6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE
LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR
ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES
ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
7. Termination
a. This License and the rights granted hereunder will terminate
automatically upon any breach by You of the terms of this License.
Individuals or entities who have received Adaptations or Collections
from You under this License, however, will not have their licenses
terminated provided such individuals or entities remain in full
compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
survive any termination of this License.
b. Subject to the above terms and conditions, the license granted here is
perpetual (for the duration of the applicable copyright in the Work).
Notwithstanding the above, Licensor reserves the right to release the
Work under different license terms or to stop distributing the Work at
any time; provided, however that any such election will not serve to
withdraw this License (or any other license that has been, or is
required to be, granted under the terms of this License), and this
License will continue in full force and effect unless terminated as
stated above.
8. Miscellaneous
a. Each time You Distribute or Publicly Perform the Work or a Collection,
the Licensor offers to the recipient a license to the Work on the same
terms and conditions as the license granted to You under this License.
b. Each time You Distribute or Publicly Perform an Adaptation, Licensor
offers to the recipient a license to the original Work on the same
terms and conditions as the license granted to You under this License.
c. If any provision of this License is invalid or unenforceable under
applicable law, it shall not affect the validity or enforceability of
the remainder of the terms of this License, and without further action
by the parties to this agreement, such provision shall be reformed to
the minimum extent necessary to make such provision valid and
enforceable.
d. No term or provision of this License shall be deemed waived and no
breach consented to unless such waiver or consent shall be in writing
and signed by the party to be charged with such waiver or consent.
e. This License constitutes the entire agreement between the parties with
respect to the Work licensed here. There are no understandings,
agreements or representations with respect to the Work not specified
here. Licensor shall not be bound by any additional provisions that
may appear in any communication from You. This License may not be
modified without the mutual written agreement of the Licensor and You.
f. The rights granted under, and the subject matter referenced, in this
License were drafted utilizing the terminology of the Berne Convention
for the Protection of Literary and Artistic Works (as amended on
September 28, 1979), the Rome Convention of 1961, the WIPO Copyright
Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996
and the Universal Copyright Convention (as revised on July 24, 1971).
These rights and subject matter take effect in the relevant
jurisdiction in which the License terms are sought to be enforced
according to the corresponding provisions of the implementation of
those treaty provisions in the applicable national law. If the
standard suite of rights granted under applicable copyright law
includes additional rights not granted under this License, such
additional rights are deemed to be included in the License; this
License is not intended to restrict the license of any rights under
applicable law.
Creative Commons Notice
Creative Commons is not a party to this License, and makes no warranty
whatsoever in connection with the Work. Creative Commons will not be
liable to You or any party on any legal theory for any damages
whatsoever, including without limitation any general, special,
incidental or consequential damages arising in connection to this
license. Notwithstanding the foregoing two (2) sentences, if Creative
Commons has expressly identified itself as the Licensor hereunder, it
shall have all rights and obligations of Licensor.
Except for the limited purpose of indicating to the public that the
Work is licensed under the CCPL, Creative Commons does not authorize
the use by either party of the trademark "Creative Commons" or any
related trademark or logo of Creative Commons without the prior
written consent of Creative Commons. Any permitted use will be in
compliance with Creative Commons' then-current trademark usage
guidelines, as may be published on its website or otherwise made
available upon request from time to time. For the avoidance of doubt,
this trademark restriction does not form part of this License.
Creative Commons may be contacted at http://creativecommons.org/.

8
docs/README.md Normal file
View File

@@ -0,0 +1,8 @@
# Doctrine ORM Documentation
## How to Generate
1. Run ./bin/install-dependencies.sh
2. Run ./bin/generate-docs.sh
It will generate the documentation into the build directory of the checkout.

10
docs/bin/generate-docs.sh Executable file
View File

@@ -0,0 +1,10 @@
#!/bin/bash
EXECPATH=`dirname $0`
cd $EXECPATH
cd ..
rm build -Rf
sphinx-build en build
sphinx-build -b latex en build/pdf
rubber --into build/pdf --pdf build/pdf/Doctrine2ORM.tex

View File

@@ -0,0 +1,4 @@
#!/bin/bash
sudo apt-get install python25 python25-dev texlive-full rubber
sudo easy_install pygments
sudo easy_install sphinx

89
docs/en/Makefile Normal file
View File

@@ -0,0 +1,89 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
-rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Doctrine2ORM.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Doctrine2ORM.qhc"
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
"run these through (pdf)latex."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."

View File

@@ -0,0 +1,93 @@
#Copyright (c) 2010 Fabien Potencier
#
#Permission is hereby granted, free of charge, to any person obtaining a copy
#of this software and associated documentation files (the "Software"), to deal
#in the Software without restriction, including without limitation the rights
#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#copies of the Software, and to permit persons to whom the Software is furnished
#to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in all
#copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#THE SOFTWARE.
from docutils.parsers.rst import Directive, directives
from docutils import nodes
from string import upper
class configurationblock(nodes.General, nodes.Element):
pass
class ConfigurationBlock(Directive):
has_content = True
required_arguments = 0
optional_arguments = 0
final_argument_whitespace = True
option_spec = {}
formats = {
'html': 'HTML',
'xml': 'XML',
'php': 'PHP',
'yaml': 'YAML',
'jinja': 'Twig',
'html+jinja': 'Twig',
'jinja+html': 'Twig',
'php+html': 'PHP',
'html+php': 'PHP',
'ini': 'INI',
'php-annotations': 'Annotations',
}
def run(self):
env = self.state.document.settings.env
node = nodes.Element()
node.document = self.state.document
self.state.nested_parse(self.content, self.content_offset, node)
entries = []
for i, child in enumerate(node):
if isinstance(child, nodes.literal_block):
# add a title (the language name) before each block
#targetid = "configuration-block-%d" % env.new_serialno('configuration-block')
#targetnode = nodes.target('', '', ids=[targetid])
#targetnode.append(child)
innernode = nodes.emphasis(self.formats[child['language']], self.formats[child['language']])
para = nodes.paragraph()
para += [innernode, child]
entry = nodes.list_item('')
entry.append(para)
entries.append(entry)
resultnode = configurationblock()
resultnode.append(nodes.bullet_list('', *entries))
return [resultnode]
def visit_configurationblock_html(self, node):
self.body.append(self.starttag(node, 'div', CLASS='configuration-block'))
def depart_configurationblock_html(self, node):
self.body.append('</div>\n')
def visit_configurationblock_latex(self, node):
pass
def depart_configurationblock_latex(self, node):
pass
def setup(app):
app.add_node(configurationblock,
html=(visit_configurationblock_html, depart_configurationblock_html),
latex=(visit_configurationblock_latex, depart_configurationblock_latex))
app.add_directive('configuration-block', ConfigurationBlock)

1
docs/en/_theme Submodule

Submodule docs/en/_theme added at dc294be1db

View File

@@ -0,0 +1,710 @@
What is new in Doctrine ORM 2.5?
================================
This document describes changes between Doctrine ORM 2.4 and 2.5 (currently in
Beta). It contains a description of all the new features and sections
about behavioral changes and potential backwards compatibility breaks.
Please review this document carefully when updating to Doctrine 2.5.
First note, that with the ORM 2.5 release we are dropping support
for PHP 5.3. We are enforcing this with Composer, servers without
at least PHP 5.4 will not allow installing Doctrine 2.5.
New Features and Improvements
-----------------------------
Events: PostLoad now triggered after associations are loaded
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Before Doctrine 2.5 if you had an entity with a ``@PostLoad`` event
defined then Doctrine would trigger listeners after the fields were
loaded, but before assocations are available.
- `DDC-54 <http://doctrine-project.org/jira/browse/DDC-54>`_
- `Commit <https://github.com/doctrine/doctrine2/commit/a906295c65f1516737458fbee2f6fa96254f27a5>`_
Events: Add API to programatically add event listeners to Entity
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When developing third party libraries or decoupled applications
it can be interesting to develop an entity listener without knowing
the entities that require this listener.
You can now attach entity listeners to entities using the
``AttachEntityListenersListener`` class, which is listening to the
``loadMetadata`` event that is fired once for every entity during
metadata generation:
.. code-block:: php
<?php
use Doctrine\ORM\Tools\AttachEntityListenersListener;
use Doctrine\ORM\Events;
$listener = new AttachEntityListenersListener();
$listener->addEntityListener(
'MyProject\Entity\User', 'MyProject\Listener\TimestampableListener',
Events::prePersist, 'onPrePersist'
);
$evm->addEventListener(Events::loadClassMetadata, $listener);
class TimestampableListener
{
public function onPrePersist($event)
{
$entity = $event->getEntity();
$entity->setCreated(new \DateTime('now'));
}
}
Embeddedable Objects
~~~~~~~~~~~~~~~~~~~~
Doctrine now supports creating multiple PHP objects from one database table
implementing a feature called "Embeddedable Objects". Next to an ``@Entity``
class you can now define a class that is embeddable into a database table of an
entity using the ``@Embeddable`` annotation. Embeddable objects can never be
saved, updated or deleted on their own, only as part of an entity (called
"root-entity" or "aggregate"). Consequently embeddables don't have a primary
key, they are identified only by their values.
Example of defining and using embeddables classes:
.. code-block:: php
<?php
/** @Entity */
class Product
{
/** @Id @Column(type="integer") @GeneratedValue */
private $id;
/** @Embedded(class = "Money") */
private $price;
}
/** @Embeddable */
class Money
{
/** @Column(type = "decimal") */
private $value;
/** @Column(type = "string") */
private $currency = 'EUR';
}
You can read more on the features of Embeddables objects `in the documentation
<http://docs.doctrine-project.org/en/latest/tutorials/embeddables.html>`_.
This feature was developed by external contributor `Johannes Schmitt
<https://twitter.com/schmittjoh>`_
- `DDC-93 <http://doctrine-project.org/jira/browse/DDC-93>`_
- `Pull Request <https://github.com/doctrine/doctrine2/pull/835>`_
Second-Level-Cache
~~~~~~~~~~~~~~~~~~
Since version 2.0 of Doctrine, fetching the same object twice by primary key
would result in just one query. This was achieved by the identity map pattern
(first-level-cache) that kept entities in memory.
The newly introduced second-level-cache works a bit differently. Instead
of saving objects in memory, it saves them in a fast in-memory cache such
as Memcache, Redis, Riak or MongoDB. Additionally it allows saving the result
of more complex queries than by primary key. Summarized this feature works
like the existing Query result cache, but it is much more powerful.
As an example lets cache an entity Country that is a relation to the User
entity. We always want to display the country, but avoid the additional
query to this table.
.. code-block:: php
<?php
/**
* @Entity
* @Cache(usage="READ_ONLY", region="country_region")
*/
class Country
{
/**
* @Id
* @GeneratedValue
* @Column(type="integer")
*/
protected $id;
/**
* @Column(unique=true)
*/
protected $name;
}
In this example we have specified a caching region name called
``country_region``, which we have to configure now on the EntityManager:
.. code-block:: php
$config = new \Doctrine\ORM\Configuration();
$config->setSecondLevelCacheEnabled();
$cacheConfig = $config->getSecondLevelCacheConfiguration();
$regionConfig = $cacheConfig->getRegionsConfiguration();
$regionConfig->setLifetime('country_region', 3600);
Now Doctrine will first check for the data of any country in the cache
instead of the database.
- `Documentation
<http://docs.doctrine-project.org/en/latest/reference/second-level-cache.html>`_
- `Pull Request <https://github.com/doctrine/doctrine2/pull/808>`_
Criteria API: Support for ManyToMany assocations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We introduced support for querying collections using the `Criteria API
<http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#filtering-collections>`_
in 2.4. This only worked efficently for One-To-Many assocations, not for
Many-To-Many. With the start of 2.5 also Many-To-Many associations get queried
instead of loading them into memory.
Criteria API: Add new contains() expression
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
It is now possible to use the Criteria API to check for string contains needle
using ``contains()``. This translates to using a ``column LIKE '%needle%'`` SQL
condition.
.. code-block:: php
<?php
use \Doctrine\Common\Collections\Criteria;
$criteria = Criteria::create()
->where(Criteria::expr()->contains('name', 'Benjamin'));
$users = $repository->matching($criteria);
Criteria API: Support for EXTRA_LAZY
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A collection that is marked as ``fetch="EXTRA_LAZY"`` will now return another
lazy collection when using ``Collection::matching($criteria)``:
.. code-block:: php
<?php
class Post
{
/** @OneToMany(targetEntity="Comment", fetch="EXTRA_LAZY") */
private $comments;
}
$criteria = Criteria::create()
->where(Criteria->expr()->eq("published", 1));
$publishedComments = $post->getComments()->matching($criteria);
echo count($publishedComments);
The lazy criteria currently supports the ``count()`` and ``contains()``
functionality lazily. All other operations of the ``Collection`` interface
trigger a full load of the collection.
This feature was contributed by `Michaël Gallego <https://github.com/bakura10>`_.
- `Pull Request #1 <https://github.com/doctrine/doctrine2/pull/882>`_
- `Pull Request #2 <https://github.com/doctrine/doctrine2/pull/1032>`_
Mapping: Allow configuring Index flags
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
It is now possible to control the index flags in the DBAL
schema abstraction from the ORM using metadata. This was possible
only with a schema event listener before.
.. code-block:: php
<?php
/**
* @Table(name="product", indexes={@Index(columns={"description"},flags={"fulltext"})})
*/
class Product
{
private $description;
}
This feature was contributed by `Adrian Olek <https://github.com/adrianolek>`_.
- `Pull Request <https://github.com/doctrine/doctrine2/pull/973>`_
SQLFilter API: Check if a parameter is set
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can now check in your SQLFilter if a parameter was set. This allows
to more easily control which features of a filter to enable or disable.
Extending on the locale example of the documentation:
.. code-block:: php
<?php
class MyLocaleFilter extends SQLFilter
{
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
if (!$targetEntity->reflClass->implementsInterface('LocaleAware')) {
return "";
}
if (!$this->hasParameter('locale')) {
return "";
}
return $targetTableAlias.'.locale = ' . $this->getParameter('locale');
}
}
This feature was contributed by `Miroslav Demovic <https://github.com/mdemo>`_
- `Pull Request <https://github.com/doctrine/doctrine2/pull/963>`_
EXTRA_LAZY Improvements
~~~~~~~~~~~~~~~~~~~~~~~
1. Efficient query when using EXTRA_LAZY and containsKey
When calling ``Collection::containsKey($key)`` on one-to-many and many-to-many
collections using ``indexBy`` and ``EXTRA_LAZY`` a query is now executed to check
for the existance for the item. Prevoiusly this operation was performed in memory
by loading all entities of the collection.
.. code-block:: php
<?php
class User
{
/** @OneToMany(targetEntity="Group", indexBy="id") */
private $groups;
}
if ($user->getGroups()->containsKey($groupId)) {
echo "User is in group $groupId\n";
}
This feature was contributed by `Asmir Mustafic <https://github.com/goetas>`_
- `Pull Request <https://github.com/doctrine/doctrine2/pull/937>`_
2. Add EXTRA_LAZY Support for get() for owning and inverse many-to-many
This was contributed by `Sander Marechal <https://github.com/sandermarechal>`_.
Improve efficiency of One-To-Many EAGER
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When marking a one-to-many association with ``fetch="EAGER"`` it will now
execute one query less than before and work correctly in combination with
``indexBy``.
Better support for EntityManagerInterface
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Many of the locations where previously only the ``Doctrine\ORM\EntityManager``
was allowed are now changed to accept the ``EntityManagerInterface`` that was
introduced in 2.4. This allows you to more easily use the decorator pattern
to extend the EntityManager if you need. It's still not replaced everywhere,
so you still have to be careful.
DQL Improvements
~~~~~~~~~~~~~~~~
1. It is now possible to add functions to the ``ORDER BY`` clause in DQL statements:
.. code-block:: php
<?php
$dql = "SELECT u FROM User u ORDER BY CONCAT(u.username, u.name)";
2. Support for functions in ``IS NULL`` expressions:
.. code-block:: php
<?php
$dql = "SELECT u.name FROM User u WHERE MAX(u.name) IS NULL";
3. A ``LIKE`` expression is now suported in ``HAVING`` clause.
4. Subselects are now supported inside a ``NEW()`` expression:
.. code-block:: php
<?php
$dql = "SELECT new UserDTO(u.name, SELECT count(g.id) FROM Group g WHERE g.id = u.id) FROM User u";
5. ``MEMBER OF`` expression now allows to filter for more than one result:
.. code-block:: php
<?php
$dql = "SELECT u FROM User u WHERE :groups MEMBER OF u.groups";
$query = $entityManager->createQuery($dql);
$query->setParameter('groups', array(1, 2, 3));
$users = $query->getResult();
6. Expressions inside ``COUNT()`` now allowed
.. code-block:: php
<?php
$dql = "SELECT COUNT(DISTINCT CONCAT(u.name, u.lastname)) FROM User u";
7. Add support for ``HOUR`` in ``DATE_ADD()``/``DATE_SUB()`` functions
Custom DQL Functions: Add support for factories
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Previously custom DQL functions could only be provided with their
full-qualified class-name, preventing runtime configuration through
dependency injection.
A simplistic approach has been contributed by `Matthieu Napoli
<https://github.com/mnapoli>`_ to pass a callback instead that resolves
the function:
.. code-block:: php
<?php
$config = new \Doctrine\ORM\Configuration();
$config->addCustomNumericFunction(
'IS_PUBLISHED', function($funcName) use ($currentSiteId) {
return new IsPublishedFunction($currentSiteId);
}
);
Query API: WHERE IN Query using a Collection as parameter
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When performing a ``WHERE IN`` query for a collection of entities you can
now pass the array collection of entities as a parameter value to the query
object:
.. code-block:: php
<?php
$categories = $rootCategory->getChildren();
$queryBuilder
->select('p')
->from('Product', 'p')
->where('p.category IN (:categories)')
->setParameter('categories', $categories)
;
This feature was contributed by `Michael Perrin
<https://github.com/michaelperrin>`_.
- `Pull Request <https://github.com/doctrine/doctrine2/pull/590>`_
- `DDC-2319 <http://doctrine-project.org/jira/browse/DDC-2319>`_
Query API: Add suport for default Query Hints
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To configure multiple different features such as custom AST Walker, fetch modes,
locking and other features affecting DQL generation we have had a feature
called "query hints" since version 2.0.
It is now possible to add query hints that are always enabled for every Query:
.. code-block:: php
<?php
$config = new \Doctrine\ORM\Configuration();
$config->setDefaultQueryHints(
'doctrine.customOutputWalker' => 'MyProject\CustomOutputWalker'
);
This feature was contributed by `Artur Eshenbrener
<https://github.com/Strate>`_.
- `Pull Request <https://github.com/doctrine/doctrine2/pull/863>`_
ResultSetMappingBuilder: Add support for Single-Table Inheritance
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Before 2.5 the ResultSetMappingBuilder did not work with entities
that are using Single-Table-Inheritance. This restriction was lifted
by adding the missing support.
YAML Mapping: Many-To-Many doesnt require join column definition
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In Annotations and XML it was not necessary using conventions for naming
the many-to-many join column names, in YAML it was not possible however.
A many-to-many definition in YAML is now possible using this minimal
definition:
.. code-block:: yaml
manyToMany:
groups:
targetEntity: Group
joinTable:
name: users_groups
Schema Validator Command: Allow to skip sub-checks
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The Schema Validator command executes two independent checks
for validity of the mappings and if the schema is synchronized
correctly. It is now possible to skip any of the two steps
when executing the command:
::
$ php vendor/bin/doctrine orm:validate-schema --skip-mapping
$ php vendor/bin/doctrine orm:validate-schema --skip-sync
This allows you to write more specialized continuous integration and automation
checks. When no changes are found the command returns the exit code 0
and 1, 2 or 3 when failing because of mapping, sync or both.
EntityGenerator Command: Avoid backups
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When calling the EntityGenerator for an existing entity, Doctrine would
create a backup file every time to avoid loosing changes to the code.
You can now skip generating the backup file by passing the ``--no-backup``
flag:
::
$ php vendor/bin/doctrine orm:generate-entities src/ --no-backup
Support for Objects as Identifiers
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
It is now possible to use Objects as identifiers for Entities
as long as they implement the magic method ``__toString()``.
.. code-block:: php
<?php
class UserId
{
private $value;
public function __construct($value)
{
$this->value = $value;
}
public function __toString()
{
return (string)$this->value;
}
}
class User
{
/** @Id @Column(type="userid") */
private $id;
public function __construct(UserId $id)
{
$this->id = $id;
}
}
class UserIdType extends \Doctrine\DBAL\Types\Type
{
// ...
}
Doctrine\DBAL\Types\Type::addType('userid', 'MyProject\UserIdType');
Behavioral Changes (BC Breaks)
------------------------------
NamingStrategy interface changed
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The ``Doctrine\ORM\Mapping\NamingStrategyInterface`` changed slightly
to pass the Class Name of the entity into the join column name generation:
::
- function joinColumnName($propertyName);
+ function joinColumnName($propertyName, $className = null);
It also received a new method for supporting embeddables:
::
public function embeddedFieldToColumnName($propertyName, $embeddedColumnName);
Minor BC BREAK: EntityManagerInterface instead of EntityManager in type-hints
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
As of 2.5, classes requiring the ``EntityManager`` in any method signature will now require
an ``EntityManagerInterface`` instead.
If you are extending any of the following classes, then you need to check following
signatures:
- ``Doctrine\ORM\Tools\DebugUnitOfWorkListener#dumpIdentityMap(EntityManagerInterface $em)``
- ``Doctrine\ORM\Mapping\ClassMetadataFactory#setEntityManager(EntityManagerInterface $em)``
Minor BC BREAK: Custom Hydrators API change
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
As of 2.5, ``AbstractHydrator`` does not enforce the usage of cache as part of
API, and now provides you a clean API for column information through the method
``hydrateColumnInfo($column)``.
Cache variable being passed around by reference is no longer needed since
Hydrators are per query instantiated since Doctrine 2.4.
- `DDC-3060 <http://doctrine-project.org/jira/browse/DDC-3060>`_
Minor BC BREAK: All non-transient classes in an inheritance must be part of the inheritance map
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
As of 2.5, classes, if you define an inheritance map for an inheritance tree, you are required
to map all non-transient classes in that inheritance, including the root of the inheritance.
So far, the root of the inheritance was allowed to be skipped in the inheritance map: this is
not possible anymore, and if you don't plan to persist instances of that class, then you should
either:
- make that class as ``abstract``
- add that class to your inheritance map
If you fail to do so, then a ``Doctrine\ORM\Mapping\MappingException`` will be thrown.
- `DDC-3300 <http://doctrine-project.org/jira/browse/DDC-3300>`_
- `DDC-3503 <http://doctrine-project.org/jira/browse/DDC-3503>`_
Minor BC BREAK: Entity based EntityManager#clear() calls follow cascade detach
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Whenever ``EntityManager#clear()`` method gets called with a given entity class
name, until 2.4, it was only detaching the specific requested entity.
As of 2.5, ``EntityManager`` will follow configured cascades, providing a better
memory management since associations will be garbage collected, optimizing
resources consumption on long running jobs.
Updates on entities scheduled for deletion are no longer processed
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In Doctrine 2.4, if you modified properties of an entity scheduled for deletion, UnitOfWork would
produce an ``UPDATE`` statement to be executed right before the ``DELETE`` statement. The entity in question
was therefore present in ``UnitOfWork#entityUpdates``, which means that ``preUpdate`` and ``postUpdate``
listeners were (quite pointlessly) called. In ``preFlush`` listeners, it used to be possible to undo
the scheduled deletion for updated entities (by calling ``persist()`` if the entity was found in both
``entityUpdates`` and ``entityDeletions``). This does not work any longer, because the entire changeset
calculation logic is optimized away.
Minor BC BREAK: Default lock mode changed from LockMode::NONE to null in method signatures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A misconception concerning default lock mode values in method signatures lead to unexpected behaviour
in SQL statements on SQL Server. With a default lock mode of ``LockMode::NONE`` throughout the
method signatures in ORM, the table lock hint ``WITH (NOLOCK)`` was appended to all locking related
queries by default. This could result in unpredictable results because an explicit ``WITH (NOLOCK)``
table hint tells SQL Server to run a specific query in transaction isolation level READ UNCOMMITTED
instead of the default READ COMMITTED transaction isolation level.
Therefore there now is a distinction between ``LockMode::NONE`` and ``null`` to be able to tell
Doctrine whether to add table lock hints to queries by intention or not. To achieve this, the following
method signatures have been changed to declare ``$lockMode = null`` instead of ``$lockMode = LockMode::NONE``:
- ``Doctrine\ORM\Cache\Persister\AbstractEntityPersister#getSelectSQL()``
- ``Doctrine\ORM\Cache\Persister\AbstractEntityPersister#load()``
- ``Doctrine\ORM\Cache\Persister\AbstractEntityPersister#refresh()``
- ``Doctrine\ORM\Decorator\EntityManagerDecorator#find()``
- ``Doctrine\ORM\EntityManager#find()``
- ``Doctrine\ORM\EntityRepository#find()``
- ``Doctrine\ORM\Persisters\BasicEntityPersister#getSelectSQL()``
- ``Doctrine\ORM\Persisters\BasicEntityPersister#load()``
- ``Doctrine\ORM\Persisters\BasicEntityPersister#refresh()``
- ``Doctrine\ORM\Persisters\EntityPersister#getSelectSQL()``
- ``Doctrine\ORM\Persisters\EntityPersister#load()``
- ``Doctrine\ORM\Persisters\EntityPersister#refresh()``
- ``Doctrine\ORM\Persisters\JoinedSubclassPersister#getSelectSQL()``
You should update signatures for these methods if you have subclassed one of the above classes.
Please also check the calling code of these methods in your application and update if necessary.
.. note::
This in fact is really a minor BC BREAK and should not have any affect on database vendors
other than SQL Server because it is the only one that supports and therefore cares about
``LockMode::NONE``. It's really just a FIX for SQL Server environments using ORM.
Minor BC BREAK: __clone method not called anymore when entities are instantiated via metadata API
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
As of PHP 5.6, instantiation of new entities is deferred to the
`doctrine/instantiator <https://github.com/doctrine/instantiator>`_ library, which will avoid calling ``__clone``
or any public API on instantiated objects.
BC BREAK: DefaultRepositoryFactory is now final
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Please implement the ``Doctrine\ORM\Repository\RepositoryFactory`` interface instead of extending
the ``Doctrine\ORM\Repository\DefaultRepositoryFactory``.
BC BREAK: New object expression DQL queries now respects user provided aliasing and not return consumed fields
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When executing DQL queries with new object expressions, instead of returning
DTOs numerically indexes, it will now respect user provided aliases. Consider
the following query:
::
SELECT new UserDTO(u.id,u.name) as user,new AddressDTO(a.street,a.postalCode) as address, a.id as addressId
FROM User u INNER JOIN u.addresses a WITH a.isPrimary = true
Previously, your result would be similar to this:
::
array(
0=>array(
0=>{UserDTO object},
1=>{AddressDTO object},
2=>{u.id scalar},
3=>{u.name scalar},
4=>{a.street scalar},
5=>{a.postalCode scalar},
'addressId'=>{a.id scalar},
),
...
)
From now on, the resultset will look like this:
::
array(
0=>array(
'user'=>{UserDTO object},
'address'=>{AddressDTO object},
'addressId'=>{a.id scalar}
),
...
)

201
docs/en/conf.py Normal file
View File

@@ -0,0 +1,201 @@
# -*- coding: utf-8 -*-
#
# Doctrine 2 ORM documentation build configuration file, created by
# sphinx-quickstart on Fri Dec 3 18:10:24 2010.
#
# This file is execfile()d with the current directory set to its containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys, os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.append(os.path.abspath('_exts'))
# -- General configuration -----------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ['configurationblock']
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'Doctrine 2 ORM'
copyright = u'2010-12, Doctrine Project Team'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '2'
# The full version, including alpha/beta/rc tags.
release = '2'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
language = 'en'
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of documents that shouldn't be included in the build.
#unused_docs = []
# List of directories, relative to source directory, that shouldn't be searched
# for source files.
exclude_trees = ['_build']
# The reST default role (used for this markup: `text`) to use for all documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
show_authors = True
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# -- Options for HTML output ---------------------------------------------------
# The theme to use for HTML and HTML Help pages. Major themes that come with
# Sphinx are currently 'default' and 'sphinxdoc'.
html_theme = 'doctrine'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
html_theme_path = ['_theme']
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_use_modindex = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = ''
# Output file base name for HTML help builder.
htmlhelp_basename = 'Doctrine2ORMdoc'
# -- Options for LaTeX output --------------------------------------------------
# The paper size ('letter' or 'a4').
#latex_paper_size = 'letter'
# The font size ('10pt', '11pt' or '12pt').
#latex_font_size = '10pt'
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('index', 'Doctrine2ORM.tex', u'Doctrine 2 ORM Documentation',
u'Doctrine Project Team', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# Additional stuff for the LaTeX preamble.
#latex_preamble = ''
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_use_modindex = True
primary_domain = "dcorm"
def linkcode_resolve(domain, info):
if domain == 'dcorm':
return 'http://'
return None

View File

@@ -0,0 +1,256 @@
Advanced field value conversion using custom mapping types
==========================================================
.. sectionauthor:: Jan Sorgalla <jsorgalla@googlemail.com>
When creating entities, you sometimes have the need to transform field values
before they are saved to the database. In Doctrine you can use Custom Mapping
Types to solve this (see: :ref:`reference-basic-mapping-custom-mapping-types`).
There are several ways to achieve this: converting the value inside the Type
class, converting the value on the database-level or a combination of both.
This article describes the third way by implementing the MySQL specific column
type `Point <http://dev.mysql.com/doc/refman/5.5/en/gis-class-point.html>`_.
The ``Point`` type is part of the `Spatial extension <http://dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html>`_
of MySQL and enables you to store a single location in a coordinate space by
using x and y coordinates. You can use the Point type to store a
longitude/latitude pair to represent a geographic location.
The entity
----------
We create a simple entity with a field ``$point`` which holds a value object
``Point`` representing the latitude and longitude of the position.
The entity class:
.. code-block:: php
<?php
namespace Geo\Entity;
/**
* @Entity
*/
class Location
{
/**
* @Column(type="point")
*
* @var \Geo\ValueObject\Point
*/
private $point;
/**
* @Column(type="string")
*
* @var string
*/
private $address;
/**
* @param \Geo\ValueObject\Point $point
*/
public function setPoint(\Geo\ValueObject\Point $point)
{
$this->point = $point;
}
/**
* @return \Geo\ValueObject\Point
*/
public function getPoint()
{
return $this->point;
}
/**
* @param string $address
*/
public function setAddress($address)
{
$this->address = $address;
}
/**
* @return string
*/
public function getAddress()
{
return $this->address;
}
}
We use the custom type ``point`` in the ``@Column`` docblock annotation of the
``$point`` field. We will create this custom mapping type in the next chapter.
The point class:
.. code-block:: php
<?php
namespace Geo\ValueObject;
class Point
{
/**
* @param float $latitude
* @param float $longitude
*/
public function __construct($latitude, $longitude)
{
$this->latitude = $latitude;
$this->longitude = $longitude;
}
/**
* @return float
*/
public function getLatitude()
{
return $this->latitude;
}
/**
* @return float
*/
public function getLongitude()
{
return $this->longitude;
}
}
The mapping type
----------------
Now we're going to create the ``point`` type and implement all required methods.
.. code-block:: php
<?php
namespace Geo\Types;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Geo\ValueObject\Point;
class PointType extends Type
{
const POINT = 'point';
public function getName()
{
return self::POINT;
}
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return 'POINT';
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
list($longitude, $latitude) = sscanf($value, 'POINT(%f %f)');
return new Point($latitude, $longitude);
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
if ($value instanceof Point) {
$value = sprintf('POINT(%F %F)', $value->getLongitude(), $value->getLatitude());
}
return $value;
}
public function canRequireSQLConversion()
{
return true;
}
public function convertToPHPValueSQL($sqlExpr, AbstractPlatform $platform)
{
return sprintf('AsText(%s)', $sqlExpr);
}
public function convertToDatabaseValueSQL($sqlExpr, AbstractPlatform $platform)
{
return sprintf('PointFromText(%s)', $sqlExpr);
}
}
We do a 2-step conversion here. In the first step, we convert the ``Point``
object into a string representation before saving to the database (in the
``convertToDatabaseValue`` method) and back into an object after fetching the
value from the database (in the ``convertToPHPValue`` method).
The format of the string representation format is called `Well-known text (WKT)
<http://en.wikipedia.org/wiki/Well-known_text>`_. The advantage of this format
is, that it is both human readable and parsable by MySQL.
Internally, MySQL stores geometry values in a binary format that is not
identical to the WKT format. So, we need to let MySQL transform the WKT
representation into its internal format.
This is where the ``convertToPHPValueSQL`` and ``convertToDatabaseValueSQL``
methods come into play.
This methods wrap a sql expression (the WKT representation of the Point) into
MySQL functions `PointFromText <http://dev.mysql.com/doc/refman/5.5/en/creating-spatial-values.html#function_pointfromtext>`_
and `AsText <http://dev.mysql.com/doc/refman/5.5/en/functions-to-convert-geometries-between-formats.html#function_astext>`_
which convert WKT strings to and from the internal format of MySQL.
.. note::
When using DQL queries, the ``convertToPHPValueSQL`` and
``convertToDatabaseValueSQL`` methods only apply to identification variables
and path expressions in SELECT clauses. Expressions in WHERE clauses are
**not** wrapped!
If you want to use Point values in WHERE clauses, you have to implement a
:doc:`user defined function <dql-user-defined-functions>` for
``PointFromText``.
Example usage
-------------
.. code-block:: php
<?php
// Bootstrapping stuff...
// $em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);
// Setup custom mapping type
use Doctrine\DBAL\Types\Type;
Type::addType('point', 'Geo\Types\PointType');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('point', 'point');
// Store a Location object
use Geo\Entity\Location;
use Geo\ValueObject\Point;
$location = new Location();
$location->setAddress('1600 Amphitheatre Parkway, Mountain View, CA');
$location->setPoint(new Point(37.4220761, -122.0845187));
$em->persist($location);
$em->flush();
$em->clear();
// Fetch the Location object
$query = $em->createQuery("SELECT l FROM Geo\Entity\Location WHERE l.address = '1600 Amphitheatre Parkway, Mountain View, CA'");
$location = $query->getSingleResult();
/* @var Geo\ValueObject\Point */
$point = $location->getPoint();

View File

@@ -0,0 +1,376 @@
Aggregate Fields
================
.. sectionauthor:: Benjamin Eberlei <kontakt@beberlei.de>
You will often come across the requirement to display aggregate
values of data that can be computed by using the MIN, MAX, COUNT or
SUM SQL functions. For any ORM this is a tricky issue
traditionally. Doctrine 2 offers several ways to get access to
these values and this article will describe all of them from
different perspectives.
You will see that aggregate fields can become very explicit
features in your domain model and how this potentially complex
business rules can be easily tested.
An example model
----------------
Say you want to model a bank account and all their entries. Entries
into the account can either be of positive or negative money
values. Each account has a credit limit and the account is never
allowed to have a balance below that value.
For simplicity we live in a world were money is composed of
integers only. Also we omit the receiver/sender name, stated reason
for transfer and the execution date. These all would have to be
added on the ``Entry`` object.
Our entities look like:
.. code-block:: php
<?php
namespace Bank\Entities;
/**
* @Entity
*/
class Account
{
/** @Id @GeneratedValue @Column(type="integer") */
private $id;
/** @Column(type="string", unique=true) */
private $no;
/**
* @OneToMany(targetEntity="Entry", mappedBy="account", cascade={"persist"})
*/
private $entries;
/**
* @Column(type="integer")
*/
private $maxCredit = 0;
public function __construct($no, $maxCredit = 0)
{
$this->no = $no;
$this->maxCredit = $maxCredit;
$this->entries = new \Doctrine\Common\Collections\ArrayCollection();
}
}
/**
* @Entity
*/
class Entry
{
/** @Id @GeneratedValue @Column(type="integer") */
private $id;
/**
* @ManyToOne(targetEntity="Account", inversedBy="entries")
*/
private $account;
/**
* @Column(type="integer")
*/
private $amount;
public function __construct($account, $amount)
{
$this->account = $account;
$this->amount = $amount;
// more stuff here, from/to whom, stated reason, execution date and such
}
public function getAmount()
{
return $this->amount;
}
}
Using DQL
---------
The Doctrine Query Language allows you to select for aggregate
values computed from fields of your Domain Model. You can select
the current balance of your account by calling:
.. code-block:: php
<?php
$dql = "SELECT SUM(e.amount) AS balance FROM Bank\Entities\Entry e " .
"WHERE e.account = ?1";
$balance = $em->createQuery($dql)
->setParameter(1, $myAccountId)
->getSingleScalarResult();
The ``$em`` variable in this (and forthcoming) example holds the
Doctrine ``EntityManager``. We create a query for the SUM of all
amounts (negative amounts are withdraws) and retrieve them as a
single scalar result, essentially return only the first column of
the first row.
This approach is simple and powerful, however it has a serious
drawback. We have to execute a specific query for the balance
whenever we need it.
To implement a powerful domain model we would rather have access to
the balance from our ``Account`` entity during all times (even if
the Account was not persisted in the database before!).
Also an additional requirement is the max credit per ``Account``
rule.
We cannot reliably enforce this rule in our ``Account`` entity with
the DQL retrieval of the balance. There are many different ways to
retrieve accounts. We cannot guarantee that we can execute the
aggregation query for all these use-cases, let alone that a
userland programmer checks this balance against newly added
entries.
Using your Domain Model
-----------------------
``Account`` and all the ``Entry`` instances are connected through a
collection, which means we can compute this value at runtime:
.. code-block:: php
<?php
class Account
{
// .. previous code
public function getBalance()
{
$balance = 0;
foreach ($this->entries as $entry) {
$balance += $entry->getAmount();
}
return $balance;
}
}
Now we can always call ``Account::getBalance()`` to access the
current account balance.
To enforce the max credit rule we have to implement the "Aggregate
Root" pattern as described in Eric Evans book on Domain Driven
Design. Described with one sentence, an aggregate root controls the
instance creation, access and manipulation of its children.
In our case we want to enforce that new entries can only added to
the ``Account`` by using a designated method. The ``Account`` is
the aggregate root of this relation. We can also enforce the
correctness of the bi-directional ``Account`` <-> ``Entry``
relation with this method:
.. code-block:: php
<?php
class Account
{
public function addEntry($amount)
{
$this->assertAcceptEntryAllowed($amount);
$e = new Entry($this, $amount);
$this->entries[] = $e;
return $e;
}
}
Now look at the following test-code for our entities:
.. code-block:: php
<?php
class AccountTest extends \PHPUnit_Framework_TestCase
{
public function testAddEntry()
{
$account = new Account("123456", $maxCredit = 200);
$this->assertEquals(0, $account->getBalance());
$account->addEntry(500);
$this->assertEquals(500, $account->getBalance());
$account->addEntry(-700);
$this->assertEquals(-200, $account->getBalance());
}
public function testExceedMaxLimit()
{
$account = new Account("123456", $maxCredit = 200);
$this->setExpectedException("Exception");
$account->addEntry(-1000);
}
}
To enforce our rule we can now implement the assertion in
``Account::addEntry``:
.. code-block:: php
<?php
class Account
{
private function assertAcceptEntryAllowed($amount)
{
$futureBalance = $this->getBalance() + $amount;
$allowedMinimalBalance = ($this->maxCredit * -1);
if ($futureBalance < $allowedMinimalBalance) {
throw new Exception("Credit Limit exceeded, entry is not allowed!");
}
}
}
We haven't talked to the entity manager for persistence of our
account example before. You can call
``EntityManager::persist($account)`` and then
``EntityManager::flush()`` at any point to save the account to the
database. All the nested ``Entry`` objects are automatically
flushed to the database also.
.. code-block:: php
<?php
$account = new Account("123456", 200);
$account->addEntry(500);
$account->addEntry(-200);
$em->persist($account);
$em->flush();
The current implementation has a considerable drawback. To get the
balance, we have to initialize the complete ``Account::$entries``
collection, possibly a very large one. This can considerably hurt
the performance of your application.
Using an Aggregate Field
------------------------
To overcome the previously mentioned issue (initializing the whole
entries collection) we want to add an aggregate field called
"balance" on the Account and adjust the code in
``Account::getBalance()`` and ``Account:addEntry()``:
.. code-block:: php
<?php
class Account
{
/**
* @Column(type="integer")
*/
private $balance = 0;
public function getBalance()
{
return $this->balance;
}
public function addEntry($amount)
{
$this->assertAcceptEntryAllowed($amount);
$e = new Entry($this, $amount);
$this->entries[] = $e;
$this->balance += $amount;
return $e;
}
}
This is a very simple change, but all the tests still pass. Our
account entities return the correct balance. Now calling the
``Account::getBalance()`` method will not occur the overhead of
loading all entries anymore. Adding a new Entry to the
``Account::$entities`` will also not initialize the collection
internally.
Adding a new entry is therefore very performant and explicitly
hooked into the domain model. It will only update the account with
the current balance and insert the new entry into the database.
Tackling Race Conditions with Aggregate Fields
----------------------------------------------
Whenever you denormalize your database schema race-conditions can
potentially lead to inconsistent state. See this example:
.. code-block:: php
<?php
// The Account $accId has a balance of 0 and a max credit limit of 200:
// request 1 account
$account1 = $em->find('Bank\Entities\Account', $accId);
// request 2 account
$account2 = $em->find('Bank\Entities\Account', $accId);
$account1->addEntry(-200);
$account2->addEntry(-200);
// now request 1 and 2 both flush the changes.
The aggregate field ``Account::$balance`` is now -200, however the
SUM over all entries amounts yields -400. A violation of our max
credit rule.
You can use both optimistic or pessimistic locking to save-guard
your aggregate fields against this kind of race-conditions. Reading
Eric Evans DDD carefully he mentions that the "Aggregate Root"
(Account in our example) needs a locking mechanism.
Optimistic locking is as easy as adding a version column:
.. code-block:: php
<?php
class Account
{
/** @Column(type="integer") @Version */
private $version;
}
The previous example would then throw an exception in the face of
whatever request saves the entity last (and would create the
inconsistent state).
Pessimistic locking requires an additional flag set on the
``EntityManager::find()`` call, enabling write locking directly in
the database using a FOR UPDATE.
.. code-block:: php
<?php
use Doctrine\DBAL\LockMode;
$account = $em->find('Bank\Entities\Account', $accId, LockMode::PESSIMISTIC_READ);
Keeping Updates and Deletes in Sync
-----------------------------------
The example shown in this article does not allow changes to the
value in ``Entry``, which considerably simplifies the effort to
keep ``Account::$balance`` in sync. If your use-case allows fields
to be updated or related entities to be removed you have to
encapsulate this logic in your "Aggregate Root" entity and adjust
the aggregate field accordingly.
Conclusion
----------
This article described how to obtain aggregate values using DQL or
your domain model. It showed how you can easily add an aggregate
field that offers serious performance benefits over iterating all
the related objects that make up an aggregate value. Finally I
showed how you can ensure that your aggregate fields do not get out
of sync due to race-conditions and concurrent access.

View File

@@ -0,0 +1,103 @@
Custom Mapping Types
====================
Doctrine allows you to create new mapping types. This can come in
handy when you're missing a specific mapping type or when you want
to replace the existing implementation of a mapping type.
In order to create a new mapping type you need to subclass
``Doctrine\DBAL\Types\Type`` and implement/override the methods as
you wish. Here is an example skeleton of such a custom type class:
.. code-block:: php
<?php
namespace My\Project\Types;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
/**
* My custom datatype.
*/
class MyType extends Type
{
const MYTYPE = 'mytype'; // modify to match your type name
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
// return the SQL used to create your column type. To create a portable column type, use the $platform.
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
// This is executed when the value is read from the database. Make your conversions here, optionally using the $platform.
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
// This is executed when the value is written to the database. Make your conversions here, optionally using the $platform.
}
public function getName()
{
return self::MYTYPE; // modify to match your constant name
}
}
.. note::
The following assumptions are applied to mapping types by the ORM:
- If the value of the field is *NULL* the method
``convertToDatabaseValue()`` is not called.
- The ``UnitOfWork`` never passes values to the database convert
method that did not change in the request.
- The ``UnitOfWork`` internally assumes that entity identifiers are
castable to string. Hence, when using custom types that map to PHP
objects as IDs, such objects must implement the ``__toString()`` magic
method.
When you have implemented the type you still need to let Doctrine
know about it. This can be achieved through the
``Doctrine\DBAL\Types\Type#addType($name, $className)``
method. See the following example:
.. code-block:: php
<?php
// in bootstrapping code
// ...
use Doctrine\DBAL\Types\Type;
// ...
// Register my type
Type::addType('mytype', 'My\Project\Types\MyType');
To convert the underlying database type of your
new "mytype" directly into an instance of ``MyType`` when performing
schema operations, the type has to be registered with the database
platform as well:
.. code-block:: php
<?php
$conn = $em->getConnection();
$conn->getDatabasePlatform()->registerDoctrineTypeMapping('db_mytype', 'mytype');
When registering the custom types in the configuration you specify a unique
name for the mapping type and map that to the corresponding fully qualified
class name. Now the new type can be used when mapping columns:
.. code-block:: php
<?php
class MyPersistentClass
{
/** @Column(type="mytype") */
private $field;
}

View File

@@ -0,0 +1,273 @@
Persisting the Decorator Pattern
================================
.. sectionauthor:: Chris Woodford <chris.woodford@gmail.com>
This recipe will show you a simple example of how you can use
Doctrine 2 to persist an implementation of the
`Decorator Pattern <http://en.wikipedia.org/wiki/Decorator_pattern>`_
Component
---------
The ``Component`` class needs to be persisted, so it's going to
be an ``Entity``. As the top of the inheritance hierarchy, it's going
to have to define the persistent inheritance. For this example, we
will use Single Table Inheritance, but Class Table Inheritance
would work as well. In the discriminator map, we will define two
concrete subclasses, ``ConcreteComponent`` and ``ConcreteDecorator``.
.. code-block:: php
<?php
namespace Test;
/**
* @Entity
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"cc" = "Test\Component\ConcreteComponent",
"cd" = "Test\Decorator\ConcreteDecorator"})
*/
abstract class Component
{
/**
* @Id @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
protected $id;
/** @Column(type="string", nullable=true) */
protected $name;
/**
* Get id
* @return integer $id
*/
public function getId()
{
return $this->id;
}
/**
* Set name
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* Get name
* @return string $name
*/
public function getName()
{
return $this->name;
}
}
ConcreteComponent
-----------------
The ``ConcreteComponent`` class is pretty simple and doesn't do much
more than extend the abstract ``Component`` class (only for the
purpose of keeping this example simple).
.. code-block:: php
<?php
namespace Test\Component;
use Test\Component;
/** @Entity */
class ConcreteComponent extends Component
{}
Decorator
---------
The ``Decorator`` class doesn't need to be persisted, but it does
need to define an association with a persisted ``Entity``. We can
use a ``MappedSuperclass`` for this.
.. code-block:: php
<?php
namespace Test;
/** @MappedSuperclass */
abstract class Decorator extends Component
{
/**
* @OneToOne(targetEntity="Test\Component", cascade={"all"})
* @JoinColumn(name="decorates", referencedColumnName="id")
*/
protected $decorates;
/**
* initialize the decorator
* @param Component $c
*/
public function __construct(Component $c)
{
$this->setDecorates($c);
}
/**
* (non-PHPdoc)
* @see Test.Component::getName()
*/
public function getName()
{
return 'Decorated ' . $this->getDecorates()->getName();
}
/**
* the component being decorated
* @return Component
*/
protected function getDecorates()
{
return $this->decorates;
}
/**
* sets the component being decorated
* @param Component $c
*/
protected function setDecorates(Component $c)
{
$this->decorates = $c;
}
}
All operations on the ``Decorator`` (i.e. persist, remove, etc) will
cascade from the ``Decorator`` to the ``Component``. This means that
when we persist a ``Decorator``, Doctrine will take care of
persisting the chain of decorated objects for us. A ``Decorator`` can
be treated exactly as a ``Component`` when it comes time to
persisting it.
The ``Decorator's`` constructor accepts an instance of a
``Component``, as defined by the ``Decorator`` pattern. The
setDecorates/getDecorates methods have been defined as protected to
hide the fact that a ``Decorator`` is decorating a ``Component`` and
keeps the ``Component`` interface and the ``Decorator`` interface
identical.
To illustrate the intended result of the ``Decorator`` pattern, the
getName() method has been overridden to append a string to the
``Component's`` getName() method.
ConcreteDecorator
-----------------
The final class required to complete a simple implementation of the
Decorator pattern is the ``ConcreteDecorator``. In order to further
illustrate how the ``Decorator`` can alter data as it moves through
the chain of decoration, a new field, "special", has been added to
this class. The getName() has been overridden and appends the value
of the getSpecial() method to its return value.
.. code-block:: php
<?php
namespace Test\Decorator;
use Test\Decorator;
/** @Entity */
class ConcreteDecorator extends Decorator
{
/** @Column(type="string", nullable=true) */
protected $special;
/**
* Set special
* @param string $special
*/
public function setSpecial($special)
{
$this->special = $special;
}
/**
* Get special
* @return string $special
*/
public function getSpecial()
{
return $this->special;
}
/**
* (non-PHPdoc)
* @see Test.Component::getName()
*/
public function getName()
{
return '[' . $this->getSpecial()
. '] ' . parent::getName();
}
}
Examples
--------
Here is an example of how to persist and retrieve your decorated
objects
.. code-block:: php
<?php
use Test\Component\ConcreteComponent,
Test\Decorator\ConcreteDecorator;
// assumes Doctrine 2 is configured and an instance of
// an EntityManager is available as $em
// create a new concrete component
$c = new ConcreteComponent();
$c->setName('Test Component 1');
$em->persist($c); // assigned unique ID = 1
// create a new concrete decorator
$c = new ConcreteComponent();
$c->setName('Test Component 2');
$d = new ConcreteDecorator($c);
$d->setSpecial('Really');
$em->persist($d);
// assigns c as unique ID = 2, and d as unique ID = 3
$em->flush();
$c = $em->find('Test\Component', 1);
$d = $em->find('Test\Component', 3);
echo get_class($c);
// prints: Test\Component\ConcreteComponent
echo $c->getName();
// prints: Test Component 1
echo get_class($d)
// prints: Test\Component\ConcreteDecorator
echo $d->getName();
// prints: [Really] Decorated Test Component 2

View File

@@ -0,0 +1,217 @@
Extending DQL in Doctrine 2: Custom AST Walkers
===============================================
.. sectionauthor:: Benjamin Eberlei <kontakt@beberlei.de>
The Doctrine Query Language (DQL) is a proprietary sql-dialect that
substitutes tables and columns for Entity names and their fields.
Using DQL you write a query against the database using your
entities. With the help of the metadata you can write very concise,
compact and powerful queries that are then translated into SQL by
the Doctrine ORM.
In Doctrine 1 the DQL language was not implemented using a real
parser. This made modifications of the DQL by the user impossible.
Doctrine 2 in contrast has a real parser for the DQL language,
which transforms the DQL statement into an
`Abstract Syntax Tree <http://en.wikipedia.org/wiki/Abstract_syntax_tree>`_
and generates the appropriate SQL statement for it. Since this
process is deterministic Doctrine heavily caches the SQL that is
generated from any given DQL query, which reduces the performance
overhead of the parsing process to zero.
You can modify the Abstract syntax tree by hooking into DQL parsing
process by adding a Custom Tree Walker. A walker is an interface
that walks each node of the Abstract syntax tree, thereby
generating the SQL statement.
There are two types of custom tree walkers that you can hook into
the DQL parser:
- An output walker. This one actually generates the SQL, and there
is only ever one of them. We implemented the default SqlWalker
implementation for it.
- A tree walker. There can be many tree walkers, they cannot
generate the sql, however they can modify the AST before its
rendered to sql.
Now this is all awfully technical, so let me come to some use-cases
fast to keep you motivated. Using walker implementation you can for
example:
- Modify the AST to generate a Count Query to be used with a
paginator for any given DQL query.
- Modify the Output Walker to generate vendor-specific SQL
(instead of ANSI).
- Modify the AST to add additional where clauses for specific
entities (example ACL, country-specific content...)
- Modify the Output walker to pretty print the SQL for debugging
purposes.
In this cookbook-entry I will show examples on the first two
points. There are probably much more use-cases.
Generic count query for pagination
----------------------------------
Say you have a blog and posts all with one category and one author.
A query for the front-page or any archive page might look something
like:
.. code-block:: sql
SELECT p, c, a FROM BlogPost p JOIN p.category c JOIN p.author a WHERE ...
Now in this query the blog post is the root entity, meaning its the
one that is hydrated directly from the query and returned as an
array of blog posts. In contrast the comment and author are loaded
for deeper use in the object tree.
A pagination for this query would want to approximate the number of
posts that match the WHERE clause of this query to be able to
predict the number of pages to show to the user. A draft of the DQL
query for pagination would look like:
.. code-block:: sql
SELECT count(DISTINCT p.id) FROM BlogPost p JOIN p.category c JOIN p.author a WHERE ...
Now you could go and write each of these queries by hand, or you
can use a tree walker to modify the AST for you. Lets see how the
API would look for this use-case:
.. code-block:: php
<?php
$pageNum = 1;
$query = $em->createQuery($dql);
$query->setFirstResult( ($pageNum-1) * 20)->setMaxResults(20);
$totalResults = Paginate::count($query);
$results = $query->getResult();
The ``Paginate::count(Query $query)`` looks like:
.. code-block:: php
<?php
class Paginate
{
static public function count(Query $query)
{
/* @var $countQuery Query */
$countQuery = clone $query;
$countQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('DoctrineExtensions\Paginate\CountSqlWalker'));
$countQuery->setFirstResult(null)->setMaxResults(null);
return $countQuery->getSingleScalarResult();
}
}
It clones the query, resets the limit clause first and max results
and registers the ``CountSqlWalker`` custom tree walker which
will modify the AST to execute a count query. The walkers
implementation is:
.. code-block:: php
<?php
class CountSqlWalker extends TreeWalkerAdapter
{
/**
* Walks down a SelectStatement AST node, thereby generating the appropriate SQL.
*
* @return string The SQL.
*/
public function walkSelectStatement(SelectStatement $AST)
{
$parent = null;
$parentName = null;
foreach ($this->_getQueryComponents() as $dqlAlias => $qComp) {
if ($qComp['parent'] === null && $qComp['nestingLevel'] == 0) {
$parent = $qComp;
$parentName = $dqlAlias;
break;
}
}
$pathExpression = new PathExpression(
PathExpression::TYPE_STATE_FIELD | PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION, $parentName,
$parent['metadata']->getSingleIdentifierFieldName()
);
$pathExpression->type = PathExpression::TYPE_STATE_FIELD;
$AST->selectClause->selectExpressions = array(
new SelectExpression(
new AggregateExpression('count', $pathExpression, true), null
)
);
}
}
This will delete any given select expressions and replace them with
a distinct count query for the root entities primary key. This will
only work if your entity has only one identifier field (composite
keys won't work).
Modify the Output Walker to generate Vendor specific SQL
--------------------------------------------------------
Most RMDBS have vendor-specific features for optimizing select
query execution plans. You can write your own output walker to
introduce certain keywords using the Query Hint API. A query hint
can be set via ``Query::setHint($name, $value)`` as shown in the
previous example with the ``HINT_CUSTOM_TREE_WALKERS`` query hint.
We will implement a custom Output Walker that allows to specify the
SQL\_NO\_CACHE query hint.
.. code-block:: php
<?php
$dql = "SELECT p, c, a FROM BlogPost p JOIN p.category c JOIN p.author a WHERE ...";
$query = $m->createQuery($dql);
$query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'DoctrineExtensions\Query\MysqlWalker');
$query->setHint("mysqlWalker.sqlNoCache", true);
$results = $query->getResult();
Our ``MysqlWalker`` will extend the default ``SqlWalker``. We will
modify the generation of the SELECT clause, adding the
SQL\_NO\_CACHE on those queries that need it:
.. code-block:: php
<?php
class MysqlWalker extends SqlWalker
{
/**
* Walks down a SelectClause AST node, thereby generating the appropriate SQL.
*
* @param $selectClause
* @return string The SQL.
*/
public function walkSelectClause($selectClause)
{
$sql = parent::walkSelectClause($selectClause);
if ($this->getQuery()->getHint('mysqlWalker.sqlNoCache') === true) {
if ($selectClause->isDistinct) {
$sql = str_replace('SELECT DISTINCT', 'SELECT DISTINCT SQL_NO_CACHE', $sql);
} else {
$sql = str_replace('SELECT', 'SELECT SQL_NO_CACHE', $sql);
}
}
return $sql;
}
}
Writing extensions to the Output Walker requires a very deep
understanding of the DQL Parser and Walkers, but may offer your
huge benefits with using vendor specific features. This would still
allow you write DQL queries instead of NativeQueries to make use of
vendor specific features.

View File

@@ -0,0 +1,251 @@
DQL User Defined Functions
==========================
.. sectionauthor:: Benjamin Eberlei <kontakt@beberlei.de>
By default DQL supports a limited subset of all the vendor-specific
SQL functions common between all the vendors. However in many cases
once you have decided on a specific database vendor, you will never
change it during the life of your project. This decision for a
specific vendor potentially allows you to make use of powerful SQL
features that are unique to the vendor.
It is worth to mention that Doctrine 2 also allows you to handwrite
your SQL instead of extending the DQL parser. Extending DQL is sort of an
advanced extension point. You can map arbitrary SQL to your objects
and gain access to vendor specific functionalities using the
``EntityManager#createNativeQuery()`` API as described in
the :doc:`Native Query <../reference/native-sql>` chapter.
The DQL Parser has hooks to register functions that can then be
used in your DQL queries and transformed into SQL, allowing to
extend Doctrines Query capabilities to the vendors strength. This
post explains the Used-Defined Functions API (UDF) of the Dql
Parser and shows some examples to give you some hints how you would
extend DQL.
There are three types of functions in DQL, those that return a
numerical value, those that return a string and those that return a
Date. Your custom method has to be registered as either one of
those. The return type information is used by the DQL parser to
check possible syntax errors during the parsing process, for
example using a string function return value in a math expression.
Registering your own DQL functions
----------------------------------
You can register your functions adding them to the ORM
configuration:
.. code-block:: php
<?php
$config = new \Doctrine\ORM\Configuration();
$config->addCustomStringFunction($name, $class);
$config->addCustomNumericFunction($name, $class);
$config->addCustomDatetimeFunction($name, $class);
$em = EntityManager::create($dbParams, $config);
The ``$name`` is the name the function will be referred to in the
DQL query. ``$class`` is a string of a class-name which has to
extend ``Doctrine\ORM\Query\Node\FunctionNode``. This is a class
that offers all the necessary API and methods to implement a UDF.
Instead of providing the function class name, you can also provide
a callable that returns the function object:
.. code-block:: php
<?php
$config = new \Doctrine\ORM\Configuration();
$config->addCustomStringFunction($name, function () {
return new MyCustomFunction();
});
In this post we will implement some MySql specific Date calculation
methods, which are quite handy in my opinion:
Date Diff
---------
`Mysql's DateDiff function <http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_datediff>`_
takes two dates as argument and calculates the difference in days
with ``date1-date2``.
The DQL parser is a top-down recursive descent parser to generate
the Abstract-Syntax Tree (AST) and uses a TreeWalker approach to
generate the appropriate SQL from the AST. This makes reading the
Parser/TreeWalker code manageable in a finite amount of time.
The ``FunctionNode`` class I referred to earlier requires you to
implement two methods, one for the parsing process (obviously)
called ``parse`` and one for the TreeWalker process called
``getSql()``. I show you the code for the DateDiff method and
discuss it step by step:
.. code-block:: php
<?php
/**
* DateDiffFunction ::= "DATEDIFF" "(" ArithmeticPrimary "," ArithmeticPrimary ")"
*/
class DateDiff extends FunctionNode
{
// (1)
public $firstDateExpression = null;
public $secondDateExpression = null;
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER); // (2)
$parser->match(Lexer::T_OPEN_PARENTHESIS); // (3)
$this->firstDateExpression = $parser->ArithmeticPrimary(); // (4)
$parser->match(Lexer::T_COMMA); // (5)
$this->secondDateExpression = $parser->ArithmeticPrimary(); // (6)
$parser->match(Lexer::T_CLOSE_PARENTHESIS); // (3)
}
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return 'DATEDIFF(' .
$this->firstDateExpression->dispatch($sqlWalker) . ', ' .
$this->secondDateExpression->dispatch($sqlWalker) .
')'; // (7)
}
}
The Parsing process of the DATEDIFF function is going to find two
expressions the date1 and the date2 values, whose AST Node
representations will be saved in the variables of the DateDiff
FunctionNode instance at (1).
The parse() method has to cut the function call "DATEDIFF" and its
argument into pieces. Since the parser detects the function using a
lookahead the T\_IDENTIFIER of the function name has to be taken
from the stack (2), followed by a detection of the arguments in
(4)-(6). The opening and closing parenthesis have to be detected
also. This happens during the Parsing process and leads to the
generation of a DateDiff FunctionNode somewhere in the AST of the
dql statement.
The ``ArithmeticPrimary`` method call is the most common
denominator of valid EBNF tokens taken from the
`DQL EBNF grammar <http://www.doctrine-project.org/documentation/manual/2_0/en/dql-doctrine-query-language#ebnf>`_
that matches our requirements for valid input into the DateDiff Dql
function. Picking the right tokens for your methods is a tricky
business, but the EBNF grammar is pretty helpful finding it, as is
looking at the Parser source code.
Now in the TreeWalker process we have to pick up this node and
generate SQL from it, which apparently is quite easy looking at the
code in (7). Since we don't know which type of AST Node the first
and second Date expression are we are just dispatching them back to
the SQL Walker to generate SQL from and then wrap our DATEDIFF
function call around this output.
Now registering this DateDiff FunctionNode with the ORM using:
.. code-block:: php
<?php
$config = new \Doctrine\ORM\Configuration();
$config->addCustomStringFunction('DATEDIFF', 'DoctrineExtensions\Query\MySql\DateDiff');
We can do fancy stuff like:
.. code-block:: sql
SELECT p FROM DoctrineExtensions\Query\BlogPost p WHERE DATEDIFF(CURRENT_TIME(), p.created) < 7
Date Add
--------
Often useful it the ability to do some simple date calculations in
your DQL query using
`MySql's DATE\_ADD function <http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-add>`_.
I'll skip the blah and show the code for this function:
.. code-block:: php
<?php
/**
* DateAddFunction ::=
* "DATE_ADD" "(" ArithmeticPrimary ", INTERVAL" ArithmeticPrimary Identifier ")"
*/
class DateAdd extends FunctionNode
{
public $firstDateExpression = null;
public $intervalExpression = null;
public $unit = null;
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->firstDateExpression = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_COMMA);
$parser->match(Lexer::T_IDENTIFIER);
$this->intervalExpression = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_IDENTIFIER);
/* @var $lexer Lexer */
$lexer = $parser->getLexer();
$this->unit = $lexer->token['value'];
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return 'DATE_ADD(' .
$this->firstDateExpression->dispatch($sqlWalker) . ', INTERVAL ' .
$this->intervalExpression->dispatch($sqlWalker) . ' ' . $this->unit .
')';
}
}
The only difference compared to the DATEDIFF here is, we
additionally need the ``Lexer`` to access the value of the
``T_IDENTIFIER`` token for the Date Interval unit, for example the
MONTH in:
.. code-block:: sql
SELECT p FROM DoctrineExtensions\Query\BlogPost p WHERE DATE_ADD(CURRENT_TIME(), INTERVAL 4 MONTH) > p.created
The above method now only supports the specification using
``INTERVAL``, to also allow a real date in DATE\_ADD we need to add
some decision logic to the parsing process (makes up for a nice
exercise).
Now as you see, the Parsing process doesn't catch all the possible
SQL errors, here we don't match for all the valid inputs for the
interval unit. However where necessary we rely on the database
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.
Conclusion
----------
Now that you all know how you can implement vendor specific SQL
functionalities in DQL, we would be excited to see user extensions
that add vendor specific function packages, for example more math
functions, XML + GIS Support, Hashing functions and so on.
For 2.0 we will come with the current set of functions, however for
a future version we will re-evaluate if we can abstract even more
vendor sql functions and extend the DQL languages scope.
Code for this Extension to DQL and other Doctrine Extensions can be
found
`in my Github DoctrineExtensions repository <http://github.com/beberlei/DoctrineExtensions>`_.

View File

@@ -0,0 +1,68 @@
Entities in the Session
=======================
There are several use-cases to save entities in the session, for example:
1. User object
2. Multi-step forms
To achieve this with Doctrine you have to pay attention to some details to get
this working.
Merging entity into an EntityManager
------------------------------------
In Doctrine an entity objects has to be "managed" by an EntityManager to be
updateable. Entities saved into the session are not managed in the next request
anymore. This means that you have to register these entities with an
EntityManager again if you want to change them or use them as part of
references between other entities. You can achieve this by calling
``EntityManager#merge()``.
For a representative User object the code to get turn an instance from
the session into a managed Doctrine object looks like this:
.. code-block:: php
<?php
require_once 'bootstrap.php';
$em = GetEntityManager(); // creates an EntityManager
session_start();
if (isset($_SESSION['user']) && $_SESSION['user'] instanceof User) {
$user = $_SESSION['user'];
$user = $em->merge($user);
}
.. note::
A frequent mistake is not to get the merged user object from the return
value of ``EntityManager#merge()``. The entity object passed to merge is
not necessarily the same object that is returned from the method.
Serializing entity into the session
-----------------------------------
Entities that are serialized into the session normally contain references to
other entities as well. Think of the user entity has a reference to his
articles, groups, photos or many other different entities. If you serialize
this object into the session then you don't want to serialize the related
entities as well. This is why you should call ``EntityManager#detach()`` on this
object or implement the __sleep() magic method on your entity.
.. code-block:: php
<?php
require_once 'bootstrap.php';
$em = GetEntityManager(); // creates an EntityManager
$user = $em->find("User", 1);
$em->detach($user);
$_SESSION['user'] = $user;
.. note::
When you called detach on your objects they get "unmanaged" with that
entity manager. This means you cannot use them as part of write operations
during ``EntityManager#flush()`` anymore in this request.

View File

@@ -0,0 +1,112 @@
Implementing ArrayAccess for Domain Objects
===========================================
.. sectionauthor:: Roman Borschel (roman@code-factory.org)
This recipe will show you how to implement ArrayAccess for your
domain objects in order to allow more uniform access, for example
in templates. In these examples we will implement ArrayAccess on a
`Layer Supertype <http://martinfowler.com/eaaCatalog/layerSupertype.html>`_
for all our domain objects.
Option 1
--------
In this implementation we will make use of PHPs highly dynamic
nature to dynamically access properties of a subtype in a supertype
at runtime. Note that this implementation has 2 main caveats:
- It will not work with private fields
- It will not go through any getters/setters
.. code-block:: php
<?php
abstract class DomainObject implements ArrayAccess
{
public function offsetExists($offset) {
return isset($this->$offset);
}
public function offsetSet($offset, $value) {
$this->$offset = $value;
}
public function offsetGet($offset) {
return $this->$offset;
}
public function offsetUnset($offset) {
$this->$offset = null;
}
}
Option 2
--------
In this implementation we will dynamically invoke getters/setters.
Again we use PHPs dynamic nature to invoke methods on a subtype
from a supertype at runtime. This implementation has the following
caveats:
- It relies on a naming convention
- The semantics of offsetExists can differ
- offsetUnset will not work with typehinted setters
.. code-block:: php
<?php
abstract class DomainObject implements ArrayAccess
{
public function offsetExists($offset) {
// In this example we say that exists means it is not null
$value = $this->{"get$offset"}();
return $value !== null;
}
public function offsetSet($offset, $value) {
$this->{"set$offset"}($value);
}
public function offsetGet($offset) {
return $this->{"get$offset"}();
}
public function offsetUnset($offset) {
$this->{"set$offset"}(null);
}
}
Read-only
---------
You can slightly tweak option 1 or option 2 in order to make array
access read-only. This will also circumvent some of the caveats of
each option. Simply make offsetSet and offsetUnset throw an
exception (i.e. BadMethodCallException).
.. code-block:: php
<?php
abstract class DomainObject implements ArrayAccess
{
public function offsetExists($offset) {
// option 1 or option 2
}
public function offsetSet($offset, $value) {
throw new BadMethodCallException("Array access of class " . get_class($this) . " is read-only!");
}
public function offsetGet($offset) {
// option 1 or option 2
}
public function offsetUnset($offset) {
throw new BadMethodCallException("Array access of class " . get_class($this) . " is read-only!");
}
}

View File

@@ -0,0 +1,72 @@
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 <http://martinfowler.com/eaaCatalog/layerSupertype.html>`_
for all our domain objects.
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\Common\NotifyPropertyChanged;
use Doctrine\Common\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 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

@@ -0,0 +1,78 @@
Implementing Wakeup or Clone
============================
.. sectionauthor:: Roman Borschel (roman@code-factory.org)
As explained in the
`restrictions for entity classes in the manual <http://www.doctrine-project.org/documentation/manual/2_0/en/architecture#entities>`_,
it is usually not allowed for an entity to implement ``__wakeup``
or ``__clone``, because Doctrine makes special use of them.
However, it is quite easy to make use of these methods in a safe
way by guarding the custom wakeup or clone code with an entity
identity check, as demonstrated in the following sections.
Safely implementing \_\_wakeup
------------------------------
To safely implement ``__wakeup``, simply enclose your
implementation code in an identity check as follows:
.. code-block:: php
<?php
class MyEntity
{
private $id; // This is the identifier of the entity.
//...
public function __wakeup()
{
// If the entity has an identity, proceed as normal.
if ($this->id) {
// ... Your code here as normal ...
}
// otherwise do nothing, do NOT throw an exception!
}
//...
}
Safely implementing \_\_clone
-----------------------------
Safely implementing ``__clone`` is pretty much the same:
.. code-block:: php
<?php
class MyEntity
{
private $id; // This is the identifier of the entity.
//...
public function __clone()
{
// If the entity has an identity, proceed as normal.
if ($this->id) {
// ... Your code here as normal ...
}
// otherwise do nothing, do NOT throw an exception!
}
//...
}
Summary
-------
As you have seen, it is quite easy to safely make use of
``__wakeup`` and ``__clone`` in your entities without adding any
really Doctrine-specific or Doctrine-dependant code.
These implementations are possible and safe because when Doctrine
invokes these methods, the entities never have an identity (yet).
Furthermore, it is possibly a good idea to check for the identity
in your code anyway, since it's rarely the case that you want to
unserialize or clone an entity with no identity.

View File

@@ -0,0 +1,140 @@
Integrating with CodeIgniter
============================
This is recipe for using Doctrine 2 in your
`CodeIgniter <http://www.codeigniter.com>`_ framework.
.. note::
This might not work for all CodeIgniter versions and may require
slight adjustments.
Here is how to set it up:
Make a CodeIgniter library that is both a wrapper and a bootstrap
for Doctrine 2.
Setting up the file structure
-----------------------------
Here are the steps:
- Add a php file to your system/application/libraries folder
called Doctrine.php. This is going to be your wrapper/bootstrap for
the D2 entity manager.
- Put the Doctrine folder (the one that contains Common, DBAL, and
ORM) inside that same libraries folder.
- Your system/application/libraries folder now looks like this:
system/applications/libraries -Doctrine -Doctrine.php -index.html
- If you want, open your config/autoload.php file and autoload
your Doctrine library.
<?php $autoload['libraries'] = array('doctrine');
Creating your Doctrine CodeIgniter library
------------------------------------------
Now, here is what your Doctrine.php file should look like.
Customize it to your needs.
.. code-block:: php
<?php
use Doctrine\Common\ClassLoader,
Doctrine\ORM\Configuration,
Doctrine\ORM\EntityManager,
Doctrine\Common\Cache\ArrayCache,
Doctrine\DBAL\Logging\EchoSQLLogger;
class Doctrine {
public $em = null;
public function __construct()
{
// load database configuration from CodeIgniter
require_once APPPATH.'config/database.php';
// Set up class loading. You could use different autoloaders, provided by your favorite framework,
// if you want to.
require_once APPPATH.'libraries/Doctrine/Common/ClassLoader.php';
$doctrineClassLoader = new ClassLoader('Doctrine', APPPATH.'libraries');
$doctrineClassLoader->register();
$entitiesClassLoader = new ClassLoader('models', rtrim(APPPATH, "/" ));
$entitiesClassLoader->register();
$proxiesClassLoader = new ClassLoader('Proxies', APPPATH.'models/proxies');
$proxiesClassLoader->register();
// Set up caches
$config = new Configuration;
$cache = new ArrayCache;
$config->setMetadataCacheImpl($cache);
$driverImpl = $config->newDefaultAnnotationDriver(array(APPPATH.'models/Entities'));
$config->setMetadataDriverImpl($driverImpl);
$config->setQueryCacheImpl($cache);
$config->setQueryCacheImpl($cache);
// Proxy configuration
$config->setProxyDir(APPPATH.'/models/proxies');
$config->setProxyNamespace('Proxies');
// Set up logger
$logger = new EchoSQLLogger;
$config->setSQLLogger($logger);
$config->setAutoGenerateProxyClasses( TRUE );
// Database connection information
$connectionOptions = array(
'driver' => 'pdo_mysql',
'user' => $db['default']['username'],
'password' => $db['default']['password'],
'host' => $db['default']['hostname'],
'dbname' => $db['default']['database']
);
// Create EntityManager
$this->em = EntityManager::create($connectionOptions, $config);
}
}
Please note that this is a development configuration; for a
production system you'll want to use a real caching system like
APC, get rid of EchoSqlLogger, and turn off
autoGenerateProxyClasses.
For more details, consult the
`Doctrine 2 Configuration documentation <http://www.doctrine-project.org/documentation/manual/2_0/en/configuration#configuration-options>`_.
Now to use it
-------------
Whenever you need a reference to the entity manager inside one of
your controllers, views, or models you can do this:
.. code-block:: php
<?php
$em = $this->doctrine->em;
That's all there is to it. Once you get the reference to your
EntityManager do your Doctrine 2.0 voodoo as normal.
Note: If you do not choose to autoload the Doctrine library, you
will need to put this line before you get a reference to it:
.. code-block:: php
<?php
$this->load->library('doctrine');
Good luck!

View File

@@ -0,0 +1,189 @@
Mysql Enums
===========
The type system of Doctrine 2 consists of flyweights, which means there is only
one instance of any given type. Additionally types do not contain state. Both
assumptions make it rather complicated to work with the Enum Type of MySQL that
is used quite a lot by developers.
When using Enums with a non-tweaked Doctrine 2 application you will get
errors from the Schema-Tool commands due to the unknown database type "enum".
By default Doctrine does not map the MySQL enum type to a Doctrine type.
This is because Enums contain state (their allowed values) and Doctrine
types don't.
This cookbook entry shows two possible solutions to work with MySQL enums.
But first a word of warning. The MySQL Enum type has considerable downsides:
- Adding new values requires to rebuild the whole table, which can take hours
depending on the size.
- Enums are ordered in the way the values are specified, not in their "natural" order.
- Enums validation mechanism for allowed values is not necessarily good,
specifying invalid values leads to an empty enum for the default MySQL error
settings. You can easily replicate the "allow only some values" requirement
in your Doctrine entities.
Solution 1: Mapping to Varchars
-------------------------------
You can map ENUMs to varchars. You can register MySQL ENUMs to map to Doctrine
varchars. This way Doctrine always resolves ENUMs to Doctrine varchars. It
will even detect this match correctly when using SchemaTool update commands.
.. code-block:: php
<?php
$conn = $em->getConnection();
$conn->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
In this case you have to ensure that each varchar field that is an enum in the
database only gets passed the allowed values. You can easily enforce this in your
entities:
.. code-block:: php
<?php
/** @Entity */
class Article
{
const STATUS_VISIBLE = 'visible';
const STATUS_INVISIBLE = 'invisible';
/** @Column(type="string") */
private $status;
public function setStatus($status)
{
if (!in_array($status, array(self::STATUS_VISIBLE, self::STATUS_INVISIBLE))) {
throw new \InvalidArgumentException("Invalid status");
}
$this->status = $status;
}
}
If you want to actively create enums through the Doctrine Schema-Tool by using
the **columnDefinition** attribute.
.. code-block:: php
<?php
/** @Entity */
class Article
{
/** @Column(type="string", columnDefinition="ENUM('visible', 'invisible')") */
private $status;
}
In this case however Schema-Tool update will have a hard time not to request changes for this column on each call.
Solution 2: Defining a Type
---------------------------
You can make a stateless ENUM type by creating a type class for each unique set of ENUM values.
For example for the previous enum type:
.. code-block:: php
<?php
namespace MyProject\DBAL;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
class EnumVisibilityType extends Type
{
const ENUM_VISIBILITY = 'enumvisibility';
const STATUS_VISIBLE = 'visible';
const STATUS_INVISIBLE = 'invisible';
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return "ENUM('visible', 'invisible') COMMENT '(DC2Type:enumvisibility)'";
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return $value;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
if (!in_array($value, array(self::STATUS_VISIBLE, self::STATUS_INVISIBLE))) {
throw new \InvalidArgumentException("Invalid status");
}
return $value;
}
public function getName()
{
return self::ENUM_VISIBILITY;
}
}
You can register this type with ``Type::addType('enumvisibility', 'MyProject\DBAL\EnumVisibilityType');``.
Then in your entity you can just use this type:
.. code-block:: php
<?php
/** @Entity */
class Article
{
/** @Column(type="enumvisibility") */
private $status;
}
You can generalize this approach easily to create a base class for enums:
.. code-block:: php
<?php
namespace MyProject\DBAL;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
abstract class EnumType extends Type
{
protected $name;
protected $values = array();
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
$values = array_map(function($val) { return "'".$val."'"; }, $this->values);
return "ENUM(".implode(", ", $values).") COMMENT '(DC2Type:".$this->name.")'";
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return $value;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
if (!in_array($value, $this->values)) {
throw new \InvalidArgumentException("Invalid '".$this->name."' value.");
}
return $value;
}
public function getName()
{
return $this->name;
}
}
With this base class you can define an enum as easily as:
.. code-block:: php
<?php
namespace MyProject\DBAL;
class EnumVisibilityType extends EnumType
{
protected $name = 'enumvisibility';
protected $values = array('visible', 'invisible');
}

View File

@@ -0,0 +1,142 @@
Keeping your Modules independent
=================================
.. versionadded:: 2.2
One of the goals of using modules is to create discrete units of functionality
that do not have many (if any) dependencies, allowing you to use that
functionality in other applications without including unnecessary items.
Doctrine 2.2 includes a new utility called the ``ResolveTargetEntityListener``,
that functions by intercepting certain calls inside Doctrine and rewrite
targetEntity parameters in your metadata mapping at runtime. It means that
in your bundle you are able to use an interface or abstract class in your
mappings and expect correct mapping to a concrete entity at runtime.
This functionality allows you to define relationships between different entities
but not making them hard dependencies.
Background
----------
In the following example, the situation is we have an `InvoiceModule`
which provides invoicing functionality, and a `CustomerModule` that
contains customer management tools. We want to keep these separated,
because they can be used in other systems without each other, but for
our application we want to use them together.
In this case, we have an ``Invoice`` entity with a relationship to a
non-existent object, an ``InvoiceSubjectInterface``. The goal is to get
the ``ResolveTargetEntityListener`` to replace any mention of the interface
with a real object that implements that interface.
Set up
------
We're going to use the following basic entities (which are incomplete
for brevity) to explain how to set up and use the RTEL.
A Customer entity
.. code-block:: php
<?php
// src/Acme/AppModule/Entity/Customer.php
namespace Acme\AppModule\Entity;
use Doctrine\ORM\Mapping as ORM;
use Acme\CustomerModule\Entity\Customer as BaseCustomer;
use Acme\InvoiceModule\Model\InvoiceSubjectInterface;
/**
* @ORM\Entity
* @ORM\Table(name="customer")
*/
class Customer extends BaseCustomer implements InvoiceSubjectInterface
{
// In our example, any methods defined in the InvoiceSubjectInterface
// are already implemented in the BaseCustomer
}
An Invoice entity
.. code-block:: php
<?php
// src/Acme/InvoiceModule/Entity/Invoice.php
namespace Acme\InvoiceModule\Entity;
use Doctrine\ORM\Mapping AS ORM;
use Acme\InvoiceModule\Model\InvoiceSubjectInterface;
/**
* Represents an Invoice.
*
* @ORM\Entity
* @ORM\Table(name="invoice")
*/
class Invoice
{
/**
* @ORM\ManyToOne(targetEntity="Acme\InvoiceModule\Model\InvoiceSubjectInterface")
* @var InvoiceSubjectInterface
*/
protected $subject;
}
An InvoiceSubjectInterface
.. code-block:: php
<?php
// src/Acme/InvoiceModule/Model/InvoiceSubjectInterface.php
namespace Acme\InvoiceModule\Model;
/**
* An interface that the invoice Subject object should implement.
* In most circumstances, only a single object should implement
* this interface as the ResolveTargetEntityListener can only
* change the target to a single object.
*/
interface InvoiceSubjectInterface
{
// List any additional methods that your InvoiceModule
// will need to access on the subject so that you can
// be sure that you have access to those methods.
/**
* @return string
*/
public function getName();
}
Next, we need to configure the listener. Add this to the area you set up Doctrine. You
must set this up in the way outlined below, otherwise you can not be guaranteed that
the targetEntity resolution will occur reliably:
.. code-block:: php
<?php
$evm = new \Doctrine\Common\EventManager;
$rtel = new \Doctrine\ORM\Tools\ResolveTargetEntityListener;
// Adds a target-entity class
$rtel->addResolveTargetEntity('Acme\\InvoiceModule\\Model\\InvoiceSubjectInterface', 'Acme\\CustomerModule\\Entity\\Customer', array());
// Add the ResolveTargetEntityListener
$evm->addEventListener(Doctrine\ORM\Events::loadClassMetadata, $rtel);
$em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config, $evm);
Final Thoughts
--------------
With the ``ResolveTargetEntityListener``, we are able to decouple our
bundles, keeping them usable by themselves, but still being able to
define relationships between different objects. By using this method,
I've found my bundles end up being easier to maintain independently.

View File

@@ -0,0 +1,84 @@
SQL-Table Prefixes
==================
This recipe is intended as an example of implementing a
loadClassMetadata listener to provide a Table Prefix option for
your application. The method used below is not a hack, but fully
integrates into the Doctrine system, all SQL generated will include
the appropriate table prefix.
In most circumstances it is desirable to separate different
applications into individual databases, but in certain cases, it
may be beneficial to have a table prefix for your Entities to
separate them from other vendor products in the same database.
Implementing the listener
-------------------------
The listener in this example has been set up with the
DoctrineExtensions namespace. You create this file in your
library/DoctrineExtensions directory, but will need to set up
appropriate autoloaders.
.. code-block:: php
<?php
namespace DoctrineExtensions;
use \Doctrine\ORM\Event\LoadClassMetadataEventArgs;
class TablePrefix
{
protected $prefix = '';
public function __construct($prefix)
{
$this->prefix = (string) $prefix;
}
public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
{
$classMetadata = $eventArgs->getClassMetadata();
if (!$classMetadata->isInheritanceTypeSingleTable() || $classMetadata->getName() === $classMetadata->rootEntityName) {
$classMetadata->setTableName($this->prefix . $classMetadata->getTableName());
}
foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) {
if ($mapping['type'] == \Doctrine\ORM\Mapping\ClassMetadataInfo::MANY_TO_MANY && $mapping['isOwningSide']) {
$mappedTableName = $mapping['joinTable']['name'];
$classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName;
}
}
}
}
Telling the EntityManager about our listener
--------------------------------------------
A listener of this type must be set up before the EntityManager has
been initialised, otherwise an Entity might be created or cached
before the prefix has been set.
.. note::
If you set this listener up, be aware that you will need
to clear your caches and drop then recreate your database schema.
.. code-block:: php
<?php
// $connectionOptions and $config set earlier
$evm = new \Doctrine\Common\EventManager;
// Table Prefix
$tablePrefix = new \DoctrineExtensions\TablePrefix('prefix_');
$evm->addEventListener(\Doctrine\ORM\Events::loadClassMetadata, $tablePrefix);
$em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config, $evm);

View File

@@ -0,0 +1,254 @@
Strategy-Pattern
================
This recipe will give you a short introduction on how to design
similar entities without using expensive (i.e. slow) inheritance
but with not more than \* the well-known strategy pattern \* event
listeners
Scenario / Problem
------------------
Given a Content-Management-System, we probably want to add / edit
some so-called "blocks" and "panels". What are they for?
- A block might be a registration form, some text content, a table
with information. A good example might also be a small calendar.
- A panel is by definition a block that can itself contain blocks.
A good example for a panel might be a sidebar box: You could easily
add a small calendar into it.
So, in this scenario, when building your CMS, you will surely add
lots of blocks and panels to your pages and you will find yourself
highly uncomfortable because of the following:
- Every existing page needs to know about the panels it contains -
therefore, you'll have an association to your panels. But if you've
got several types of panels - what do you do? Add an association to
every panel-type? This wouldn't be flexible. You might be tempted
to add an AbstractPanelEntity and an AbstractBlockEntity that use
class inheritance. Your page could then only confer to the
AbstractPanelType and Doctrine 2 would do the rest for you, i.e.
load the right entities. But - you'll for sure have lots of panels
and blocks, and even worse, you'd have to edit the discriminator
map *manually* every time you or another developer implements a new
block / entity. This would tear down any effort of modular
programming.
Therefore, we need something that's far more flexible.
Solution
--------
The solution itself is pretty easy. We will have one base class
that will be loaded via the page and that has specific behaviour -
a Block class might render the front-end and even the backend, for
example. Now, every block that you'll write might look different or
need different data - therefore, we'll offer an API to these
methods but internally, we use a strategy that exactly knows what
to do.
First of all, we need to make sure that we have an interface that
contains every needed action. Such actions would be rendering the
front-end or the backend, solving dependencies (blocks that are
supposed to be placed in the sidebar could refuse to be placed in
the middle of your page, for example).
Such an interface could look like this:
.. code-block:: php
<?php
/**
* This interface defines the basic actions that a block / panel needs to support.
*
* Every blockstrategy is *only* responsible for rendering a block and declaring some basic
* support, but *not* for updating its configuration etc. For this purpose, use controllers
* and models.
*/
interface BlockStrategyInterface {
/**
* This could configure your entity
*/
public function setConfig(Config\EntityConfig $config);
/**
* Returns the config this strategy is configured with.
* @return Core\Model\Config\EntityConfig
*/
public function getConfig();
/**
* Set the view object.
* @param \Zend_View_Interface $view
* @return \Zend_View_Helper_Interface
*/
public function setView(\Zend_View_Interface $view);
/**
* @return \Zend_View_Interface
*/
public function getView();
/**
* Renders this strategy. This method will be called when the user
* displays the site.
*
* @return string
*/
public function renderFrontend();
/**
* Renders the backend of this block. This method will be called when
* a user tries to reconfigure this block instance.
*
* Most of the time, this method will return / output a simple form which in turn
* calls some controllers.
*
* @return string
*/
public function renderBackend();
/**
* Returns all possible types of panels this block can be stacked onto
*
* @return array
*/
public function getRequiredPanelTypes();
/**
* Determines whether a Block is able to use a given type or not
* @param string $typeName The typename
* @return boolean
*/
public function canUsePanelType($typeName);
public function setBlockEntity(AbstractBlock $block);
public function getBlockEntity();
}
As you can see, we have a method "setBlockEntity" which ties a potential strategy to an object of type AbstractBlock. This type will simply define the basic behaviour of our blocks and could potentially look something like this:
.. code-block:: php
<?php
/**
* This is the base class for both Panels and Blocks.
* It shouldn't be extended by your own blocks - simply write a strategy!
*/
abstract class AbstractBlock {
/**
* The id of the block item instance
* This is a doctrine field, so you need to setup generation for it
* @var integer
*/
private $id;
// Add code for relation to the parent panel, configuration objects, ....
/**
* This var contains the classname of the strategy
* that is used for this blockitem. (This string (!) value will be persisted by Doctrine 2)
*
* This is a doctrine field, so make sure that you use an @column annotation or setup your
* yaml or xml files correctly
* @var string
*/
protected $strategyClassName;
/**
* This var contains an instance of $this->blockStrategy. Will not be persisted by Doctrine 2.
*
* @var BlockStrategyInterface
*/
protected $strategyInstance;
/**
* Returns the strategy that is used for this blockitem.
*
* The strategy itself defines how this block can be rendered etc.
*
* @return string
*/
public function getStrategyClassName() {
return $this->strategyClassName;
}
/**
* Returns the instantiated strategy
*
* @return BlockStrategyInterface
*/
public function getStrategyInstance() {
return $this->strategyInstance;
}
/**
* Sets the strategy this block / panel should work as. Make sure that you've used
* this method before persisting the block!
*
* @param BlockStrategyInterface $strategy
*/
public function setStrategy(BlockStrategyInterface $strategy) {
$this->strategyInstance = $strategy;
$this->strategyClassName = get_class($strategy);
$strategy->setBlockEntity($this);
}
Now, the important point is that $strategyClassName is a Doctrine 2
field, i.e. Doctrine will persist this value. This is only the
class name of your strategy and not an instance!
Finishing your strategy pattern, we hook into the Doctrine postLoad
event and check whether a block has been loaded. If so, you will
initialize it - i.e. get the strategies classname, create an
instance of it and set it via setStrategyBlock().
This might look like this:
.. code-block:: php
<?php
use \Doctrine\ORM,
\Doctrine\Common;
/**
* The BlockStrategyEventListener will initialize a strategy after the
* block itself was loaded.
*/
class BlockStrategyEventListener implements Common\EventSubscriber {
protected $view;
public function __construct(\Zend_View_Interface $view) {
$this->view = $view;
}
public function getSubscribedEvents() {
return array(ORM\Events::postLoad);
}
public function postLoad(ORM\Event\LifecycleEventArgs $args) {
$blockItem = $args->getEntity();
// Both blocks and panels are instances of Block\AbstractBlock
if ($blockItem instanceof Block\AbstractBlock) {
$strategy = $blockItem->getStrategyClassName();
$strategyInstance = new $strategy();
if (null !== $blockItem->getConfig()) {
$strategyInstance->setConfig($blockItem->getConfig());
}
$strategyInstance->setView($this->view);
$blockItem->setStrategy($strategyInstance);
}
}
}
In this example, even some variables are set - like a view object
or a specific configuration object.

View File

@@ -0,0 +1,137 @@
Validation of Entities
======================
.. sectionauthor:: Benjamin Eberlei <kontakt@beberlei.de>
Doctrine 2 does not ship with any internal validators, the reason
being that we think all the frameworks out there already ship with
quite decent ones that can be integrated into your Domain easily.
What we offer are hooks to execute any kind of validation.
.. note::
You don't need to validate your entities in the lifecycle
events. Its only one of many options. Of course you can also
perform validations in value setters or any other method of your
entities that are used in your code.
Entities can register lifecycle event methods with Doctrine that
are called on different occasions. For validation we would need to
hook into the events called before persisting and updating. Even
though we don't support validation out of the box, the
implementation is even simpler than in Doctrine 1 and you will get
the additional benefit of being able to re-use your validation in
any other part of your domain.
Say we have an ``Order`` with several ``OrderLine`` instances. We
never want to allow any customer to order for a larger sum than he
is allowed to:
.. code-block:: php
<?php
class Order
{
public function assertCustomerAllowedBuying()
{
$orderLimit = $this->customer->getOrderLimit();
$amount = 0;
foreach ($this->orderLines as $line) {
$amount += $line->getAmount();
}
if ($amount > $orderLimit) {
throw new CustomerOrderLimitExceededException();
}
}
}
Now this is some pretty important piece of business logic in your
code, enforcing it at any time is important so that customers with
a unknown reputation don't owe your business too much money.
We can enforce this constraint in any of the metadata drivers.
First Annotations:
.. code-block:: php
<?php
/**
* @Entity
* @HasLifecycleCallbacks
*/
class Order
{
/**
* @PrePersist @PreUpdate
*/
public function assertCustomerAllowedBuying() {}
}
In XML Mappings:
.. code-block:: xml
<doctrine-mapping>
<entity name="Order">
<lifecycle-callbacks>
<lifecycle-callback type="prePersist" method="assertCustomerallowedBuying" />
<lifecycle-callback type="preUpdate" method="assertCustomerallowedBuying" />
</lifecycle-callbacks>
</entity>
</doctrine-mapping>
YAML needs some little change yet, to allow multiple lifecycle
events for one method, this will happen before Beta 1 though.
Now validation is performed whenever you call
``EntityManager#persist($order)`` or when you call
``EntityManager#flush()`` and an order is about to be updated. Any
Exception that happens in the lifecycle callbacks will be cached by
the EntityManager and the current transaction is rolled back.
Of course you can do any type of primitive checks, not null,
email-validation, string size, integer and date ranges in your
validation callbacks.
.. code-block:: php
<?php
class Order
{
/**
* @PrePersist @PreUpdate
*/
public function validate()
{
if (!($this->plannedShipDate instanceof DateTime)) {
throw new ValidateException();
}
if ($this->plannedShipDate->format('U') < time()) {
throw new ValidateException();
}
if ($this->customer == null) {
throw new OrderRequiresCustomerException();
}
}
}
What is nice about lifecycle events is, you can also re-use the
methods at other places in your domain, for example in combination
with your form library. Additionally there is no limitation in the
number of methods you register on one particular event, i.e. you
can register multiple methods for validation in "PrePersist" or
"PreUpdate" or mix and share them in any combinations between those
two events.
There is no limit to what you can and can't validate in
"PrePersist" and "PreUpdate" as long as you don't create new entity
instances. This was already discussed in the previous blog post on
the Versionable extension, which requires another type of event
called "onFlush".
Further readings: :doc:`Lifecycle Events <../reference/events>`

View File

@@ -0,0 +1,168 @@
Working with DateTime Instances
===============================
There are many nitty gritty details when working with PHPs DateTime instances. You have know their inner
workings pretty well not to make mistakes with date handling. This cookbook entry holds several
interesting pieces of information on how to work with PHP DateTime instances in Doctrine 2.
DateTime changes are detected by Reference
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When calling ``EntityManager#flush()`` Doctrine computes the changesets of all the currently managed entities
and saves the differences to the database. In case of object properties (@Column(type="datetime") or @Column(type="object"))
these comparisons are always made **BY REFERENCE**. That means the following change will **NOT** be saved into the database:
.. code-block:: php
<?php
/** @Entity */
class Article
{
/** @Column(type="datetime") */
private $updated;
public function setUpdated()
{
// will NOT be saved in the database
$this->updated->modify("now");
}
}
The way to go would be:
.. code-block:: php
<?php
class Article
{
public function setUpdated()
{
// WILL be saved in the database
$this->updated = new \DateTime("now");
}
}
Default Timezone Gotcha
~~~~~~~~~~~~~~~~~~~~~~~
By default Doctrine assumes that you are working with a default timezone. Each DateTime instance that
is created by Doctrine will be assigned the timezone that is currently the default, either through
the ``date.timezone`` ini setting or by calling ``date_default_timezone_set()``.
This is very important to handle correctly if your application runs on different serves or is moved from one to another server
(with different timezone settings). You have to make sure that the timezone is the correct one
on all this systems.
Handling different Timezones with the DateTime Type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you first come across the requirement to save different you are still optimistic to manage this mess,
however let me crush your expectations fast. There is not a single database out there (supported by Doctrine 2)
that supports timezones correctly. Correctly here means that you can cover all the use-cases that
can come up with timezones. If you don't believe me you should read up on `Storing DateTime
in Databases <http://derickrethans.nl/storing-date-time-in-database.html>`_.
The problem is simple. Not a single database vendor saves the timezone, only the differences to UTC.
However with frequent daylight saving and political timezone changes you can have a UTC offset that moves
in different offset directions depending on the real location.
The solution for this dilemma is simple. Don't use timezones with DateTime and Doctrine 2. However there is a workaround
that even allows correct date-time handling with timezones:
1. Always convert any DateTime instance to UTC.
2. Only set Timezones for displaying purposes
3. Save the Timezone in the Entity for persistence.
Say we have an application for an international postal company and employees insert events regarding postal-package
around the world, in their current timezones. To determine the exact time an event occurred means to save both
the UTC time at the time of the booking and the timezone the event happened in.
.. code-block:: php
<?php
namespace DoctrineExtensions\DBAL\Types;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\ConversionException;
class UTCDateTimeType extends DateTimeType
{
static private $utc = null;
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
if ($value === null) {
return null;
}
return $value->format($platform->getDateTimeFormatString(),
(self::$utc) ? self::$utc : (self::$utc = new \DateTimeZone('UTC'))
);
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
if ($value === null) {
return null;
}
$val = \DateTime::createFromFormat(
$platform->getDateTimeFormatString(),
$value,
(self::$utc) ? self::$utc : (self::$utc = new \DateTimeZone('UTC'))
);
if (!$val) {
throw ConversionException::conversionFailed($value, $this->getName());
}
return $val;
}
}
This database type makes sure that every DateTime instance is always saved in UTC, relative
to the current timezone that the passed DateTime instance has. To be able to transform these values
back into their real timezone you have to save the timezone in a separate field of the entity
requiring timezoned datetimes:
.. code-block:: php
<?php
namespace Shipping;
/**
* @Entity
*/
class Event
{
/** @Column(type="datetime") */
private $created;
/** @Column(type="string") */
private $timezone;
/**
* @var bool
*/
private $localized = false;
public function __construct(\DateTime $createDate)
{
$this->localized = true;
$this->created = $createDate;
$this->timezone = $createDate->getTimeZone()->getName();
}
public function getCreated()
{
if (!$this->localized) {
$this->created->setTimeZone(new \DateTimeZone($this->timezone));
}
return $this->created;
}
}
This snippet makes use of the previously discussed "changeset by reference only" property of
objects. That means a new DateTime will only be used during updating if the reference
changes between retrieval and flush operation. This means we can easily go and modify
the instance by setting the previous local timezone.

131
docs/en/index.rst Normal file
View File

@@ -0,0 +1,131 @@
Welcome to Doctrine 2 ORM's documentation!
==========================================
The Doctrine documentation is comprised of tutorials, a reference section and
cookbook articles that explain different parts of the Object Relational mapper.
Doctrine DBAL and Doctrine Common both have their own documentation.
Getting Help
------------
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 <http://groups.google.com/group/doctrine-user>`_
- Internet Relay Chat (IRC) in #doctrine on Freenode
- Report a bug on `JIRA <http://www.doctrine-project.org/jira>`_.
- On `Twitter <https://twitter.com/search/%23doctrine2>`_ with ``#doctrine2``
- On `StackOverflow <http://stackoverflow.com/questions/tagged/doctrine2>`_
If you need more structure over the different topics you can browse the :doc:`table
of contents <toc>`.
Getting Started
---------------
* **Tutorial**:
:doc:`Getting Started with Doctrine <tutorials/getting-started>`
* **Setup**:
:doc:`Installation & Configuration <reference/configuration>`
Mapping Objects onto a Database
-------------------------------
* **Mapping**:
:doc:`Objects <reference/basic-mapping>` |
:doc:`Associations <reference/association-mapping>` |
:doc:`Inheritance <reference/inheritance-mapping>`
* **Drivers**:
:doc:`Docblock Annotations <reference/annotations-reference>` |
:doc:`XML <reference/xml-mapping>` |
:doc:`YAML <reference/yaml-mapping>` |
:doc:`PHP <reference/php-mapping>`
Working with Objects
--------------------
* **Basic Reference**:
:doc:`Entities <reference/working-with-objects>` |
:doc:`Associations <reference/working-with-associations>` |
:doc:`Events <reference/events>`
* **Query Reference**:
:doc:`DQL <reference/dql-doctrine-query-language>` |
:doc:`QueryBuilder <reference/query-builder>` |
:doc:`Native SQL <reference/native-sql>`
* **Internals**:
:doc:`Internals explained <reference/unitofwork>` |
:doc:`Associations <reference/unitofwork-associations>`
Advanced Topics
---------------
* :doc:`Architecture <reference/architecture>`
* :doc:`Advanced Configuration <reference/advanced-configuration>`
* :doc:`Limitations and known issues <reference/limitations-and-known-issues>`
* :doc:`Commandline Tools <reference/tools>`
* :doc:`Transactions and Concurrency <reference/transactions-and-concurrency>`
* :doc:`Filters <reference/filters>`
* :doc:`NamingStrategy <reference/namingstrategy>`
* :doc:`Improving Performance <reference/improving-performance>`
* :doc:`Caching <reference/caching>`
* :doc:`Partial Objects <reference/partial-objects>`
* :doc:`Change Tracking Policies <reference/change-tracking-policies>`
* :doc:`Best Practices <reference/best-practices>`
* :doc:`Metadata Drivers <reference/metadata-drivers>`
* :doc:`Batch Processing <reference/batch-processing>`
* :doc:`Second Level Cache <reference/second-level-cache>`
Tutorials
---------
* :doc:`Indexed associations <tutorials/working-with-indexed-associations>`
* :doc:`Extra Lazy Associations <tutorials/extra-lazy-associations>`
* :doc:`Composite Primary Keys <tutorials/composite-primary-keys>`
* :doc:`Ordered associations <tutorials/ordered-associations>`
* :doc:`Pagination <tutorials/pagination>`
* :doc:`Override Field/Association Mappings In Subclasses <tutorials/override-field-association-mappings-in-subclasses>`
* :doc:`Embeddables <tutorials/embeddables>`
Changelogs
----------
* :doc:`Migration to 2.5 <changelog/migration_2_5>`
Cookbook
--------
* **Patterns**:
:doc:`Aggregate Fields <cookbook/aggregate-fields>` |
:doc:`Decorator Pattern <cookbook/decorator-pattern>` |
:doc:`Strategy Pattern <cookbook/strategy-cookbook-introduction>`
* **DQL Extension Points**:
:doc:`DQL Custom Walkers <cookbook/dql-custom-walkers>` |
:doc:`DQL User-Defined-Functions <cookbook/dql-user-defined-functions>`
* **Implementation**:
:doc:`Array Access <cookbook/implementing-arrayaccess-for-domain-objects>` |
:doc:`Notify ChangeTracking Example <cookbook/implementing-the-notify-changetracking-policy>` |
:doc:`Using Wakeup Or Clone <cookbook/implementing-wakeup-or-clone>` |
:doc:`Working with DateTime <cookbook/working-with-datetime>` |
:doc:`Validation <cookbook/validation-of-entities>` |
:doc:`Entities in the Session <cookbook/entities-in-session>` |
:doc:`Keeping your Modules independent <cookbook/resolve-target-entity-listener>`
* **Integration into Frameworks/Libraries**
:doc:`CodeIgniter <cookbook/integrating-with-codeigniter>`
* **Hidden Gems**
:doc:`Prefixing Table Name <cookbook/sql-table-prefixes>`
* **Custom Datatypes**
:doc:`MySQL Enums <cookbook/mysql-enums>`
:doc:`Advanced Field Value Conversion <cookbook/advanced-field-value-conversion-using-custom-mapping-types>`
.. include:: toc.rst

113
docs/en/make.bat Normal file
View File

@@ -0,0 +1,113 @@
@ECHO OFF
REM Command file for Sphinx documentation
set SPHINXBUILD=sphinx-build
set BUILDDIR=_build
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
if NOT "%PAPER%" == "" (
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
)
if "%1" == "" goto help
if "%1" == "help" (
:help
echo.Please use `make ^<target^>` where ^<target^> is one of
echo. html to make standalone HTML files
echo. dirhtml to make HTML files named index.html in directories
echo. pickle to make pickle files
echo. json to make JSON files
echo. htmlhelp to make HTML files and a HTML help project
echo. qthelp to make HTML files and a qthelp project
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
echo. changes to make an overview over all changed/added/deprecated items
echo. linkcheck to check all external links for integrity
echo. doctest to run all doctests embedded in the documentation if enabled
goto end
)
if "%1" == "clean" (
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
del /q /s %BUILDDIR%\*
goto end
)
if "%1" == "html" (
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
goto end
)
if "%1" == "dirhtml" (
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
goto end
)
if "%1" == "pickle" (
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
echo.
echo.Build finished; now you can process the pickle files.
goto end
)
if "%1" == "json" (
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
echo.
echo.Build finished; now you can process the JSON files.
goto end
)
if "%1" == "htmlhelp" (
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
echo.
echo.Build finished; now you can run HTML Help Workshop with the ^
.hhp project file in %BUILDDIR%/htmlhelp.
goto end
)
if "%1" == "qthelp" (
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
echo.
echo.Build finished; now you can run "qcollectiongenerator" with the ^
.qhcp project file in %BUILDDIR%/qthelp, like this:
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Doctrine2ORM.qhcp
echo.To view the help file:
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Doctrine2ORM.ghc
goto end
)
if "%1" == "latex" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
echo.
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "changes" (
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
echo.
echo.The overview file is in %BUILDDIR%/changes.
goto end
)
if "%1" == "linkcheck" (
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
echo.
echo.Link check complete; look for any errors in the above output ^
or in %BUILDDIR%/linkcheck/output.txt.
goto end
)
if "%1" == "doctest" (
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
echo.
echo.Testing of doctests in the sources finished, look at the ^
results in %BUILDDIR%/doctest/output.txt.
goto end
)
:end

View File

@@ -0,0 +1,468 @@
Advanced Configuration
======================
The configuration of the EntityManager requires a
``Doctrine\ORM\Configuration`` instance as well as some database
connection parameters. This example shows all the potential
steps of configuration.
.. code-block:: php
<?php
use Doctrine\ORM\EntityManager,
Doctrine\ORM\Configuration;
// ...
if ($applicationMode == "development") {
$cache = new \Doctrine\Common\Cache\ArrayCache;
} else {
$cache = new \Doctrine\Common\Cache\ApcCache;
}
$config = new Configuration;
$config->setMetadataCacheImpl($cache);
$driverImpl = $config->newDefaultAnnotationDriver('/path/to/lib/MyProject/Entities');
$config->setMetadataDriverImpl($driverImpl);
$config->setQueryCacheImpl($cache);
$config->setProxyDir('/path/to/myproject/lib/MyProject/Proxies');
$config->setProxyNamespace('MyProject\Proxies');
if ($applicationMode == "development") {
$config->setAutoGenerateProxyClasses(true);
} else {
$config->setAutoGenerateProxyClasses(false);
}
$connectionOptions = array(
'driver' => 'pdo_sqlite',
'path' => 'database.sqlite'
);
$em = EntityManager::create($connectionOptions, $config);
.. note::
Do not use Doctrine without a metadata and query cache!
Doctrine is optimized for working with caches. The main
parts in Doctrine that are optimized for caching are the metadata
mapping information with the metadata cache and the DQL to SQL
conversions with the query cache. These 2 caches require only an
absolute minimum of memory yet they heavily improve the runtime
performance of Doctrine. The recommended cache driver to use with
Doctrine is `APC <http://www.php.net/apc>`_. APC provides you with
an opcode-cache (which is highly recommended anyway) and a very
fast in-memory cache storage that you can use for the metadata and
query caches as seen in the previous code snippet.
Configuration Options
---------------------
The following sections describe all the configuration options
available on a ``Doctrine\ORM\Configuration`` instance.
Proxy Directory (***REQUIRED***)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: php
<?php
$config->setProxyDir($dir);
$config->getProxyDir();
Gets or sets the directory where Doctrine generates any proxy
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***)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: php
<?php
$config->setProxyNamespace($namespace);
$config->getProxyNamespace();
Gets or sets the namespace to use for generated proxy classes. For
a detailed explanation on proxy classes and how they are used in
Doctrine, refer to the "Proxy Objects" section further down.
Metadata Driver (***REQUIRED***)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: php
<?php
$config->setMetadataDriverImpl($driver);
$config->getMetadataDriverImpl();
Gets or sets the metadata driver implementation that is used by
Doctrine to acquire the object-relational metadata for your
classes.
There are currently 4 available implementations:
- ``Doctrine\ORM\Mapping\Driver\AnnotationDriver``
- ``Doctrine\ORM\Mapping\Driver\XmlDriver``
- ``Doctrine\ORM\Mapping\Driver\YamlDriver``
- ``Doctrine\ORM\Mapping\Driver\DriverChain``
Throughout the most part of this manual the AnnotationDriver is
used in the examples. For information on the usage of the XmlDriver
or YamlDriver please refer to the dedicated chapters
``XML Mapping`` and ``YAML Mapping``.
The annotation driver can be configured with a factory method on
the ``Doctrine\ORM\Configuration``:
.. code-block:: php
<?php
$driverImpl = $config->newDefaultAnnotationDriver('/path/to/lib/MyProject/Entities');
$config->setMetadataDriverImpl($driverImpl);
The path information to the entities is required for the annotation
driver, because otherwise mass-operations on all entities through
the console could not work correctly. All of metadata drivers
accept either a single directory as a string or an array of
directories. With this feature a single driver can support multiple
directories of Entities.
Metadata Cache (***RECOMMENDED***)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: php
<?php
$config->setMetadataCacheImpl($cache);
$config->getMetadataCacheImpl();
Gets or sets the cache implementation to use for caching metadata
information, that is, all the information you supply via
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
``Doctrine\Common\Cache\Cache`` interface.
Usage of a metadata cache is highly recommended.
The recommended implementations for production are:
- ``Doctrine\Common\Cache\ApcCache``
- ``Doctrine\Common\Cache\MemcacheCache``
- ``Doctrine\Common\Cache\XcacheCache``
- ``Doctrine\Common\Cache\RedisCache``
For development you should use the
``Doctrine\Common\Cache\ArrayCache`` which only caches data on a
per-request basis.
Query Cache (***RECOMMENDED***)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: php
<?php
$config->setQueryCacheImpl($cache);
$config->getQueryCacheImpl();
Gets or sets the cache implementation to use for caching DQL
queries, that is, the result of a DQL parsing process that includes
the final SQL as well as meta information about how to process the
SQL result set of a query. Note that the query cache does not
affect query results. You do not get stale data. This is a pure
optimization cache without any negative side-effects (except some
minimal memory usage in your cache).
Usage of a query cache is highly recommended.
The recommended implementations for production are:
- ``Doctrine\Common\Cache\ApcCache``
- ``Doctrine\Common\Cache\MemcacheCache``
- ``Doctrine\Common\Cache\XcacheCache``
- ``Doctrine\Common\Cache\RedisCache``
For development you should use the
``Doctrine\Common\Cache\ArrayCache`` which only caches data on a
per-request basis.
SQL Logger (***Optional***)
~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: php
<?php
$config->setSQLLogger($logger);
$config->getSQLLogger();
Gets or sets the logger to use for logging all SQL statements
executed by Doctrine. The logger class must implement the
``Doctrine\DBAL\Logging\SQLLogger`` interface. A simple default
implementation that logs to the standard output using ``echo`` and
``var_dump`` can be found at
``Doctrine\DBAL\Logging\EchoSQLLogger``.
Auto-generating Proxy Classes (***OPTIONAL***)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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:
.. code-block:: php
<?php
$config->setAutoGenerateProxyClasses($mode);
Possible values for ``$mode`` are:
- ``Doctrine\Common\Proxy\AbstractProxyFactory::AUTOGENERATE_NEVER``
Never autogenerate a proxy. You will need to generate the proxies
manually, for this use the Doctrine Console like so:
.. code-block:: php
$ ./doctrine orm:generate-proxies
When you do this in a development environment,
be aware that you may get class/file not found errors if certain proxies
are not yet generated. You may also get failing lazy-loads if new
methods were added to the entity class that are not yet in the proxy class.
In such a case, simply use the Doctrine Console to (re)generate the
proxy classes.
- ``Doctrine\Common\Proxy\AbstractProxyFactory::AUTOGENERATE_ALWAYS``
Always generates a new proxy in every request and writes it to disk.
- ``Doctrine\Common\Proxy\AbstractProxyFactory::AUTOGENERATE_FILE_NOT_EXISTS``
Generate the proxy class when the proxy file does not exist.
This strategy causes a file exists call whenever any proxy is
used the first time in a request.
- ``Doctrine\Common\Proxy\AbstractProxyFactory::AUTOGENERATE_EVAL``
Generate the proxy classes and evaluate them on the fly via eval(),
avoiding writing the proxies to disk.
This strategy is only sane for development.
In a production environment, it is highly recommended to use
AUTOGENERATE_NEVER to allow for optimal performances. The other
options are interesting in development environment.
Before v2.4, ``setAutoGenerateProxyClasses`` would accept a boolean
value. This is still possible, ``FALSE`` being equivalent to
AUTOGENERATE_NEVER and ``TRUE`` to AUTOGENERATE_ALWAYS.
Development vs Production Configuration
---------------------------------------
You should code your Doctrine2 bootstrapping with two different
runtime models in mind. There are some serious benefits of using
APC or Memcache in production. In development however this will
frequently give you fatal errors, when you change your entities and
the cache still keeps the outdated metadata. That is why we
recommend the ``ArrayCache`` for development.
Furthermore you should have the Auto-generating Proxy Classes
option to true in development and to false in production. If this
option is set to ``TRUE`` it can seriously hurt your script
performance if several proxy classes are re-generated during script
execution. Filesystem calls of that magnitude can even slower than
all the database queries Doctrine issues. Additionally writing a
proxy sets an exclusive file lock which can cause serious
performance bottlenecks in systems with regular concurrent
requests.
Connection Options
------------------
The ``$connectionOptions`` passed as the first argument to
``EntityManager::create()`` has to be either an array or an
instance of ``Doctrine\DBAL\Connection``. If an array is passed it
is directly passed along to the DBAL Factory
``Doctrine\DBAL\DriverManager::getConnection()``. The DBAL
configuration is explained in the
`DBAL section <./../../../../../projects/doctrine-dbal/en/latest/reference/configuration.html>`_.
Proxy Objects
-------------
A proxy object is an object that is put in place or used instead of
the "real" object. A proxy object can add behavior to the object
being proxied without that object being aware of it. In Doctrine 2,
proxy objects are used to realize several features but mainly for
transparent lazy-loading.
Proxy objects with their lazy-loading facilities help to keep the
subset of objects that are already in memory connected to the rest
of the objects. This is an essential property as without it there
would always be fragile partial objects at the outer edges of your
object graph.
Doctrine 2 implements a variant of the proxy pattern where it
generates classes that extend your entity classes and adds
lazy-loading capabilities to them. Doctrine can then give you an
instance of such a proxy class whenever you request an object of
the class being proxied. This happens in two situations:
Reference Proxies
~~~~~~~~~~~~~~~~~
The method ``EntityManager#getReference($entityName, $identifier)``
lets you obtain a reference to an entity for which the identifier
is known, without loading that entity from the database. This is
useful, for example, as a performance enhancement, when you want to
establish an association to an entity for which you have the
identifier. You could simply do this:
.. code-block:: php
<?php
// $em instanceof EntityManager, $cart instanceof MyProject\Model\Cart
// $itemId comes from somewhere, probably a request parameter
$item = $em->getReference('MyProject\Model\Item', $itemId);
$cart->addItem($item);
Here, we added an Item to a Cart without loading the Item from the
database. If you invoke any method on the Item instance, it would
fully initialize its state transparently from the database. Here
$item is actually an instance of the proxy class that was generated
for the Item class but your code does not need to care. In fact it
**should not care**. Proxy objects should be transparent to your
code.
Association proxies
~~~~~~~~~~~~~~~~~~~
The second most important situation where Doctrine uses proxy
objects is when querying for objects. Whenever you query for an
object that has a single-valued association to another object that
is configured LAZY, without joining that association in the same
query, Doctrine puts proxy objects in place where normally the
associated object would be. Just like other proxies it will
transparently initialize itself on first access.
.. note::
Joining an association in a DQL or native query
essentially means eager loading of that association in that query.
This will override the 'fetch' option specified in the mapping for
that association, but only for that query.
Generating Proxy classes
~~~~~~~~~~~~~~~~~~~~~~~~
In a production environment, it is highly recommended to use
``AUTOGENERATE_NEVER`` to allow for optimal performances.
However you will be required to generate the proxies manually
using the Doctrine Console:
.. code-block:: php
$ ./doctrine orm:generate-proxies
The other options are interesting in development environment:
- ``AUTOGENERATE_ALWAYS`` will require you to create and configure
a proxy directory. Proxies will be generated and written to file
on each request, so any modification to your code will be acknowledged.
- ``AUTOGENERATE_FILE_NOT_EXISTS`` will not overwrite an existing
proxy file. If your code changes, you will need to regenerate the
proxies manually.
- ``AUTOGENERATE_EVAL`` will regenerate each proxy on each request,
but without writing them to disk.
Autoloading Proxies
-------------------
When you deserialize proxy objects from the session or any other storage
it is necessary to have an autoloading mechanism in place for these classes.
For implementation reasons Proxy class names are not PSR-0 compliant. This
means that you have to register a special autoloader for these classes:
.. code-block:: php
<?php
use Doctrine\ORM\Proxy\Autoloader;
$proxyDir = "/path/to/proxies";
$proxyNamespace = "MyProxies";
Autoloader::register($proxyDir, $proxyNamespace);
If you want to execute additional logic to intercept the proxy file not found
state you can pass a closure as the third argument. It will be called with
the arguments proxydir, namespace and className when the proxy file could not
be found.
Multiple Metadata Sources
-------------------------
When using different components using Doctrine 2 you may end up
with them using two different metadata drivers, for example XML and
YAML. You can use the DriverChain Metadata implementations to
aggregate these drivers based on namespaces:
.. code-block:: php
<?php
use Doctrine\ORM\Mapping\Driver\DriverChain;
$chain = new DriverChain();
$chain->addDriver($xmlDriver, 'Doctrine\Tests\Models\Company');
$chain->addDriver($yamlDriver, '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
the fact that the driver loops through all namespaces and matches
the entity class name against the namespace using a
``strpos() === 0`` call. This means you need to order the drivers
correctly if sub-namespaces use different metadata driver
implementations.
Default Repository (***OPTIONAL***)
-----------------------------------
Specifies the FQCN of a subclass of the EntityRepository.
That will be available for all entities without a custom repository class.
.. code-block:: php
<?php
$config->setDefaultRepositoryClassName($fqcn);
$config->getDefaultRepositoryClassName();
The default value is ``Doctrine\ORM\EntityRepository``.
Any repository class must be a subclass of EntityRepository otherwise you got an ORMException
Setting up the Console
----------------------
Doctrine uses the Symfony Console component for generating the command
line interface. You can take a look at the ``vendor/bin/doctrine.php``
script and the ``Doctrine\ORM\Tools\Console\ConsoleRunner`` command
for inspiration how to setup the cli.
In general the required code looks like this:
.. code-block:: php
<?php
$cli = new Application('Doctrine Command Line Interface', \Doctrine\ORM\Version::VERSION);
$cli->setCatchExceptions(true);
$cli->setHelperSet($helperSet);
Doctrine\ORM\Tools\Console\ConsoleRunner::addCommands($cli);
$cli->run();

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,197 @@
Architecture
============
This chapter gives an overview of the overall architecture,
terminology and constraints of Doctrine 2. It is recommended to
read this chapter carefully.
Using an Object-Relational Mapper
---------------------------------
As the term ORM already hints at, Doctrine 2 aims to simplify the
translation between database rows and the PHP object model. The
primary use case for Doctrine are therefore applications that
utilize the Object-Oriented Programming Paradigm. For applications
that do not primarily work with objects Doctrine 2 is not suited very
well.
Requirements
------------
Doctrine 2 requires a minimum of PHP 5.4. For greatly improved
performance it is also recommended that you use APC with PHP.
Doctrine 2 Packages
-------------------
Doctrine 2 is divided into three main packages.
- Common
- DBAL (includes Common)
- ORM (includes DBAL+Common)
This manual mainly covers the ORM package, sometimes touching parts
of the underlying DBAL and Common packages. The Doctrine code base
is split in to these packages for a few reasons and they are to...
- ...make things more maintainable and decoupled
- ...allow you to use the code in Doctrine Common without the ORM
or DBAL
- ...allow you to use the DBAL without the ORM
The Common Package
~~~~~~~~~~~~~~~~~~
The Common package contains highly reusable components that have no
dependencies beyond the package itself (and PHP, of course). The
root namespace of the Common package is ``Doctrine\Common``.
The DBAL Package
~~~~~~~~~~~~~~~~
The DBAL package contains an enhanced database abstraction layer on
top of PDO but is not strongly bound to PDO. The purpose of this
layer is to provide a single API that bridges most of the
differences between the different RDBMS vendors. The root namespace
of the DBAL package is ``Doctrine\DBAL``.
The ORM Package
~~~~~~~~~~~~~~~
The ORM package contains the object-relational mapping toolkit that
provides transparent relational persistence for plain PHP objects.
The root namespace of the ORM package is ``Doctrine\ORM``.
Terminology
-----------
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 or contain final methods.
- All persistent properties/field of any entity class should
always be private or protected, otherwise lazy-loading might not
work as expected. In case you serialize entities (for example Session)
properties should be protected (See Serialize section below).
- An entity class must not implement ``__clone`` or
:doc:`do so safely <../cookbook/implementing-wakeup-or-clone>`.
- An entity class must not implement ``__wakeup`` or
:doc:`do so safely <../cookbook/implementing-wakeup-or-clone>`.
Also consider implementing
`Serializable <http://php.net/manual/en/class.serializable.php>`_
instead.
- 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
must not have a mapped field with the same name as an already
mapped field that is inherited from A.
- An entity cannot make use of func_get_args() to implement variable parameters.
Generated proxies do not support this for performance reasons and your code might
actually fail to work when violating this restriction.
Entities support inheritance, polymorphic associations, and
polymorphic queries. Both abstract and concrete classes can be
entities. Entities may extend non-entity classes as well as entity
classes, and non-entity classes may extend entity classes.
.. note::
The constructor of an entity is only ever invoked when
*you* construct a new instance with the *new* keyword. Doctrine
never calls entity constructors, thus you are free to use them as
you wish and even have it require arguments of any type.
Entity states
~~~~~~~~~~~~~
An entity instance can be characterized as being NEW, MANAGED,
DETACHED or REMOVED.
- A NEW entity instance has no persistent identity, and is not yet
associated with an EntityManager and a UnitOfWork (i.e. those just
created with the "new" operator).
- A MANAGED entity instance is an instance with a persistent
identity that is associated with an EntityManager and whose
persistence is thus managed.
- A DETACHED entity instance is an instance with a persistent
identity that is not (or no longer) associated with an
EntityManager and a UnitOfWork.
- A REMOVED entity instance is an instance with a persistent
identity, associated with an EntityManager, that will be removed
from the database upon transaction commit.
.. _architecture_persistent_fields:
Persistent fields
~~~~~~~~~~~~~~~~~
The persistent state of an entity is represented by instance
variables. An instance variable must be directly accessed only from
within the methods of the entity by the entity instance itself.
Instance variables must not be accessed by clients of the entity.
The state of the entity is available to clients only through the
entitys methods, i.e. accessor methods (getter/setter methods) or
other business methods.
Collection-valued persistent fields and properties must be defined
in terms of the ``Doctrine\Common\Collections\Collection``
interface. The collection implementation type may be used by the
application to initialize fields or properties before the entity is
made persistent. Once the entity becomes managed (or detached),
subsequent access must be through the interface type.
Serializing entities
~~~~~~~~~~~~~~~~~~~~
Serializing entities can be problematic and is not really
recommended, at least not as long as an entity instance still holds
references to proxy objects or is still managed by an
EntityManager. If you intend to serialize (and unserialize) entity
instances that still hold references to proxy objects you may run
into problems with private properties because of technical
limitations. Proxy objects implement ``__sleep`` and it is not
possible for ``__sleep`` to return names of private properties in
parent classes. On the other hand it is not a solution for proxy
objects to implement ``Serializable`` because Serializable does not
work well with any potential cyclic object references (at least we
did not find a way yet, if you did, please contact us).
The EntityManager
~~~~~~~~~~~~~~~~~
The ``EntityManager`` class is a central access point to the ORM
functionality provided by Doctrine 2. The ``EntityManager`` API is
used to manage the persistence of your objects and to query for
persistent objects.
Transactional write-behind
~~~~~~~~~~~~~~~~~~~~~~~~~~
An ``EntityManager`` and the underlying ``UnitOfWork`` employ a
strategy called "transactional write-behind" that delays the
execution of SQL statements in order to execute them in the most
efficient way and to execute them at the end of a transaction so
that all write locks are quickly released. You should see Doctrine
as a tool to synchronize your in-memory objects with the database
in well defined units of work. Work with your objects and modify
them as usual and when you're done call ``EntityManager#flush()``
to make your changes persistent.
The Unit of Work
~~~~~~~~~~~~~~~~
Internally an ``EntityManager`` uses a ``UnitOfWork``, which is a
typical implementation of the
`Unit of Work pattern <http://martinfowler.com/eaaCatalog/unitOfWork.html>`_,
to keep track of all the things that need to be done the next time
``flush`` is invoked. You usually do not directly interact with a
``UnitOfWork`` but with the ``EntityManager`` instead.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,499 @@
Basic Mapping
=============
This guide explains the basic mapping of entities and properties.
After working through this guide you should know:
- How to create PHP objects that can be saved to the database with Doctrine;
- How to configure the mapping between columns on tables and properties on
entities;
- What Doctrine mapping types are;
- Defining primary keys and how identifiers are generated by Doctrine;
- How quoting of reserved symbols works in Doctrine.
Mapping of associations will be covered in the next chapter on
:doc:`Association Mapping <association-mapping>`.
Guide Assumptions
-----------------
You should have already :doc:`installed and configure <configuration>`
Doctrine.
Creating Classes for the Database
---------------------------------
Every PHP object that you want to save in the database using Doctrine
is called an "Entity". The term "Entity" describes objects
that have an identity over many independent requests. This identity is
usually achieved by assigning a unique identifier to an entity.
In this tutorial the following ``Message`` PHP class will serve as the
example Entity:
.. code-block:: php
<?php
class Message
{
private $id;
private $text;
private $postedAt;
}
Because Doctrine is a generic library, it only knows about your
entities because you will describe their existence and structure using
mapping metadata, which is configuration that tells Doctrine how your
entity should be stored in the database. The documentation will often
speak of "mapping something", which means writing the mapping metadata
that describes your entity.
Doctrine provides several different ways to specify object-relational
mapping metadata:
- :doc:`Docblock Annotations <annotations-reference>`
- :doc:`XML <xml-mapping>`
- :doc:`YAML <yaml-mapping>`
- :doc:`PHP code <php-mapping>`
This manual will usually show mapping metadata via docblock annotations, though
many examples also show the equivalent configuration in YAML and XML.
.. note::
All metadata drivers perform equally. Once the metadata of a class has been
read from the source (annotations, xml or yaml) it is stored in an instance
of the ``Doctrine\ORM\Mapping\ClassMetadata`` class and these instances are
stored in the metadata cache. If you're not using a metadata cache (not
recommended!) then the XML driver is the fastest.
Marking our ``Message`` class as an entity for Doctrine is straightforward:
.. configuration-block::
.. code-block:: php
<?php
/** @Entity */
class Message
{
//...
}
.. code-block:: xml
<doctrine-mapping>
<entity name="Message">
<!-- ... -->
</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:
.. configuration-block::
.. code-block:: php
<?php
/**
* @Entity
* @Table(name="message")
*/
class Message
{
//...
}
.. code-block:: xml
<doctrine-mapping>
<entity name="Message" table="message">
<!-- ... -->
</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
----------------
The next step after marking a PHP class as an entity is mapping its properties
to columns in a table.
To configure a property use the ``@Column`` docblock annotation. The ``type``
attribute specifies the :ref:`Doctrine Mapping Type <reference-mapping-types>`
to use for the field. If the type is not specified, ``string`` is used as the
default.
.. configuration-block::
.. code-block:: php
<?php
/** @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>
<entity name="Message">
<field name="id" type="integer" />
<field name="text" length="140" />
<field name="postedAt" column="posted_at" type="datetime" />
</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. This means that:
* the ``id`` property will map to the column ``id`` using the type ``integer``;
* the ``text`` property will map to the column ``text`` with the default mapping type ``string``;
* the ``postedAt`` property will map to the ``posted_at`` column with the ``datetime`` type.
The Column annotation has some more attributes. Here is a complete
list:
- ``type``: (optional, defaults to 'string') The mapping type to
use for the column.
- ``name``: (optional, defaults to field name) The name of the
column in the database.
- ``length``: (optional, default 255) The length of the column in
the database. (Applies only if a string-valued column is used).
- ``unique``: (optional, default FALSE) Whether the column is a
unique key.
- ``nullable``: (optional, default FALSE) Whether the database
column is nullable.
- ``precision``: (optional, default 0) The precision for a decimal
(exact numeric) column (applies only for decimal column),
which is the maximum number of digits that are stored for the values.
- ``scale``: (optional, default 0) The scale for a decimal (exact
numeric) column (applies only for decimal column), which represents
the number of digits to the right of the decimal point and must
not be greater than *precision*.
- ``columnDefinition``: (optional) Allows to define a custom
DDL snippet that is used to create the column. Warning: This normally
confuses the SchemaTool to always detect the column as changed.
- ``options``: (optional) Key-value pairs of options that get passed
to the underlying database platform when generating DDL statements.
.. _reference-mapping-types:
Doctrine Mapping Types
----------------------
The ``type`` option used in the ``@Column`` accepts any of the existing
Doctrine types or even your own custom types. A Doctrine type defines
the conversion between PHP and SQL types, independent from the database vendor
you are using. All Mapping Types that ship with Doctrine are fully portable
between the supported database systems.
As an example, the Doctrine Mapping Type ``string`` defines the
mapping from a PHP string to a SQL VARCHAR (or VARCHAR2 etc.
depending on the RDBMS brand). Here is a quick overview of the
built-in mapping types:
- ``string``: Type that maps a SQL VARCHAR to a PHP string.
- ``integer``: Type that maps a SQL INT to a PHP integer.
- ``smallint``: Type that maps a database SMALLINT to a PHP
integer.
- ``bigint``: Type that maps a database BIGINT to a PHP string.
- ``boolean``: Type that maps a SQL boolean or equivalent (TINYINT) to a PHP boolean.
- ``decimal``: Type that maps a SQL DECIMAL to a PHP string.
- ``date``: Type that maps a SQL DATETIME to a PHP DateTime
object.
- ``time``: Type that maps a SQL TIME to a PHP DateTime object.
- ``datetime``: Type that maps a SQL DATETIME/TIMESTAMP to a PHP
DateTime object.
- ``datetimetz``: Type that maps a SQL DATETIME/TIMESTAMP to a PHP
DateTime object with timezone.
- ``text``: Type that maps a SQL CLOB to a PHP string.
- ``object``: Type that maps a SQL CLOB to a PHP object using
``serialize()`` and ``unserialize()``
- ``array``: Type that maps a SQL CLOB to a PHP array using
``serialize()`` and ``unserialize()``
- ``simple_array``: Type that maps a SQL CLOB to a PHP array using
``implode()`` and ``explode()``, with a comma as delimiter. *IMPORTANT*
Only use this type if you are sure that your values cannot contain a ",".
- ``json_array``: Type that maps a SQL CLOB to a PHP array using
``json_encode()`` and ``json_decode()``
- ``float``: Type that maps a SQL Float (Double Precision) to a
PHP double. *IMPORTANT*: Works only with locale settings that use
decimal points as separator.
- ``guid``: Type that maps a database GUID/UUID to a PHP string. Defaults to
varchar but uses a specific type if the platform supports it.
- ``blob``: Type that maps a SQL BLOB to a PHP resource stream
A cookbook article shows how to define :doc:`your own custom mapping types
<../cookbook/custom-mapping-types>`.
.. note::
DateTime and Object types are compared by reference, not by value. Doctrine
updates this values if the reference changes and therefore behaves as if
these objects are immutable value objects.
.. warning::
All Date types assume that you are exclusively using the default timezone
set by `date_default_timezone_set() <http://docs.php.net/manual/en/function.date-default-timezone-set.php>`_
or by the php.ini configuration ``date.timezone``. Working with
different timezones will cause troubles and unexpected behavior.
If you need specific timezone handling you have to handle this
in your domain, converting all the values back and forth from UTC.
There is also a :doc:`cookbook entry <../cookbook/working-with-datetime>`
on working with datetimes that gives hints for implementing
multi timezone applications.
Identifiers / Primary Keys
--------------------------
Every entity class must have an identifier/primary key. You can select
the field that serves as the identifier with the ``@Id``
annotation.
.. configuration-block::
.. code-block:: php
<?php
class Message
{
/**
* @Id @Column(type="integer")
* @GeneratedValue
*/
private $id;
//...
}
.. code-block:: xml
<doctrine-mapping>
<entity name="Message">
<id name="id" type="integer">
<generator strategy="AUTO" />
</id>
<!-- -->
</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. It defaults to the identifier generation mechanism your current
database vendor prefers: AUTO_INCREMENT with MySQL, SERIAL with PostgreSQL,
Sequences with Oracle and so on.
Identifier Generation Strategies
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The previous example showed how to use the default identifier
generation strategy without knowing the underlying database with
the AUTO-detection strategy. It is also possible to specify the
identifier generation strategy more explicitly, which allows you to
make use of some additional features.
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 SEQUENCE
for Oracle and PostgreSQL. This strategy provides full portability.
- ``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
SQL Anywhere.
- ``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).
- ``TABLE``: Tells Doctrine to use a separate table for ID
generation. This strategy provides full portability.
***This strategy is not yet implemented!***
- ``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.
Sequence Generator
^^^^^^^^^^^^^^^^^^
The Sequence Generator can currently be used in conjunction with
Oracle or Postgres and allows some additional configuration options
besides specifying the sequence's name:
.. configuration-block::
.. code-block:: php
<?php
class Message
{
/**
* @Id
* @GeneratedValue(strategy="SEQUENCE")
* @SequenceGenerator(sequenceName="message_seq", initialValue=1, allocationSize=100)
*/
protected $id = null;
//...
}
.. code-block:: xml
<doctrine-mapping>
<entity name="Message">
<id name="id" type="integer">
<generator strategy="SEQUENCE" />
<sequence-generator sequence-name="message_seq" allocation-size="100" initial-value="1" />
</id>
</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.
The allocationSize is a powerful feature to optimize INSERT
performance of Doctrine. The allocationSize specifies by how much
values the sequence is incremented whenever the next value is
retrieved. If this is larger than 1 (one) Doctrine can generate
identifier values for the allocationSizes amount of entities. In
the above example with ``allocationSize=100`` Doctrine 2 would only
need to access the sequence once to generate the identifiers for
100 new entities.
*The default allocationSize for a @SequenceGenerator is currently 10.*
.. caution::
The allocationSize is detected by SchemaTool and
transformed into an "INCREMENT BY " clause in the CREATE SEQUENCE
statement. For a database schema created manually (and not
SchemaTool) you have to make sure that the allocationSize
configuration option is never larger than the actual sequences
INCREMENT BY value, otherwise you may get duplicate keys.
.. note::
It is possible to use strategy="AUTO" and at the same time
specifying a @SequenceGenerator. In such a case, your custom
sequence settings are used in the case where the preferred strategy
of the underlying platform is SEQUENCE, such as for Oracle and
PostgreSQL.
Composite Keys
~~~~~~~~~~~~~~
with Doctrine 2 you can use composite primary keys, using ``@Id`` on more then
one column. Some restrictions exist opposed to using a single identifier in
this case: The use of the ``@GeneratedValue`` annotation is not supported,
which means you can only use composite keys if you generate the primary key
values yourself before calling ``EntityManager#persist()`` on the entity.
More details on composite primary keys are discussed in a :doc:`dedicated tutorial
<../tutorials/composite-primary-keys>`.
Quoting Reserved Words
----------------------
Sometimes it is necessary to quote a column or table name because of reserved
word conflicts. Doctrine does not quote identifiers automatically, because it
leads to more problems than it would solve. Quoting tables and column names
needs to be done explicitly using ticks in the definition.
.. code-block:: php
<?php
/** @Column(name="`number`", type="integer") */
private $number;
Doctrine will then quote this column name in all SQL statements
according to the used database platform.
.. warning::
Identifier Quoting does not work for join column names or discriminator
column names unless you are using a custom ``QuoteStrategy``.
.. _reference-basic-mapping-custom-mapping-types:
.. versionadded: 2.3
For more control over column quoting the ``Doctrine\ORM\Mapping\QuoteStrategy`` interface
was introduced in 2.3. It is invoked for every column, table, alias and other
SQL names. You can implement the QuoteStrategy and set it by calling
``Doctrine\ORM\Configuration#setQuoteStrategy()``.
.. versionadded: 2.4
The ANSI Quote Strategy was added, which assumes quoting is not necessary for any SQL name.
You can use it with the following code:
.. code-block:: php
<?php
use Doctrine\ORM\Mapping\AnsiQuoteStrategy;
$configuration->setQuoteStrategy(new AnsiQuoteStrategy());

View File

@@ -0,0 +1,187 @@
Batch Processing
================
This chapter shows you how to accomplish bulk inserts, updates and
deletes with Doctrine in an efficient way. The main problem with
bulk operations is usually not to run out of memory and this is
especially what the strategies presented here provide help with.
.. warning::
An ORM tool is not primarily well-suited for mass
inserts, updates or deletions. Every RDBMS has its own, most
effective way of dealing with such operations and if the options
outlined below are not sufficient for your purposes we recommend
you use the tools for your particular RDBMS for these bulk
operations.
Bulk Inserts
------------
Bulk inserts in Doctrine are best performed in batches, taking
advantage of the transactional write-behind behavior of an
``EntityManager``. The following code shows an example for
inserting 10000 objects with a batch size of 20. You may need to
experiment with the batch size to find the size that works best for
you. Larger batch sizes mean more prepared statement reuse
internally but also mean more work during ``flush``.
.. code-block:: php
<?php
$batchSize = 20;
for ($i = 1; $i <= 10000; ++$i) {
$user = new CmsUser;
$user->setStatus('user');
$user->setUsername('user' . $i);
$user->setName('Mr.Smith-' . $i);
$em->persist($user);
if (($i % $batchSize) === 0) {
$em->flush();
$em->clear(); // Detaches all objects from Doctrine!
}
}
$em->flush(); //Persist objects that did not make up an entire batch
$em->clear();
Bulk Updates
------------
There are 2 possibilities for bulk updates with Doctrine.
DQL UPDATE
~~~~~~~~~~
The by far most efficient way for bulk updates is to use a DQL
UPDATE query. Example:
.. code-block:: php
<?php
$q = $em->createQuery('update MyProject\Model\Manager m set m.salary = m.salary * 0.9');
$numUpdated = $q->execute();
Iterating results
~~~~~~~~~~~~~~~~~
An alternative solution for bulk updates is to use the
``Query#iterate()`` facility to iterate over the query results step
by step instead of loading the whole result into memory at once.
The following example shows how to do this, combining the iteration
with the batching strategy that was already used for bulk inserts:
.. code-block:: php
<?php
$batchSize = 20;
$i = 0;
$q = $em->createQuery('select u from MyProject\Model\User u');
$iterableResult = $q->iterate();
foreach ($iterableResult as $row) {
$user = $row[0];
$user->increaseCredit();
$user->calculateNewBonuses();
if (($i % $batchSize) === 0) {
$em->flush(); // Executes all updates.
$em->clear(); // Detaches all objects from Doctrine!
}
++$i;
}
$em->flush();
.. note::
Iterating results is not possible with queries that
fetch-join a collection-valued association. The nature of such SQL
result sets is not suitable for incremental hydration.
.. note::
Results may be fully buffered by the database client/ connection allocating
additional memory not visible to the PHP process. For large sets this
may easily kill the process for no apparant reason.
Bulk Deletes
------------
There are two possibilities for bulk deletes with Doctrine. You can
either issue a single DQL DELETE query or you can iterate over
results removing them one at a time.
DQL DELETE
~~~~~~~~~~
The by far most efficient way for bulk deletes is to use a DQL
DELETE query.
Example:
.. code-block:: php
<?php
$q = $em->createQuery('delete from MyProject\Model\Manager m where m.salary > 100000');
$numDeleted = $q->execute();
Iterating results
~~~~~~~~~~~~~~~~~
An alternative solution for bulk deletes is to use the
``Query#iterate()`` facility to iterate over the query results step
by step instead of loading the whole result into memory at once.
The following example shows how to do this:
.. code-block:: php
<?php
$batchSize = 20;
$i = 0;
$q = $em->createQuery('select u from MyProject\Model\User u');
$iterableResult = $q->iterate();
while (($row = $iterableResult->next()) !== false) {
$em->remove($row[0]);
if (($i % $batchSize) === 0) {
$em->flush(); // Executes all deletions.
$em->clear(); // Detaches all objects from Doctrine!
}
++$i;
}
$em->flush();
.. note::
Iterating results is not possible with queries that
fetch-join a collection-valued association. The nature of such SQL
result sets is not suitable for incremental hydration.
Iterating Large Results for Data-Processing
-------------------------------------------
You can use the ``iterate()`` method just to iterate over a large
result and no UPDATE or DELETE intention. The ``IterableResult``
instance returned from ``$query->iterate()`` implements the
Iterator interface so you can process a large result without memory
problems using the following approach:
.. code-block:: php
<?php
$q = $this->_em->createQuery('select u from MyProject\Model\User u');
$iterableResult = $q->iterate();
foreach ($iterableResult as $row) {
// do stuff with the data in the row, $row[0] is always the object
// detach from Doctrine, so that it can be Garbage-Collected immediately
$this->_em->detach($row[0]);
}
.. note::
Iterating results is not possible with queries that
fetch-join a collection-valued association. The nature of such SQL
result sets is not suitable for incremental hydration.

View File

@@ -0,0 +1,111 @@
Best Practices
==============
The best practices mentioned here that affect database
design generally refer to best practices when working with Doctrine
and do not necessarily reflect best practices for database design
in general.
Constrain relationships as much as possible
-------------------------------------------
It is important to constrain relationships as much as possible.
This means:
- Impose a traversal direction (avoid bidirectional associations
if possible)
- Eliminate nonessential associations
This has several benefits:
- Reduced coupling in your domain model
- Simpler code in your domain model (no need to maintain
bidirectionality properly)
- Less work for Doctrine
Avoid composite keys
--------------------
Even though Doctrine fully supports composite keys it is best not
to use them if possible. Composite keys require additional work by
Doctrine and thus have a higher probability of errors.
Use events judiciously
----------------------
The event system of Doctrine is great and fast. Even though making
heavy use of events, especially lifecycle events, can have a
negative impact on the performance of your application. Thus you
should use events judiciously.
Use cascades judiciously
------------------------
Automatic cascades of the persist/remove/merge/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
scenarios it is most likely used in.
Don't use special characters
----------------------------
Avoid using any non-ASCII characters in class, field, table or
column names. Doctrine itself is not unicode-safe in many places
and will not be until PHP itself is fully unicode-aware (PHP6).
Don't use identifier quoting
----------------------------
Identifier quoting is a workaround for using reserved words that
often causes problems in edge cases. Do not use identifier quoting
and avoid using reserved words as table or column names.
Initialize collections in the constructor
-----------------------------------------
It is recommended best practice to initialize any business
collections in entities in the constructor. Example:
.. code-block:: php
<?php
namespace MyProject\Model;
use Doctrine\Common\Collections\ArrayCollection;
class User {
private $addresses;
private $articles;
public function __construct() {
$this->addresses = new ArrayCollection;
$this->articles = new ArrayCollection;
}
}
Don't map foreign keys to fields in an entity
---------------------------------------------
Foreign keys have no meaning whatsoever in an object model. Foreign
keys are how a relational database establishes relationships. Your
object model establishes relationships through object references.
Thus mapping foreign keys to object fields heavily leaks details of
the relational model into the object model, something you really
should not do.
Use explicit transaction demarcation
------------------------------------
While Doctrine will automatically wrap all DML operations in a
transaction on flush(), it is considered best practice to
explicitly set the transaction boundaries yourself. Otherwise every
single query is wrapped in a small transaction (Yes, SELECT
queries, too) since you can not talk to your database outside of a
transaction. While such short transactions for read-only (SELECT)
queries generally don't have any noticeable performance impact, it
is still preferable to use fewer, well-defined transactions that
are established through explicit transaction boundaries.

View File

@@ -0,0 +1,420 @@
Caching
=======
Doctrine provides cache drivers in the ``Common`` package for some
of the most popular caching implementations such as APC, Memcache
and Xcache. We also provide an ``ArrayCache`` driver which stores
the data in a PHP array. Obviously, when using ``ArrayCache``, the
cache does not persist between requests, but this is useful for
testing in a development environment.
Cache Drivers
-------------
The cache drivers follow a simple interface that is defined in
``Doctrine\Common\Cache\Cache``. All the cache drivers extend a
base class ``Doctrine\Common\Cache\AbstractCache`` which implements
this interface.
The interface defines the following public methods for you to implement:
- fetch($id) - Fetches an entry from the cache
- contains($id) - Test if an entry exists in the cache
- save($id, $data, $lifeTime = false) - Puts data into the cache
- delete($id) - Deletes a cache entry
Each driver extends the ``AbstractCache`` class which defines a few
abstract protected methods that each of the drivers must
implement:
- \_doFetch($id)
- \_doContains($id)
- \_doSave($id, $data, $lifeTime = false)
- \_doDelete($id)
The public methods ``fetch()``, ``contains()`` etc. use the
above protected methods which are implemented by the drivers. The
code is organized this way so that the protected methods in the
drivers do the raw interaction with the cache implementation and
the ``AbstractCache`` can build custom functionality on top of
these methods.
APC
~~~
In order to use the APC cache driver you must have it compiled and
enabled in your php.ini. You can read about APC
`in the PHP Documentation <http://us2.php.net/apc>`_. It will give
you a little background information about what it is and how you
can use it as well as how to install it.
Below is a simple example of how you could use the APC cache driver
by itself.
.. code-block:: php
<?php
$cacheDriver = new \Doctrine\Common\Cache\ApcCache();
$cacheDriver->save('cache_id', 'my_data');
Memcache
~~~~~~~~
In order to use the Memcache cache driver you must have it compiled
and enabled in your php.ini. You can read about Memcache
`on the PHP website <http://php.net/memcache>`_. It will
give you a little background information about what it is and how
you can use it as well as how to install it.
Below is a simple example of how you could use the Memcache cache
driver by itself.
.. code-block:: php
<?php
$memcache = new Memcache();
$memcache->connect('memcache_host', 11211);
$cacheDriver = new \Doctrine\Common\Cache\MemcacheCache();
$cacheDriver->setMemcache($memcache);
$cacheDriver->save('cache_id', 'my_data');
Memcached
~~~~~~~~
Memcached is a more recent and complete alternative extension to
Memcache.
In order to use the Memcached cache driver you must have it compiled
and enabled in your php.ini. You can read about Memcached
`on the PHP website <http://php.net/memcached>`_. It will
give you a little background information about what it is and how
you can use it as well as how to install it.
Below is a simple example of how you could use the Memcached cache
driver by itself.
.. code-block:: php
<?php
$memcached = new Memcached();
$memcached->addServer('memcache_host', 11211);
$cacheDriver = new \Doctrine\Common\Cache\MemcachedCache();
$cacheDriver->setMemcached($memcached);
$cacheDriver->save('cache_id', 'my_data');
Xcache
~~~~~~
In order to use the Xcache cache driver you must have it compiled
and enabled in your php.ini. You can read about Xcache
`here <http://xcache.lighttpd.net/>`_. It will give you a little
background information about what it is and how you can use it as
well as how to install it.
Below is a simple example of how you could use the Xcache cache
driver by itself.
.. code-block:: php
<?php
$cacheDriver = new \Doctrine\Common\Cache\XcacheCache();
$cacheDriver->save('cache_id', 'my_data');
Redis
~~~~~
In order to use the Redis cache driver you must have it compiled
and enabled in your php.ini. You can read about what Redis is
`from here <http://redis.io/>`_. Also check
`A PHP extension for Redis <https://github.com/nicolasff/phpredis/>`_ for how you can use
and install the Redis PHP extension.
Below is a simple example of how you could use the Redis cache
driver by itself.
.. code-block:: php
<?php
$redis = new Redis();
$redis->connect('redis_host', 6379);
$cacheDriver = new \Doctrine\Common\Cache\RedisCache();
$cacheDriver->setRedis($redis);
$cacheDriver->save('cache_id', 'my_data');
Using Cache Drivers
-------------------
In this section we'll describe how you can fully utilize the API of
the cache drivers to save data to a cache, check if some cached data
exists, fetch the cached data and delete the cached data. We'll use the
``ArrayCache`` implementation as our example here.
.. code-block:: php
<?php
$cacheDriver = new \Doctrine\Common\Cache\ArrayCache();
Saving
~~~~~~
Saving some data to the cache driver is as simple as using the
``save()`` method.
.. code-block:: php
<?php
$cacheDriver->save('cache_id', 'my_data');
The ``save()`` method accepts three arguments which are described
below:
- ``$id`` - The cache id
- ``$data`` - The cache entry/data.
- ``$lifeTime`` - The lifetime. If != false, sets a specific
lifetime for this cache entry (null => infinite lifeTime).
You can save any type of data whether it be a string, array,
object, etc.
.. code-block:: php
<?php
$array = array(
'key1' => 'value1',
'key2' => 'value2'
);
$cacheDriver->save('my_array', $array);
Checking
~~~~~~~~
Checking whether cached data exists is very simple: just use the
``contains()`` method. It accepts a single argument which is the ID
of the cache entry.
.. code-block:: php
<?php
if ($cacheDriver->contains('cache_id')) {
echo 'cache exists';
} else {
echo 'cache does not exist';
}
Fetching
~~~~~~~~
Now if you want to retrieve some cache entry you can use the
``fetch()`` method. It also accepts a single argument just like
``contains()`` which is again the ID of the cache entry.
.. code-block:: php
<?php
$array = $cacheDriver->fetch('my_array');
Deleting
~~~~~~~~
As you might guess, deleting is just as easy as saving, checking
and fetching. You can delete by an individual ID, or you can
delete all entries.
By Cache ID
^^^^^^^^^^^
.. code-block:: php
<?php
$cacheDriver->delete('my_array');
All
^^^
If you simply want to delete all cache entries you can do so with
the ``deleteAll()`` method.
.. code-block:: php
<?php
$deleted = $cacheDriver->deleteAll();
Namespaces
~~~~~~~~~~
If you heavily use caching in your application and use it in
multiple parts of your application, or use it in different
applications on the same server you may have issues with cache
naming collisions. This can be worked around by using namespaces.
You can set the namespace a cache driver should use by using the
``setNamespace()`` method.
.. code-block:: php
<?php
$cacheDriver->setNamespace('my_namespace_');
Integrating with the ORM
------------------------
The Doctrine ORM package is tightly integrated with the cache
drivers to allow you to improve the performance of various aspects of
Doctrine by simply making some additional configurations and
method calls.
Query Cache
~~~~~~~~~~~
It is highly recommended that in a production environment you cache
the transformation of a DQL query to its SQL counterpart. It
doesn't make sense to do this parsing multiple times as it doesn't
change unless you alter the DQL query.
This can be done by configuring the query cache implementation to
use on your ORM configuration.
.. code-block:: php
<?php
$config = new \Doctrine\ORM\Configuration();
$config->setQueryCacheImpl(new \Doctrine\Common\Cache\ApcCache());
Result Cache
~~~~~~~~~~~~
The result cache can be used to cache the results of your queries
so that we don't have to query the database or hydrate the data
again after the first time. You just need to configure the result
cache implementation.
.. code-block:: php
<?php
$config->setResultCacheImpl(new \Doctrine\Common\Cache\ApcCache());
Now when you're executing DQL queries you can configure them to use
the result cache.
.. code-block:: php
<?php
$query = $em->createQuery('select u from \Entities\User u');
$query->useResultCache(true);
You can also configure an individual query to use a different
result cache driver.
.. code-block:: php
<?php
$query->setResultCacheDriver(new \Doctrine\Common\Cache\ApcCache());
.. note::
Setting the result cache driver on the query will
automatically enable the result cache for the query. If you want to
disable it pass false to ``useResultCache()``.
::
<?php
$query->useResultCache(false);
If you want to set the time the cache has to live you can use the
``setResultCacheLifetime()`` method.
.. code-block:: php
<?php
$query->setResultCacheLifetime(3600);
The ID used to store the result set cache is a hash which is
automatically generated for you if you don't set a custom ID
yourself with the ``setResultCacheId()`` method.
.. code-block:: php
<?php
$query->setResultCacheId('my_custom_id');
You can also set the lifetime and cache ID by passing the values as
the second and third argument to ``useResultCache()``.
.. code-block:: php
<?php
$query->useResultCache(true, 3600, 'my_custom_id');
Metadata Cache
~~~~~~~~~~~~~~
Your class metadata can be parsed from a few different sources like
YAML, XML, Annotations, etc. Instead of parsing this information on
each request we should cache it using one of the cache drivers.
Just like the query and result cache we need to configure it
first.
.. code-block:: php
<?php
$config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ApcCache());
Now the metadata information will only be parsed once and stored in
the cache driver.
Clearing the Cache
------------------
We've already shown you how you can use the API of the
cache drivers to manually delete cache entries. For your
convenience we offer command line tasks to help you with
clearing the query, result and metadata cache.
From the Doctrine command line you can run the following commands:
To clear the query cache use the ``orm:clear-cache:query`` task.
.. code-block:: php
$ ./doctrine orm:clear-cache:query
To clear the metadata cache use the ``orm:clear-cache:metadata`` task.
.. code-block:: php
$ ./doctrine orm:clear-cache:metadata
To clear the result cache use the ``orm:clear-cache:result`` task.
.. code-block:: php
$ ./doctrine orm:clear-cache:result
All these tasks accept a ``--flush`` option to flush the entire
contents of the cache instead of invalidating the entries.
Cache Slams
-----------
Something to be careful of when using the cache drivers is
"cache slams". Imagine you have a heavily trafficked website with some
code that checks for the existence of a cache record and if it does
not exist it generates the information and saves it to the cache.
Now, if 100 requests were issued all at the same time and each one
sees the cache does not exist and they all try to insert the same
cache entry it could lock up APC, Xcache, etc. and cause problems.
Ways exist to work around this, like pre-populating your cache and
not letting your users' requests populate the cache.
You can read more about cache slams
`in this blog post <http://notmysock.org/blog/php/user-cache-timebomb.html>`_.

View File

@@ -0,0 +1,151 @@
Change Tracking Policies
========================
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
its particular advantages and disadvantages. The change tracking
policy can be defined on a per-class basis (or more precisely,
per-hierarchy).
Deferred Implicit
~~~~~~~~~~~~~~~~~
The deferred implicit policy is the default change tracking policy
and the most convenient one. With this policy, Doctrine detects the
changes by a property-by-property comparison at commit time and
also detects changes to entities or new entities that are
referenced by other managed entities ("persistence by
reachability"). Although the most convenient policy, it can have
negative effects on performance if you are dealing with large units
of work (see "Understanding the Unit of Work"). Since Doctrine
can't know what has changed, it needs to check all managed entities
for changes every time you invoke EntityManager#flush(), making
this operation rather costly.
Deferred Explicit
~~~~~~~~~~~~~~~~~
The deferred explicit policy is similar to the deferred implicit
policy in that it detects changes through a property-by-property
comparison at commit time. The difference is that Doctrine 2 only
considers entities that have been explicitly marked for change detection
through a call to EntityManager#persist(entity) or through a save
cascade. All other entities are skipped. This policy therefore
gives improved performance for larger units of work while
sacrificing the behavior of "automatic dirty checking".
Therefore, flush() operations are potentially cheaper with this
policy. The negative aspect this has is that if you have a rather
large application and you pass your objects through several layers
for processing purposes and business tasks you may need to track
yourself which entities have changed on the way so you can pass
them to EntityManager#persist().
This policy can be configured as follows:
.. code-block:: php
<?php
/**
* @Entity
* @ChangeTrackingPolicy("DEFERRED_EXPLICIT")
*/
class User
{
// ...
}
Notify
~~~~~~
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\Common\NotifyPropertyChanged,
Doctrine\Common\PropertyChangedListener;
/**
* @Entity
* @ChangeTrackingPolicy("NOTIFY")
*/
class MyEntity implements NotifyPropertyChanged
{
// ...
private $_listeners = array();
public function addPropertyChangedListener(PropertyChangedListener $listener)
{
$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)
{
if ($this->_listeners) {
foreach ($this->_listeners as $listener) {
$listener->propertyChanged($this, $propName, $oldValue, $newValue);
}
}
}
public function setData($data)
{
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.
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

@@ -0,0 +1,141 @@
Installation and Configuration
==============================
Doctrine can be installed with `Composer <http://www.getcomposer.org>`_. For
older versions we still have `PEAR packages
<http://pear.doctrine-project.org>`_.
Define the following requirement in your ``composer.json`` file:
::
{
"require": {
"doctrine/orm": "*"
}
}
Then call ``composer install`` from your command line. If you don't know
how Composer works, check out their `Getting Started
<http://getcomposer.org/doc/00-intro.md>`_ to set up.
Class loading
-------------
Autoloading is taken care of by Composer. You just have to include the composer autoload file in your project:
.. code-block:: php
<?php
// bootstrap.php
// Include Composer Autoload (relative to project root).
require_once "vendor/autoload.php";
Obtaining an EntityManager
--------------------------
Once you have prepared the class loading, you acquire an
*EntityManager* instance. The EntityManager class is the primary
access point to ORM functionality provided by Doctrine.
.. code-block:: php
<?php
// bootstrap.php
require_once "vendor/autoload.php";
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
$paths = array("/path/to/entity-files");
$isDevMode = false;
// the connection configuration
$dbParams = array(
'driver' => 'pdo_mysql',
'user' => 'root',
'password' => '',
'dbname' => 'foo',
);
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);
$entityManager = EntityManager::create($dbParams, $config);
Or if you prefer XML:
.. code-block:: php
<?php
$paths = array("/path/to/xml-mappings");
$config = Setup::createXMLMetadataConfiguration($paths, $isDevMode);
$entityManager = EntityManager::create($dbParams, $config);
Or if you prefer YAML:
.. code-block:: php
<?php
$paths = array("/path/to/yml-mappings");
$config = Setup::createYAMLMetadataConfiguration($paths, $isDevMode);
$entityManager = EntityManager::create($dbParams, $config);
Inside the ``Setup`` methods several assumptions are made:
- If `$isDevMode` is true caching is done in memory with the ``ArrayCache``. Proxy objects are recreated on every request.
- If `$isDevMode` is false, check for Caches in the order APC, Xcache, Memcache (127.0.0.1:11211), Redis (127.0.0.1:6379) unless `$cache` is passed as fourth argument.
- If `$isDevMode` is false, set then proxy classes have to be explicitly created through the command line.
- If third argument `$proxyDir` is not set, use the systems temporary directory.
If you want to configure Doctrine in more detail, take a look at the :doc:`Advanced
Configuration <reference/advanced-configuration>` section.
.. note::
You can learn more about the database connection configuration in the
`Doctrine DBAL connection configuration reference <http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html>`_.
Setting up the Commandline Tool
-------------------------------
Doctrine ships with a number of command line tools that are very helpful
during development. You can call this command from the Composer binary
directory:
.. code-block:: sh
$ php vendor/bin/doctrine
You need to register your applications EntityManager to the console tool
to make use of the tasks by creating a ``cli-config.php`` file with the
following content:
On Doctrine 2.4 and above:
.. code-block:: php
<?php
use Doctrine\ORM\Tools\Console\ConsoleRunner;
// replace with file to your own project bootstrap
require_once 'bootstrap.php';
// replace with mechanism to retrieve EntityManager in your app
$entityManager = GetEntityManager();
return ConsoleRunner::createHelperSet($entityManager);
On Doctrine 2.3 and below:
.. code-block:: php
<?php
// cli-config.php
require_once 'my_bootstrap.php';
// Any way to access the EntityManager from your application
$em = GetMyEntityManager();
$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
));

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,983 @@
Events
======
Doctrine 2 features a lightweight event system that is part of the
Common package. Doctrine uses it to dispatch system events, mainly
:ref:`lifecycle events <reference-events-lifecycle-events>`.
You can also use it for your own custom events.
The Event System
----------------
The event system is controlled by the ``EventManager``. It is the
central point of Doctrine's event listener system. Listeners are
registered on the manager and events are dispatched through the
manager.
.. code-block:: php
<?php
$evm = new EventManager();
Now we can add some event listeners to the ``$evm``. Let's create a
``TestEvent`` class to play around with.
.. code-block:: php
<?php
class TestEvent
{
const preFoo = 'preFoo';
const postFoo = 'postFoo';
private $_evm;
public $preFooInvoked = false;
public $postFooInvoked = false;
public function __construct($evm)
{
$evm->addEventListener(array(self::preFoo, self::postFoo), $this);
}
public function preFoo(EventArgs $e)
{
$this->preFooInvoked = true;
}
public function postFoo(EventArgs $e)
{
$this->postFooInvoked = true;
}
}
// Create a new instance
$test = new TestEvent($evm);
Events can be dispatched by using the ``dispatchEvent()`` method.
.. code-block:: php
<?php
$evm->dispatchEvent(TestEvent::preFoo);
$evm->dispatchEvent(TestEvent::postFoo);
You can easily remove a listener with the ``removeEventListener()``
method.
.. code-block:: php
<?php
$evm->removeEventListener(array(self::preFoo, self::postFoo), $this);
The Doctrine 2 event system also has a simple concept of event
subscribers. We can define a simple ``TestEventSubscriber`` class
which implements the ``\Doctrine\Common\EventSubscriber`` interface
and implements a ``getSubscribedEvents()`` method which returns an
array of events it should be subscribed to.
.. code-block:: php
<?php
class TestEventSubscriber implements \Doctrine\Common\EventSubscriber
{
public $preFooInvoked = false;
public function preFoo()
{
$this->preFooInvoked = true;
}
public function getSubscribedEvents()
{
return array(TestEvent::preFoo);
}
}
$eventSubscriber = new TestEventSubscriber();
$evm->addEventSubscriber($eventSubscriber);
.. note::
The array to return in the ``getSubscribedEvents`` method is a simple array
with the values being the event names. The subscriber must have a method
that is named exactly like the event.
Now when you dispatch an event, any event subscribers will be
notified for that event.
.. code-block:: php
<?php
$evm->dispatchEvent(TestEvent::preFoo);
Now you can test the ``$eventSubscriber`` instance to see if the
``preFoo()`` method was invoked.
.. code-block:: php
<?php
if ($eventSubscriber->preFooInvoked) {
echo 'pre foo invoked!';
}
Naming convention
~~~~~~~~~~~~~~~~~
Events being used with the Doctrine 2 EventManager are best named
with camelcase and the value of the corresponding constant should
be the name of the constant itself, even with spelling. This has
several reasons:
- It is easy to read.
- Simplicity.
- Each method within an EventSubscriber is named after the
corresponding constant's value. If the constant's name and value differ
it contradicts the intention of using the constant and makes your code
harder to maintain.
An example for a correct notation can be found in the example
``TestEvent`` above.
.. _reference-events-lifecycle-events:
Lifecycle Events
----------------
The EntityManager and UnitOfWork trigger a bunch of events during
the life-time of their registered entities.
- preRemove - The preRemove event occurs for a given entity before
the respective EntityManager remove operation for that entity is
executed. It is not called for a DQL DELETE statement.
- postRemove - The postRemove event occurs for an entity after the
entity has been deleted. It will be invoked after the database
delete operations. It is not called for a DQL DELETE statement.
- prePersist - The prePersist event occurs for a given entity
before the respective EntityManager persist operation for that
entity is executed. It should be noted that this event is only triggered on
*initial* persist of an entity (i.e. it does not trigger on future updates).
- postPersist - The postPersist event occurs for an entity after
the entity has been made persistent. It will be invoked after the
database insert operations. Generated primary key values are
available in the postPersist event.
- preUpdate - The preUpdate event occurs before the database
update operations to entity data. It is not called for a DQL UPDATE statement.
- postUpdate - The postUpdate event occurs after the database
update operations to entity data. It is not called for a DQL UPDATE statement.
- postLoad - The postLoad event occurs for an entity after the
entity has been loaded into the current EntityManager from the
database or after the refresh operation has been applied to it.
- loadClassMetadata - The loadClassMetadata event occurs after the
mapping metadata for a class has been loaded from a mapping source
(annotations/xml/yaml). This event is not a lifecycle callback.
- onClassMetadataNotFound - Loading class metadata for a particular
requested class name failed. Manipulating the given event args instance
allows providing fallback metadata even when no actual metadata exists
or could be found. This event is not a lifecycle callback.
- preFlush - The preFlush event occurs at the very beginning of a flush
operation. This event is not a lifecycle callback.
- onFlush - The onFlush event occurs after the change-sets of all
managed entities are computed. This event is not a lifecycle
callback.
- postFlush - The postFlush event occurs at the end of a flush operation. This
event is not a lifecycle callback.
- onClear - The onClear event occurs when the EntityManager#clear() operation is
invoked, after all references to entities have been removed from the unit of
work. This event is not a lifecycle callback.
.. warning::
Note that, when using ``Doctrine\ORM\AbstractQuery#iterate()``, ``postLoad``
events will be executed immediately after objects are being hydrated, and therefore
associations are not guaranteed to be initialized. It is not safe to combine
usage of ``Doctrine\ORM\AbstractQuery#iterate()`` and ``postLoad`` event
handlers.
.. warning::
Note that the postRemove event or any events triggered after an entity removal
can receive an uninitializable proxy in case you have configured an entity to
cascade remove relations. In this case, you should load yourself the proxy in
the associated pre event.
You can access the Event constants from the ``Events`` class in the
ORM package.
.. code-block:: php
<?php
use Doctrine\ORM\Events;
echo Events::preUpdate;
These can be hooked into by two different types of event
listeners:
- Lifecycle Callbacks are methods on the entity classes that are
called when the event is triggered. As of v2.4 they receive some kind
of ``EventArgs`` instance.
- Lifecycle Event Listeners and Subscribers are classes with specific callback
methods that receives some kind of ``EventArgs`` instance.
The EventArgs instance received by the listener gives access to the entity,
EntityManager and other relevant data.
.. note::
All Lifecycle events that happen during the ``flush()`` of
an EntityManager have very specific constraints on the allowed
operations that can be executed. Please read the
:ref:`reference-events-implementing-listeners` section very carefully
to understand which operations are allowed in which lifecycle event.
Lifecycle Callbacks
-------------------
Lifecycle Callbacks are defined on an entity class. They allow you to
trigger callbacks whenever an instance of that entity class experiences
a relevant lifecycle event. More than one callback can be defined for each
lifecycle event. Lifecycle Callbacks are best used for simple operations
specific to a particular entity class's lifecycle.
.. code-block:: php
<?php
/** @Entity @HasLifecycleCallbacks */
class User
{
// ...
/**
* @Column(type="string", length=255)
*/
public $value;
/** @Column(name="created_at", type="string", length=255) */
private $createdAt;
/** @PrePersist */
public function doStuffOnPrePersist()
{
$this->createdAt = date('Y-m-d H:i:s');
}
/** @PrePersist */
public function doOtherStuffOnPrePersist()
{
$this->value = 'changed from prePersist callback!';
}
/** @PostPersist */
public function doStuffOnPostPersist()
{
$this->value = 'changed from postPersist callback!';
}
/** @PostLoad */
public function doStuffOnPostLoad()
{
$this->value = 'changed from postLoad callback!';
}
/** @PreUpdate */
public function doStuffOnPreUpdate()
{
$this->value = 'changed from preUpdate callback!';
}
}
Note that the methods set as lifecycle callbacks need to be public and,
when using these annotations, you have to apply the
``@HasLifecycleCallbacks`` marker annotation on the entity class.
If you want to register lifecycle callbacks from YAML or XML you
can do it with the following.
.. code-block:: yaml
User:
type: entity
fields:
# ...
name:
type: string(50)
lifecycleCallbacks:
prePersist: [ doStuffOnPrePersist, doOtherStuffOnPrePersist ]
postPersist: [ doStuffOnPostPersist ]
In YAML the ``key`` of the lifecycleCallbacks entry is the event that you
are triggering on and the value is the method (or methods) to call. The allowed
event types are the ones listed in the previous Lifecycle Events section.
XML would look something like this:
.. code-block:: xml
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
/Users/robo/dev/php/Doctrine/doctrine-mapping.xsd">
<entity name="User">
<lifecycle-callbacks>
<lifecycle-callback type="prePersist" method="doStuffOnPrePersist"/>
<lifecycle-callback type="postPersist" method="doStuffOnPostPersist"/>
</lifecycle-callbacks>
</entity>
</doctrine-mapping>
In XML the ``type`` of the lifecycle-callback entry is the event that you
are triggering on and the ``method`` is the method to call. The allowed event
types are the ones listed in the previous Lifecycle Events section.
When using YAML or XML you need to remember to create public methods to match the
callback names you defined. E.g. in these examples ``doStuffOnPrePersist()``,
``doOtherStuffOnPrePersist()`` and ``doStuffOnPostPersist()`` methods need to be
defined on your ``User`` model.
.. code-block:: php
<?php
// ...
class User
{
// ...
public function doStuffOnPrePersist()
{
// ...
}
public function doOtherStuffOnPrePersist()
{
// ...
}
public function doStuffOnPostPersist()
{
// ...
}
}
Lifecycle Callbacks Event Argument
-----------------------------------
.. versionadded:: 2.4
Since 2.4 the triggered event is given to the lifecycle-callback.
With the additional argument you have access to the
``EntityManager`` and ``UnitOfWork`` APIs inside these callback methods.
.. code-block:: php
<?php
// ...
class User
{
public function preUpdate(PreUpdateEventArgs $event)
{
if ($event->hasChangedField('username')) {
// Do something when the username is changed.
}
}
}
Listening and subscribing to Lifecycle Events
---------------------------------------------
Lifecycle event listeners are much more powerful than the simple
lifecycle callbacks that are defined on the entity classes. They
sit at a level above the entities and allow you to implement re-usable
behaviors across different entity classes.
Note that they require much more detailed knowledge about the inner
workings of the EntityManager and UnitOfWork. Please read the
*Implementing Event Listeners* section carefully if you are trying
to write your own listener.
For event subscribers, there are no surprises. They declare the
lifecycle events in their ``getSubscribedEvents`` method and provide
public methods that expect the relevant arguments.
A lifecycle event listener looks like the following:
.. code-block:: php
<?php
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
class MyEventListener
{
public function preUpdate(LifecycleEventArgs $args)
{
$entity = $args->getObject();
$entityManager = $args->getObjectManager();
// perhaps you only want to act on some "Product" entity
if ($entity instanceof Product) {
// do something with the Product
}
}
}
A lifecycle event subscriber may looks like this:
.. code-block:: php
<?php
use Doctrine\ORM\Events;
use Doctrine\Common\EventSubscriber;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
class MyEventSubscriber implements EventSubscriber
{
public function getSubscribedEvents()
{
return array(
Events::postUpdate,
);
}
public function postUpdate(LifecycleEventArgs $args)
{
$entity = $args->getObject();
$entityManager = $args->getObjectManager();
// perhaps you only want to act on some "Product" entity
if ($entity instanceof Product) {
// do something with the Product
}
}
.. note::
Lifecycle events are triggered for all entities. It is the responsibility
of the listeners and subscribers to check if the entity is of a type
it wants to handle.
To register an event listener or subscriber, you have to hook it into the
EventManager that is passed to the EntityManager factory:
.. code-block:: php
<?php
$eventManager = new EventManager();
$eventManager->addEventListener(array(Events::preUpdate), new MyEventListener());
$eventManager->addEventSubscriber(new MyEventSubscriber());
$entityManager = EntityManager::create($dbOpts, $config, $eventManager);
You can also retrieve the event manager instance after the
EntityManager was created:
.. code-block:: php
<?php
$entityManager->getEventManager()->addEventListener(array(Events::preUpdate), new MyEventListener());
$entityManager->getEventManager()->addEventSubscriber(new MyEventSubscriber());
.. _reference-events-implementing-listeners:
Implementing Event Listeners
----------------------------
This section explains what is and what is not allowed during
specific lifecycle events of the UnitOfWork. Although you get
passed the EntityManager in all of these events, you have to follow
these restrictions very carefully since operations in the wrong
event may produce lots of different errors, such as inconsistent
data and lost updates/persists/removes.
For the described events that are also lifecycle callback events
the restrictions apply as well, with the additional restriction
that (prior to version 2.4) you do not have access to the
EntityManager or UnitOfWork APIs inside these events.
prePersist
~~~~~~~~~~
There are two ways for the ``prePersist`` event to be triggered.
One is obviously when you call ``EntityManager#persist()``. The
event is also called for all cascaded associations.
There is another way for ``prePersist`` to be called, inside the
``flush()`` method when changes to associations are computed and
this association is marked as cascade persist. Any new entity found
during this operation is also persisted and ``prePersist`` called
on it. This is called "persistence by reachability".
In both cases you get passed a ``LifecycleEventArgs`` instance
which has access to the entity and the entity manager.
The following restrictions apply to ``prePersist``:
- If you are using a PrePersist Identity Generator such as
sequences the ID value will *NOT* be available within any
PrePersist events.
- Doctrine will not recognize changes made to relations in a prePersist
event. This includes modifications to
collections such as additions, removals or replacement.
preRemove
~~~~~~~~~
The ``preRemove`` event is called on every entity when its passed
to the ``EntityManager#remove()`` method. It is cascaded for all
associations that are marked as cascade delete.
There are no restrictions to what methods can be called inside the
``preRemove`` event, except when the remove method itself was
called during a flush operation.
preFlush
~~~~~~~~
``preFlush`` is called at ``EntityManager#flush()`` before
anything else. ``EntityManager#flush()`` can be called safely
inside its listeners.
.. code-block:: php
<?php
use Doctrine\ORM\Event\PreFlushEventArgs;
class PreFlushExampleListener
{
public function preFlush(PreFlushEventArgs $args)
{
// ...
}
}
onFlush
~~~~~~~
OnFlush is a very powerful event. It is called inside
``EntityManager#flush()`` after the changes to all the managed
entities and their associations have been computed. This means, the
``onFlush`` event has access to the sets of:
- Entities scheduled for insert
- Entities scheduled for update
- Entities scheduled for removal
- Collections scheduled for update
- Collections scheduled for removal
To make use of the onFlush event you have to be familiar with the
internal UnitOfWork API, which grants you access to the previously
mentioned sets. See this example:
.. code-block:: php
<?php
class FlushExampleListener
{
public function onFlush(OnFlushEventArgs $eventArgs)
{
$em = $eventArgs->getEntityManager();
$uow = $em->getUnitOfWork();
foreach ($uow->getScheduledEntityInsertions() as $entity) {
}
foreach ($uow->getScheduledEntityUpdates() as $entity) {
}
foreach ($uow->getScheduledEntityDeletions() as $entity) {
}
foreach ($uow->getScheduledCollectionDeletions() as $col) {
}
foreach ($uow->getScheduledCollectionUpdates() as $col) {
}
}
}
The following restrictions apply to the onFlush event:
- If you create and persist a new entity in ``onFlush``, then
calling ``EntityManager#persist()`` is not enough.
You have to execute an additional call to
``$unitOfWork->computeChangeSet($classMetadata, $entity)``.
- Changing primitive fields or associations requires you to
explicitly trigger a re-computation of the changeset of the
affected entity. This can be done by calling
``$unitOfWork->recomputeSingleEntityChangeSet($classMetadata, $entity)``.
postFlush
~~~~~~~~~
``postFlush`` is called at the end of ``EntityManager#flush()``.
``EntityManager#flush()`` can **NOT** be called safely inside its listeners.
.. code-block:: php
<?php
use Doctrine\ORM\Event\PostFlushEventArgs;
class PostFlushExampleListener
{
public function postFlush(PostFlushEventArgs $args)
{
// ...
}
}
preUpdate
~~~~~~~~~
PreUpdate is the most restrictive to use event, since it is called
right before an update statement is called for an entity inside the
``EntityManager#flush()`` method.
Changes to associations of the updated entity are never allowed in
this event, since Doctrine cannot guarantee to correctly handle
referential integrity at this point of the flush operation. This
event has a powerful feature however, it is executed with a
``PreUpdateEventArgs`` instance, which contains a reference to the
computed change-set of this entity.
This means you have access to all the fields that have changed for
this entity with their old and new value. The following methods are
available on the ``PreUpdateEventArgs``:
- ``getEntity()`` to get access to the actual entity.
- ``getEntityChangeSet()`` to get a copy of the changeset array.
Changes to this returned array do not affect updating.
- ``hasChangedField($fieldName)`` to check if the given field name
of the current entity changed.
- ``getOldValue($fieldName)`` and ``getNewValue($fieldName)`` to
access the values of a field.
- ``setNewValue($fieldName, $value)`` to change the value of a
field to be updated.
A simple example for this event looks like:
.. code-block:: php
<?php
class NeverAliceOnlyBobListener
{
public function preUpdate(PreUpdateEventArgs $eventArgs)
{
if ($eventArgs->getEntity() instanceof User) {
if ($eventArgs->hasChangedField('name') && $eventArgs->getNewValue('name') == 'Alice') {
$eventArgs->setNewValue('name', 'Bob');
}
}
}
}
You could also use this listener to implement validation of all the
fields that have changed. This is more efficient than using a
lifecycle callback when there are expensive validations to call:
.. code-block:: php
<?php
class ValidCreditCardListener
{
public function preUpdate(PreUpdateEventArgs $eventArgs)
{
if ($eventArgs->getEntity() instanceof Account) {
if ($eventArgs->hasChangedField('creditCard')) {
$this->validateCreditCard($eventArgs->getNewValue('creditCard'));
}
}
}
private function validateCreditCard($no)
{
// throw an exception to interrupt flush event. Transaction will be rolled back.
}
}
Restrictions for this event:
- Changes to associations of the passed entities are not
recognized by the flush operation anymore.
- Changes to fields of the passed entities are not recognized by
the flush operation anymore, use the computed change-set passed to
the event to modify primitive field values, e.g. use
``$eventArgs->setNewValue($field, $value);`` as in the Alice to Bob example above.
- Any calls to ``EntityManager#persist()`` or
``EntityManager#remove()``, even in combination with the UnitOfWork
API are strongly discouraged and don't work as expected outside the
flush operation.
postUpdate, postRemove, postPersist
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The three post events are called inside ``EntityManager#flush()``.
Changes in here are not relevant to the persistence in the
database, but you can use these events to alter non-persistable items,
like non-mapped fields, logging or even associated classes that are
directly mapped by Doctrine.
postLoad
~~~~~~~~
This event is called after an entity is constructed by the
EntityManager.
Entity listeners
----------------
.. versionadded:: 2.4
An entity listener is a lifecycle listener class used for an entity.
- The entity listener's mapping may be applied to an entity class or mapped superclass.
- An entity listener is defined by mapping the entity class with the corresponding mapping.
.. configuration-block::
.. code-block:: php
<?php
namespace MyProject\Entity;
/** @Entity @EntityListeners({"UserListener"}) */
class User
{
// ....
}
.. code-block:: xml
<doctrine-mapping>
<entity name="MyProject\Entity\User">
<entity-listeners>
<entity-listener class="UserListener"/>
</entity-listeners>
<!-- .... -->
</entity>
</doctrine-mapping>
.. code-block:: yaml
MyProject\Entity\User:
type: entity
entityListeners:
UserListener:
# ....
.. _reference-entity-listeners:
Entity listeners class
~~~~~~~~~~~~~~~~~~~~~~
An ``Entity Listener`` could be any class, by default it should be a class with a no-arg constructor.
- Different from :ref:`reference-events-implementing-listeners` an ``Entity Listener`` is invoked just to the specified entity
- An entity listener method receives two arguments, the entity instance and the lifecycle event.
- The callback method can be defined by naming convention or specifying a method mapping.
- When a listener mapping is not given the parser will use the naming convention to look for a matching method,
e.g. it will look for a public ``preUpdate()`` method if you are listening to the ``preUpdate`` event.
- When a listener mapping is given the parser will not look for any methods using the naming convention.
.. code-block:: php
<?php
class UserListener
{
public function preUpdate(User $user, PreUpdateEventArgs $event)
{
// Do something on pre update.
}
}
To define a specific event listener method (one that does not follow the naming convention)
you need to map the listener method using the event type mapping:
.. configuration-block::
.. code-block:: php
<?php
class UserListener
{
/** @PrePersist */
public function prePersistHandler(User $user, LifecycleEventArgs $event) { // ... }
/** @PostPersist */
public function postPersistHandler(User $user, LifecycleEventArgs $event) { // ... }
/** @PreUpdate */
public function preUpdateHandler(User $user, PreUpdateEventArgs $event) { // ... }
/** @PostUpdate */
public function postUpdateHandler(User $user, LifecycleEventArgs $event) { // ... }
/** @PostRemove */
public function postRemoveHandler(User $user, LifecycleEventArgs $event) { // ... }
/** @PreRemove */
public function preRemoveHandler(User $user, LifecycleEventArgs $event) { // ... }
/** @PreFlush */
public function preFlushHandler(User $user, PreFlushEventArgs $event) { // ... }
/** @PostLoad */
public function postLoadHandler(User $user, LifecycleEventArgs $event) { // ... }
}
.. code-block:: xml
<doctrine-mapping>
<entity name="MyProject\Entity\User">
<entity-listeners>
<entity-listener class="UserListener">
<lifecycle-callback type="preFlush" method="preFlushHandler"/>
<lifecycle-callback type="postLoad" method="postLoadHandler"/>
<lifecycle-callback type="postPersist" method="postPersistHandler"/>
<lifecycle-callback type="prePersist" method="prePersistHandler"/>
<lifecycle-callback type="postUpdate" method="postUpdateHandler"/>
<lifecycle-callback type="preUpdate" method="preUpdateHandler"/>
<lifecycle-callback type="postRemove" method="postRemoveHandler"/>
<lifecycle-callback type="preRemove" method="preRemoveHandler"/>
</entity-listener>
</entity-listeners>
<!-- .... -->
</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]
# ....
Entity listeners resolver
~~~~~~~~~~~~~~~~~~~~~~~~~~
Doctrine invokes the listener resolver to get the listener instance.
- A resolver allows you register a specific entity listener instance.
- You can also implement your own resolver by extending ``Doctrine\ORM\Mapping\DefaultEntityListenerResolver`` or implementing ``Doctrine\ORM\Mapping\EntityListenerResolver``
Specifying an entity listener instance :
.. code-block:: php
<?php
// User.php
/** @Entity @EntityListeners({"UserListener"}) */
class User
{
// ....
}
// UserListener.php
class UserListener
{
public function __construct(MyService $service)
{
$this->service = $service;
}
public function preUpdate(User $user, PreUpdateEventArgs $event)
{
$this->service->doSomething($user);
}
}
// register a entity listener.
$listener = $container->get('user_listener');
$em->getConfiguration()->getEntityListenerResolver()->register($listener);
Implementing your own resolver :
.. code-block:: php
<?php
class MyEntityListenerResolver extends \Doctrine\ORM\Mapping\DefaultEntityListenerResolver
{
public function __construct($container)
{
$this->container = $container;
}
public function resolve($className)
{
// resolve the service id by the given class name;
$id = 'user_listener';
return $this->container->get($id);
}
}
// Configure the listener resolver only before instantiating the EntityManager
$configurations->setEntityListenerResolver(new MyEntityListenerResolver);
EntityManager::create(.., $configurations, ..);
Load ClassMetadata Event
------------------------
When the mapping information for an entity is read, it is populated
in to a ``ClassMetadataInfo`` instance. You can hook in to this
process and manipulate the instance.
.. code-block:: php
<?php
$test = new TestEvent();
$metadataFactory = $em->getMetadataFactory();
$evm = $em->getEventManager();
$evm->addEventListener(Events::loadClassMetadata, $test);
class TestEvent
{
public function loadClassMetadata(\Doctrine\ORM\Event\LoadClassMetadataEventArgs $eventArgs)
{
$classMetadata = $eventArgs->getClassMetadata();
$fieldMapping = array(
'fieldName' => 'about',
'type' => 'string',
'length' => 255
);
$classMetadata->mapField($fieldMapping);
}
}

224
docs/en/reference/faq.rst Normal file
View File

@@ -0,0 +1,224 @@
Frequently Asked Questions
==========================
.. note::
This FAQ is a work in progress. We will add lots of questions and not answer them right away just to remember
what is often asked. If you stumble across an unanswered question please write a mail to the mailing-list or
join the #doctrine channel on Freenode IRC.
Database Schema
---------------
How do I set the charset and collation for MySQL tables?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can't set these values inside the annotations, yml or xml mapping files. To make a database
work with the default charset and collation you should configure MySQL to use it as default charset,
or create the database with charset and collation details. This way they get inherited to all newly
created database tables and columns.
Entity Classes
--------------
I access a variable and its null, what is wrong?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If this variable is a public variable then you are violating one of the criteria for entities.
All properties have to be protected or private for the proxy object pattern to work.
How can I add default values to a column?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Doctrine does not support to set the default values in columns through the "DEFAULT" keyword in SQL.
This is not necessary however, you can just use your class properties as default values. These are then used
upon insert:
.. code-block:: php
class User
{
const STATUS_DISABLED = 0;
const STATUS_ENABLED = 1;
private $algorithm = "sha1";
private $status = self:STATUS_DISABLED;
}
.
Mapping
-------
Why do I get exceptions about unique constraint failures during ``$em->flush()``?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Doctrine does not check if you are re-adding entities with a primary key that already exists
or adding entities to a collection twice. You have to check for both conditions yourself
in the code before calling ``$em->flush()`` if you know that unique constraint failures
can occur.
In `Symfony2 <http://www.symfony.com>`_ for example there is a Unique Entity Validator
to achieve this task.
For collections you can check with ``$collection->contains($entity)`` if an entity is already
part of this collection. For a FETCH=LAZY collection this will initialize the collection,
however for FETCH=EXTRA_LAZY this method will use SQL to determine if this entity is already
part of the collection.
Associations
------------
What is wrong when I get an InvalidArgumentException "A new entity was found through the relationship.."?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This exception is thrown during ``EntityManager#flush()`` when there exists an object in the identity map
that contains a reference to an object that Doctrine does not know about. Say for example you grab
a "User"-entity from the database with a specific id and set a completely new object into one of the associations
of the User object. If you then call ``EntityManager#flush()`` without letting Doctrine know about
this new object using ``EntityManager#persist($newObject)`` you will see this exception.
You can solve this exception by:
* Calling ``EntityManager#persist($newObject)`` on the new object
* Using cascade=persist on the association that contains the new object
How can I filter an association?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Natively you can't filter associations in 2.0 and 2.1. You should use DQL queries to query for the filtered set of entities.
I call clear() on a One-To-Many collection but the entities are not deleted
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This is an expected behavior that has to do with the inverse/owning side handling of Doctrine.
By definition a One-To-Many association is on the inverse side, that means changes to it
will not be recognized by Doctrine.
If you want to perform the equivalent of the clear operation you have to iterate the
collection and set the owning side many-to-one reference to NULL as well to detach all entities
from the collection. This will trigger the appropriate UPDATE statements on the database.
How can I add columns to a many-to-many table?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The many-to-many association is only supporting foreign keys in the table definition
To work with many-to-many tables containing extra columns you have to use the
foreign keys as primary keys feature of Doctrine introduced in version 2.1.
See :doc:`the tutorial on composite primary keys for more information<../tutorials/composite-primary-keys>`.
How can i paginate fetch-joined collections?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you are issuing a DQL statement that fetches a collection as well you cannot easily iterate
over this collection using a LIMIT statement (or vendor equivalent).
Doctrine does not offer a solution for this out of the box but there are several extensions
that do:
* `DoctrineExtensions <http://github.com/beberlei/DoctrineExtensions>`_
* `Pagerfanta <http://github.com/whiteoctober/pagerfanta>`_
Why does pagination not work correctly with fetch joins?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Pagination in Doctrine uses a LIMIT clause (or vendor equivalent) to restrict the results.
However when fetch-joining this is not returning the correct number of results since joining
with a one-to-many or many-to-many association multiplies the number of rows by the number
of associated entities.
See the previous question for a solution to this task.
Inheritance
-----------
Can I use Inheritance with Doctrine 2?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Yes, you can use Single- or Joined-Table Inheritance in Doctrine 2.
See the documentation chapter on :doc:`inheritance mapping <inheritance-mapping>` for
the details.
Why does Doctrine not create proxy objects for my inheritance hierarchy?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you set a many-to-one or one-to-one association target-entity to any parent class of
an inheritance hierarchy Doctrine does not know what PHP class the foreign is actually of.
To find this out it has to execute a SQL query to look this information up in the database.
EntityGenerator
---------------
Why does the EntityGenerator not do X?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The EntityGenerator is not a full fledged code-generator that solves all tasks. Code-Generation
is not a first-class priority in Doctrine 2 anymore (compared to Doctrine 1). The EntityGenerator
is supposed to kick-start you, but not towards 100%.
Why does the EntityGenerator not generate inheritance correctly?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Just from the details of the discriminator map the EntityGenerator cannot guess the inheritance hierarchy.
This is why the generation of inherited entities does not fully work. You have to adjust some additional
code to get this one working correctly.
Performance
-----------
Why is an extra SQL query executed every time I fetch an entity with a one-to-one relation?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If Doctrine detects that you are fetching an inverse side one-to-one association
it has to execute an additional query to load this object, because it cannot know
if there is no such object (setting null) or if it should set a proxy and which id this proxy has.
To solve this problem currently a query has to be executed to find out this information.
Doctrine Query Language
-----------------------
What is DQL?
~~~~~~~~~~~~
DQL stands for Doctrine Query Language, a query language that very much looks like SQL
but has some important benefits when using Doctrine:
- It uses class names and fields instead of tables and columns, separating concerns between backend and your object model.
- It utilizes the metadata defined to offer a range of shortcuts when writing. For example you do not have to specify the ON clause of joins, since Doctrine already knows about them.
- It adds some functionality that is related to object management and transforms them into SQL.
It also has some drawbacks of course:
- The syntax is slightly different to SQL so you have to learn and remember the differences.
- To be vendor independent it can only implement a subset of all the existing SQL dialects. Vendor specific functionality and optimizations cannot be used through DQL unless implemented by you explicitly.
- For some DQL constructs subselects are used which are known to be slow in MySQL.
Can I sort by a function (for example ORDER BY RAND()) in DQL?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
No, it is not supported to sort by function in DQL. If you need this functionality you should either
use a native-query or come up with another solution. As a side note: Sorting with ORDER BY RAND() is painfully slow
starting with 1000 rows.
A Query fails, how can I debug it?
----------------------------------
First, if you are using the QueryBuilder you can use
``$queryBuilder->getDQL()`` to get the DQL string of this query. The
corresponding SQL you can get from the Query instance by calling
``$query->getSQL()``.
.. code-block:: php
<?php
$dql = "SELECT u FROM User u";
$query = $entityManager->createQuery($dql);
var_dump($query->getSQL());
$qb = $entityManager->createQueryBuilder();
$qb->select('u')->from('User', 'u');
var_dump($qb->getDQL());

View File

@@ -0,0 +1,93 @@
Filters
=======
.. versionadded:: 2.2
Doctrine 2.2 features a filter system that allows the developer to add SQL to
the conditional clauses of queries, regardless the place where the SQL is
generated (e.g. from a DQL query, or by loading associated entities).
The filter functionality works on SQL level. Whether a SQL query is generated
in a Persister, during lazy loading, in extra lazy collections or from DQL.
Each time the system iterates over all the enabled filters, adding a new SQL
part as a filter returns.
By adding SQL to the conditional clauses of queries, the filter system filters
out rows belonging to the entities at the level of the SQL result set. This
means that the filtered entities are never hydrated (which can be expensive).
Example filter class
--------------------
Throughout this document the example ``MyLocaleFilter`` class will be used to
illustrate how the filter feature works. A filter class must extend the base
``Doctrine\ORM\Query\Filter\SQLFilter`` class and implement the ``addFilterConstraint``
method. The method receives the ``ClassMetadata`` of the filtered entity and the
table alias of the SQL table of the entity.
.. note::
In the case of joined or single table inheritance, you always get passed the ClassMetadata of the
inheritance root. This is necessary to avoid edge cases that would break the SQL when applying the filters.
Parameters for the query should be set on the filter object by
``SQLFilter#setParameter()``. Only parameters set via this function can be used
in filters. The ``SQLFilter#getParameter()`` function takes care of the
proper quoting of parameters.
.. code-block:: php
<?php
namespace Example;
use Doctrine\ORM\Mapping\ClassMetaData,
Doctrine\ORM\Query\Filter\SQLFilter;
class MyLocaleFilter extends SQLFilter
{
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
// Check if the entity implements the LocalAware interface
if (!$targetEntity->reflClass->implementsInterface('LocaleAware')) {
return "";
}
return $targetTableAlias.'.locale = ' . $this->getParameter('locale'); // getParameter applies quoting automatically
}
}
Configuration
-------------
Filter classes are added to the configuration as following:
.. code-block:: php
<?php
$config->addFilter("locale", "\Doctrine\Tests\ORM\Functional\MyLocaleFilter");
The ``Configuration#addFilter()`` method takes a name for the filter and the name of the
class responsible for the actual filtering.
Disabling/Enabling Filters and Setting Parameters
---------------------------------------------------
Filters can be disabled and enabled via the ``FilterCollection`` which is
stored in the ``EntityManager``. The ``FilterCollection#enable($name)`` method
will retrieve the filter object. You can set the filter parameters on that
object.
.. code-block:: php
<?php
$filter = $em->getFilters()->enable("locale");
$filter->setParameter('locale', 'en');
// Disable it
$filter = $em->getFilters()->disable("locale");
.. warning::
Disabling and enabling filters has no effect on managed entities. If you
want to refresh or reload an object after having modified a filter or the
FilterCollection, then you should clear the EntityManager and re-fetch your
entities, having the new rules for filtering applied.

View File

@@ -0,0 +1,68 @@
Improving Performance
=====================
Bytecode Cache
--------------
It is highly recommended to make use of a bytecode cache like APC.
A bytecode cache removes the need for parsing PHP code on every
request and can greatly improve performance.
"If you care about performance and don't use a bytecode
cache then you don't really care about performance. Please get one
and start using it."
*Stas Malyshev, Core Contributor to PHP and Zend Employee*
Metadata and Query caches
-------------------------
As already mentioned earlier in the chapter about configuring
Doctrine, it is strongly discouraged to use Doctrine without a
Metadata and Query cache (preferably with APC or Memcache as the
cache driver). Operating Doctrine without these caches means
Doctrine will need to load your mapping information on every single
request and has to parse each DQL query on every single request.
This is a waste of resources.
Alternative Query Result Formats
--------------------------------
Make effective use of the available alternative query result
formats like nested array graphs or pure scalar results, especially
in scenarios where data is loaded for read-only purposes.
Read-Only Entities
------------------
Starting with Doctrine 2.1 you can mark entities as read only (See metadata mapping
references for details). This means that the entity marked as read only is never considered
for updates, which means when you call flush on the EntityManager these entities are skipped
even if properties changed. Read-Only allows to persist new entities of a kind and remove existing
ones, they are just not considered for updates.
Extra-Lazy Collections
----------------------
If entities hold references to large collections you will get performance and memory problems initializing them.
To solve this issue you can use the EXTRA_LAZY fetch-mode feature for collections. See the :doc:`tutorial <../tutorials/extra-lazy-associations>`
for more information on how this fetch mode works.
Temporarily change fetch mode in DQL
------------------------------------
See :ref:`Doctrine Query Language chapter <dql-temporarily-change-fetch-mode>`
Apply Best Practices
--------------------
A lot of the points mentioned in the Best Practices chapter will
also positively affect the performance of Doctrine.
Change Tracking policies
------------------------
See: :doc:`Change Tracking Policies <reference/change-tracking-policies>`

View File

@@ -0,0 +1,605 @@
Inheritance Mapping
===================
Mapped Superclasses
-------------------
A mapped superclass is an abstract or concrete class that provides
persistent entity state and mapping information for its subclasses,
but which is not itself an entity. Typically, the purpose of such a
mapped superclass is to define state and mapping information that
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).
.. note::
A mapped superclass cannot be an entity, it is not query-able and
persistent relationships defined by a mapped superclass must be
unidirectional (with an owning side only). This means that One-To-Many
associations are not possible on a mapped superclass at all.
Furthermore Many-To-Many associations are only possible if the
mapped superclass is only used in exactly one entity at the moment.
For further support of inheritance, the single or
joined table inheritance features have to be used.
Example:
.. code-block:: php
<?php
/** @MappedSuperclass */
class MappedSuperclassBase
{
/** @Column(type="integer") */
protected $mapped1;
/** @Column(type="string") */
protected $mapped2;
/**
* @OneToOne(targetEntity="MappedSuperclassRelated1")
* @JoinColumn(name="related1_id", referencedColumnName="id")
*/
protected $mappedRelated1;
// ... more fields and methods
}
/** @Entity */
class EntitySubClass extends MappedSuperclassBase
{
/** @Id @Column(type="integer") */
private $id;
/** @Column(type="string") */
private $name;
// ... more fields and methods
}
The DDL for the corresponding database schema would look something
like this (this is for SQLite):
.. code-block:: sql
CREATE TABLE EntitySubClass (mapped1 INTEGER NOT NULL, mapped2 TEXT NOT NULL, id INTEGER NOT NULL, name TEXT NOT NULL, related1_id INTEGER DEFAULT NULL, PRIMARY KEY(id))
As you can see from this DDL snippet, there is only a single table
for the entity subclass. All the mappings from the mapped
superclass were inherited to the subclass as if they had been
defined on that class directly.
Single Table Inheritance
------------------------
`Single Table Inheritance <http://martinfowler.com/eaaCatalog/singleTableInheritance.html>`_
is an inheritance mapping strategy where all classes of a hierarchy
are mapped to a single database table. In order to distinguish
which row represents which type in the hierarchy a so-called
discriminator column is used.
Example:
.. configuration-block::
.. code-block:: php
<?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
Things to note:
- The @InheritanceType, @DiscriminatorColumn and @DiscriminatorMap
must be specified on the topmost class that is part of the mapped
entity hierarchy.
- The @DiscriminatorMap specifies which values of the
discriminator column identify a row as being of a certain type. In
the case above a value of "person" identifies a row as being of
type ``Person`` and "employee" identifies a row as being of type
``Employee``.
- All entity classes that is part of the mapped entity hierarchy
(including the topmost class) should be specified in the
@DiscriminatorMap. In the case above Person class included.
- The names of the classes in the discriminator map do not need to
be fully qualified if the classes are contained in the same
namespace as the entity class on which the discriminator map is
applied.
- If no discriminator map is provided, then the map is generated
automatically. The automatically generated discriminator map
contains the lowercase short name of each class as key.
Design-time considerations
~~~~~~~~~~~~~~~~~~~~~~~~~~
This mapping approach works well when the type hierarchy is fairly
simple and stable. Adding a new type to the hierarchy and adding
fields to existing supertypes simply involves adding new columns to
the table, though in large deployments this may have an adverse
impact on the index and column layout inside the database.
Performance impact
~~~~~~~~~~~~~~~~~~
This strategy is very efficient for querying across all types in
the hierarchy or for specific types. No table joins are required,
only a WHERE clause listing the type identifiers. In particular,
relationships involving types that employ this mapping strategy are
very performant.
There is a general performance consideration with Single Table
Inheritance: If the target-entity of a many-to-one or one-to-one
association is an STI entity, it is preferable for performance reasons that it
be a leaf entity in the inheritance hierarchy, (ie. have no subclasses).
Otherwise Doctrine *CANNOT* create proxy instances
of this entity and will *ALWAYS* load the entity eagerly.
SQL Schema considerations
~~~~~~~~~~~~~~~~~~~~~~~~~
For Single-Table-Inheritance to work in scenarios where you are
using either a legacy database schema or a self-written database
schema you have to make sure that all columns that are not in the
root entity but in any of the different sub-entities has to allows
null values. Columns that have NOT NULL constraints have to be on
the root entity of the single-table inheritance hierarchy.
Class Table Inheritance
-----------------------
`Class Table Inheritance <http://martinfowler.com/eaaCatalog/classTableInheritance.html>`_
is an inheritance mapping strategy where each class in a hierarchy
is mapped to several tables: its own table and the tables of all
parent classes. The table of a child class is linked to the table
of a parent class through a foreign key constraint. Doctrine 2
implements this strategy through the use of a discriminator column
in the topmost table of the hierarchy because this is the easiest
way to achieve polymorphic queries with Class Table Inheritance.
Example:
.. code-block:: php
<?php
namespace MyProject\Model;
/**
* @Entity
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
*/
class Person
{
// ...
}
/** @Entity */
class Employee extends Person
{
// ...
}
Things to note:
- The @InheritanceType, @DiscriminatorColumn and @DiscriminatorMap
must be specified on the topmost class that is part of the mapped
entity hierarchy.
- The @DiscriminatorMap specifies which values of the
discriminator column identify a row as being of which type. In the
case above a value of "person" identifies a row as being of type
``Person`` and "employee" identifies a row as being of type
``Employee``.
- The names of the classes in the discriminator map do not need to
be fully qualified if the classes are contained in the same
namespace as the entity class on which the discriminator map is
applied.
- If no discriminator map is provided, then the map is generated
automatically. The automatically generated discriminator map
contains the lowercase short name of each class as key.
.. note::
When you do not use the SchemaTool to generate the
required SQL you should know that deleting a class table
inheritance makes use of the foreign key property
``ON DELETE CASCADE`` in all database implementations. A failure to
implement this yourself will lead to dead rows in the database.
Design-time considerations
~~~~~~~~~~~~~~~~~~~~~~~~~~
Introducing a new type to the hierarchy, at any level, simply
involves interjecting a new table into the schema. Subtypes of that
type will automatically join with that new type at runtime.
Similarly, modifying any entity type in the hierarchy by adding,
modifying or removing fields affects only the immediate table
mapped to that type. This mapping strategy provides the greatest
flexibility at design time, since changes to any type are always
limited to that type's dedicated table.
Performance impact
~~~~~~~~~~~~~~~~~~
This strategy inherently requires multiple JOIN operations to
perform just about any query which can have a negative impact on
performance, especially with large tables and/or large hierarchies.
When partial objects are allowed, either globally or on the
specific query, then querying for any type will not cause the
tables of subtypes to be OUTER JOINed which can increase
performance but the resulting partial objects will not fully load
themselves on access of any subtype fields, so accessing fields of
subtypes after such a query is not safe.
There is a general performance consideration with Class Table
Inheritance: If the target-entity of a many-to-one or one-to-one
association is a CTI entity, it is preferable for performance reasons that it
be a leaf entity in the inheritance hierarchy, (ie. have no subclasses).
Otherwise Doctrine *CANNOT* create proxy instances
of this entity and will *ALWAYS* load the entity eagerly.
SQL Schema considerations
~~~~~~~~~~~~~~~~~~~~~~~~~
For each entity in the Class-Table Inheritance hierarchy all the
mapped fields have to be columns on the table of this entity.
Additionally each child table has to have an id column that matches
the id column definition on the root table (except for any sequence
or auto-increment details). Furthermore each child table has to
have a foreign key pointing from the id column to the root table id
column and cascading on delete.
.. _inheritence_mapping_overrides:
Overrides
---------
Used to override a mapping for an entity field or relationship.
May be applied to an entity that extends a mapped superclass
to override a relationship or field mapping defined by the mapped superclass.
Association Override
~~~~~~~~~~~~~~~~~~~~
Override a mapping for an entity relationship.
Could be used by an entity that extends a mapped superclass
to override a relationship mapping defined by the mapped superclass.
Example:
.. configuration-block::
.. code-block:: php
<?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")}
* )
*/
protected $groups;
/**
* @ManyToOne(targetEntity="Address")
* @JoinColumn(name="address_id", referencedColumnName="id")
*/
protected $address;
}
// 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 -->
<doctrine-mapping>
<mapped-superclass name="MyProject\Model\User">
<!-- other fields mapping -->
<many-to-many field="groups" target-entity="Group" inversed-by="users">
<cascade>
<cascade-persist/>
<cascade-merge/>
<cascade-detach/>
</cascade>
<join-table name="users_groups">
<join-columns>
<join-column name="user_id" referenced-column-name="id" />
</join-columns>
<inverse-join-columns>
<join-column name="group_id" referenced-column-name="id" />
</inverse-join-columns>
</join-table>
</many-to-many>
</mapped-superclass>
</doctrine-mapping>
<!-- admin mapping -->
<doctrine-mapping>
<entity name="MyProject\Model\Admin">
<association-overrides>
<association-override name="groups">
<join-table name="users_admingroups">
<join-columns>
<join-column name="adminuser_id"/>
</join-columns>
<inverse-join-columns>
<join-column name="admingroup_id"/>
</inverse-join-columns>
</join-table>
</association-override>
<association-override name="address">
<join-columns>
<join-column name="adminaddress_id" referenced-column-name="id"/>
</join-columns>
</association-override>
</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:
- The "association override" specifies the overrides base on the property name.
- This feature is available for all kind of associations. (OneToOne, OneToMany, ManyToOne, ManyToMany)
- The association type *CANNOT* be changed.
- The override could redefine the joinTables or joinColumns depending on the association type.
Attribute Override
~~~~~~~~~~~~~~~~~~~~
Override the mapping of a field.
Could be used by an entity that extends a mapped superclass to override a field mapping defined by the mapped superclass.
.. configuration-block::
.. code-block:: php
<?php
// user mapping
namespace MyProject\Model;
/**
* @MappedSuperclass
*/
class User
{
/** @Id @GeneratedValue @Column(type="integer", name="user_id", length=150) */
protected $id;
/** @Column(name="user_name", nullable=true, unique=false, length=250) */
protected $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 -->
<doctrine-mapping>
<mapped-superclass name="MyProject\Model\User">
<id name="id" type="integer" column="user_id" length="150">
<generator strategy="AUTO"/>
</id>
<field name="name" column="user_name" type="string" length="250" nullable="true" unique="false" />
<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>
<!-- other fields mapping -->
</mapped-superclass>
</doctrine-mapping>
<!-- admin mapping -->
<doctrine-mapping>
<entity name="MyProject\Model\Guest">
<attribute-overrides>
<attribute-override name="id">
<field column="guest_id" length="140"/>
</attribute-override>
<attribute-override name="name">
<field column="guest_name" type="string" length="240" nullable="false" unique="true" />
</attribute-override>
</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:
- The "attribute override" specifies the overrides base on the property name.
- The column type *CANNOT* be changed. If the column type is not equal you get a ``MappingException``
- The override can redefine all the columns except the type.
Query the Type
--------------
It may happen that the entities of a special type should be queried. Because there
is no direct access to the discriminator column, Doctrine provides the
``INSTANCE OF`` construct.
The following example shows how to use ``INSTANCE OF``. There is a three level hierarchy
with a base entity ``NaturalPerson`` which is extended by ``Staff`` which in turn
is extended by ``Technician``.
Querying for the staffs without getting any technicians can be achieved by this DQL:
.. code-block:: php
<?php
$query = $em->createQuery("SELECT staff FROM MyProject\Model\Staff staff WHERE staff NOT INSTANCE OF MyProject\Model\Technician");
$staffs = $query->getResult();

View File

@@ -0,0 +1,5 @@
Installation
============
The installation chapter has moved to `Installation and Configuration
<reference/configuration>`_.

View File

@@ -0,0 +1,184 @@
Limitations and Known Issues
============================
We try to make using Doctrine2 a very pleasant experience.
Therefore we think it is very important to be honest about the
current limitations to our users. Much like every other piece of
software Doctrine2 is not perfect and far from feature complete.
This section should give you an overview of current limitations of
Doctrine 2 as well as critical known issues that you should know
about.
Current Limitations
-------------------
There is a set of limitations that exist currently which might be
solved in the future. Any of this limitations now stated has at
least one ticket in the Tracker and is discussed for future
releases.
Join-Columns with non-primary keys
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
It is not possible to use join columns pointing to non-primary keys. Doctrine will think these are the primary
keys and create lazy-loading proxies with the data, which can lead to unexpected results. Doctrine can for performance
reasons not validate the correctness of this settings at runtime but only through the Validate Schema command.
Mapping Arrays to a Join Table
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Related to the previous limitation with "Foreign Keys as
Identifier" you might be interested in mapping the same table
structure as given above to an array. However this is not yet
possible either. See the following example:
.. code-block:: sql
CREATE TABLE product (
id INTEGER,
name VARCHAR,
PRIMARY KEY(id)
);
CREATE TABLE product_attributes (
product_id INTEGER,
attribute_name VARCHAR,
attribute_value VARCHAR,
PRIMARY KEY (product_id, attribute_name)
);
This schema should be mapped to a Product Entity as follows:
.. code-block:: php
class Product
{
private $id;
private $name;
private $attributes = array();
}
Where the ``attribute_name`` column contains the key and
``attribute_value`` contains the value of each array element in
``$attributes``.
The feature request for persistence of primitive value arrays
`is described in the DDC-298 ticket <http://www.doctrine-project.org/jira/browse/DDC-298>`_.
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 <http://www.doctrine-project.org/jira/browse/DDC-875>`_ Merge can sometimes add the same entity twice into a collection
- `DDC-763 <http://www.doctrine-project.org/jira/browse/DDC-763>`_ Cascade merge on associated entities can insert too many rows through "Persistence by Reachability"
Custom Persisters
~~~~~~~~~~~~~~~~~
A Persister in Doctrine is an object that is responsible for the
hydration and write operations of an entity against the database.
Currently there is no way to overwrite the persister implementation
for a given entity, however there are several use-cases that can
benefit from custom persister implementations:
- `Add Upsert Support <http://www.doctrine-project.org/jira/browse/DDC-668>`_
- `Evaluate possible ways in which stored-procedures can be used <http://www.doctrine-project.org/jira/browse/DDC-445>`_
- The previous Filter Rules Feature Request
Persist Keys of Collections
~~~~~~~~~~~~~~~~~~~~~~~~~~~
PHP Arrays are ordered hash-maps and so should be the
``Doctrine\Common\Collections\Collection`` interface. We plan to
evaluate a feature that optionally persists and hydrates the keys
of a Collection instance.
`Ticket DDC-213 <http://www.doctrine-project.org/jira/browse/DDC-213>`_
Mapping many tables to one entity
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
It is not possible to map several equally looking tables onto one
entity. For example if you have a production and an archive table
of a certain business concept then you cannot have both tables map
to the same entity.
Behaviors
~~~~~~~~~
Doctrine 2 will **never** include a behavior system like Doctrine 1
in the core library. We don't think behaviors add more value than
they cost pain and debugging hell. Please see the many different
blog posts we have written on this topics:
- `Doctrine2 "Behaviors" in a Nutshell <http://www.doctrine-project.org/blog/doctrine2-behaviours-nutshell>`_
- `A re-usable Versionable behavior for Doctrine2 <http://www.doctrine-project.org/blog/doctrine2-versionable>`_
- `Write your own ORM on top of Doctrine2 <http://www.doctrine-project.org/blog/your-own-orm-doctrine2>`_
- `Doctrine 2 Behavioral Extensions <http://www.doctrine-project.org/blog/doctrine2-behavioral-extensions>`_
- `Doctrator <https://github.com/pablodip/doctrator`>_
Doctrine 2 has enough hooks and extension points so that **you** can
add whatever you want on top of it. None of this will ever become
core functionality of Doctrine2 however, you will have to rely on
third party extensions for magical behaviors.
Nested Set
~~~~~~~~~~
NestedSet was offered as a behavior in Doctrine 1 and will not be
included in the core of Doctrine 2. However there are already two
extensions out there that offer support for Nested Set with
Doctrine 2:
- `Doctrine2 Hierarchical-Structural Behavior <http://github.com/guilhermeblanco/Doctrine2-Hierarchical-Structural-Behavior>`_
- `Doctrine2 NestedSet <http://github.com/blt04/doctrine2-nestedset>`_
Known Issues
------------
The Known Issues section describes critical/blocker bugs and other
issues that are either complicated to fix, not fixable due to
backwards compatibility issues or where no simple fix exists (yet).
We don't plan to add every bug in the tracker there, just those
issues that can potentially cause nightmares or pain of any sort.
See the Open Bugs on Jira for more details on `bugs, improvement and feature
requests
<http://www.doctrine-project.org/jira/secure/IssueNavigator.jspa?reset=true&mode=hide&pid=10032&resolution=-1&sorter/field=updated&sorter/order=DESC>`_.
Identifier Quoting and Legacy Databases
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For compatibility reasons between all the supported vendors and
edge case problems Doctrine 2 does **NOT** do automatic identifier
quoting. This can lead to problems when trying to get
legacy-databases to work with Doctrine 2.
- You can quote column-names as described in the
:doc:`Basic-Mapping <basic-mapping>` section.
- You cannot quote join column names.
- You cannot use non [a-zA-Z0-9\_]+ characters, they will break
several SQL statements.
Having problems with these kind of column names? Many databases
support all CRUD operations on views that semantically map to
certain tables. You can create views for all your problematic
tables and column names to avoid the legacy quoting nightmare.
Microsoft SQL Server and Doctrine "datetime"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Doctrine assumes that you use ``DateTime2`` data-types. If your legacy database contains DateTime
datatypes then you have to add your own data-type (see Basic Mapping for an example).
MySQL with MyISAM tables
~~~~~~~~~~~~~~~~~~~~~~~~
Doctrine cannot provide atomic operations when calling ``EntityManager#flush()`` if one
of the tables involved uses the storage engine MyISAM. You must use InnoDB or
other storage engines that support transactions if you need integrity.

View File

@@ -0,0 +1,194 @@
Metadata Drivers
================
The heart of an object relational mapper is the mapping information
that glues everything together. It instructs the EntityManager how
it should behave when dealing with the different entities.
Core Metadata Drivers
---------------------
Doctrine provides a few different ways for you to specify your
metadata:
- **XML files** (XmlDriver)
- **Class DocBlock Annotations** (AnnotationDriver)
- **YAML files** (YamlDriver)
- **PHP Code in files or static functions** (PhpDriver)
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``
instances. So in the end, Doctrine only ever has to work with the
API of the ``ClassMetadata`` class to get mapping information for
an entity.
.. note::
The populated ``ClassMetadata`` instances are also cached
so in a production environment the parsing and populating only ever
happens once. You can configure the metadata cache implementation
using the ``setMetadataCacheImpl()`` method on the
``Doctrine\ORM\Configuration`` class:
.. code-block:: php
<?php
$em->getConfiguration()->setMetadataCacheImpl(new ApcCache());
If you want to use one of the included core metadata drivers you
just need to configure it. All the drivers are in the
``Doctrine\ORM\Mapping\Driver`` namespace:
.. code-block:: php
<?php
$driver = new \Doctrine\ORM\Mapping\Driver\XmlDriver('/path/to/mapping/files');
$em->getConfiguration()->setMetadataDriverImpl($driver);
Implementing Metadata Drivers
-----------------------------
In addition to the included metadata drivers you can very easily
implement your own. All you need to do is define a class which
implements the ``Driver`` interface:
.. code-block:: php
<?php
namespace Doctrine\ORM\Mapping\Driver;
use Doctrine\ORM\Mapping\ClassMetadataInfo;
interface Driver
{
/**
* Loads the metadata for the specified class into the provided container.
*
* @param string $className
* @param ClassMetadataInfo $metadata
*/
function loadMetadataForClass($className, ClassMetadataInfo $metadata);
/**
* Gets the names of all mapped classes known to this driver.
*
* @return array The names of all mapped classes known to this driver.
*/
function getAllClassNames();
/**
* Whether the class with the specified name should have its metadata loaded.
* This is only the case if it is either mapped as an Entity or a
* MappedSuperclass.
*
* @param string $className
* @return boolean
*/
function isTransient($className);
}
If you want to write a metadata driver to parse information from
some file format we've made your life a little easier by providing
the ``AbstractFileDriver`` implementation for you to extend from:
.. code-block:: php
<?php
class MyMetadataDriver extends AbstractFileDriver
{
/**
* {@inheritdoc}
*/
protected $_fileExtension = '.dcm.ext';
/**
* {@inheritdoc}
*/
public function loadMetadataForClass($className, ClassMetadataInfo $metadata)
{
$data = $this->_loadMappingFile($file);
// populate ClassMetadataInfo instance from $data
}
/**
* {@inheritdoc}
*/
protected function _loadMappingFile($file)
{
// parse contents of $file and return php data structure
}
}
.. note::
When using the ``AbstractFileDriver`` it requires that you
only have one entity defined per file and the file named after the
class described inside where namespace separators are replaced by
periods. So if you have an entity named ``Entities\User`` and you
wanted to write a mapping file for your driver above you would need
to name the file ``Entities.User.dcm.ext`` for it to be
recognized.
Now you can use your ``MyMetadataDriver`` implementation by setting
it with the ``setMetadataDriverImpl()`` method:
.. code-block:: php
<?php
$driver = new MyMetadataDriver('/path/to/mapping/files');
$em->getConfiguration()->setMetadataDriverImpl($driver);
ClassMetadata
-------------
The last piece you need to know and understand about metadata in
Doctrine 2 is the API of the ``ClassMetadata`` classes. You need to
be familiar with them in order to implement your own drivers but
more importantly to retrieve mapping information for a certain
entity when needed.
You have all the methods you need to manually specify the mapping
information instead of using some mapping file to populate it from.
The base ``ClassMetadataInfo`` class is responsible for only data
storage and is not meant for runtime use. It does not require that
the class actually exists yet so it is useful for describing some
entity before it exists and using that information to generate for
example the entities themselves. The class ``ClassMetadata``
extends ``ClassMetadataInfo`` and adds some functionality required
for runtime usage and requires that the PHP class is present and
can be autoloaded.
You can read more about the API of the ``ClassMetadata`` classes in
the PHP Mapping chapter.
Getting ClassMetadata Instances
-------------------------------
If you want to get the ``ClassMetadata`` instance for an entity in
your project to programmatically use some mapping information to
generate some HTML or something similar you can retrieve it through
the ``ClassMetadataFactory``:
.. code-block:: php
<?php
$cmf = $em->getMetadataFactory();
$class = $cmf->getMetadataFor('MyEntityName');
Now you can learn about the entity and use the data stored in the
``ClassMetadata`` instance to get all mapped fields for example and
iterate over them:
.. code-block:: php
<?php
foreach ($class->fieldMappings as $fieldMapping) {
echo $fieldMapping['fieldName'] . "\n";
}

View File

@@ -0,0 +1,150 @@
Implementing a NamingStrategy
==============================
.. versionadded:: 2.3
Using a naming strategy you can provide rules for automatically generating
database identifiers, columns and tables names
when the table/column name is not given.
This feature helps reduce the verbosity of the mapping document,
eliminating repetitive noise (eg: ``TABLE_``).
Configuring a naming strategy
-----------------------------
The default strategy used by Doctrine is quite minimal.
By default the ``Doctrine\ORM\Mapping\DefaultNamingStrategy``
uses the simple class name and the attributes names to generate tables and columns
You can specify a different strategy by calling ``Doctrine\ORM\Configuration#setNamingStrategy()`` :
.. code-block:: php
<?php
$namingStrategy = new MyNamingStrategy();
$configuration()->setNamingStrategy($namingStrategy);
Underscore naming strategy
---------------------------
``\Doctrine\ORM\Mapping\UnderscoreNamingStrategy`` is a built-in strategy
that might be a useful if you want to use a underlying convention.
.. code-block:: php
<?php
$namingStrategy = new \Doctrine\ORM\Mapping\UnderscoreNamingStrategy(CASE_UPPER);
$configuration()->setNamingStrategy($namingStrategy);
Then SomeEntityName will generate the table SOME_ENTITY_NAME when CASE_UPPER
or some_entity_name using CASE_LOWER is given.
Naming strategy interface
-------------------------
The interface ``Doctrine\ORM\Mapping\NamingStrategy`` allows you to specify
a "naming standard" for database tables and columns.
.. code-block:: php
<?php
/**
* Return a table name for an entity class
*
* @param string $className The fully-qualified class name
* @return string A table name
*/
function classToTableName($className);
/**
* Return a column name for a property
*
* @param string $propertyName A property
* @return string A column name
*/
function propertyToColumnName($propertyName);
/**
* Return the default reference column name
*
* @return string A column name
*/
function referenceColumnName();
/**
* Return a join column name for a property
*
* @param string $propertyName A property
* @return string A join column name
*/
function joinColumnName($propertyName, $className = null);
/**
* Return a join table name
*
* @param string $sourceEntity The source entity
* @param string $targetEntity The target entity
* @param string $propertyName A property
* @return string A join table name
*/
function joinTableName($sourceEntity, $targetEntity, $propertyName = null);
/**
* Return the foreign key column name for the given parameters
*
* @param string $entityName A entity
* @param string $referencedColumnName A property
* @return string A join column name
*/
function joinKeyColumnName($entityName, $referencedColumnName = null);
Implementing a naming strategy
-------------------------------
If you have database naming standards like all tables names should be prefixed
by the application prefix, all column names should be upper case,
you can easily achieve such standards by implementing a naming strategy.
You need to implements NamingStrategy first. Following is an example
.. code-block:: php
<?php
class MyAppNamingStrategy implements NamingStrategy
{
public function classToTableName($className)
{
return 'MyApp_' . substr($className, strrpos($className, '\\') + 1);
}
public function propertyToColumnName($propertyName)
{
return $propertyName;
}
public function referenceColumnName()
{
return 'id';
}
public function joinColumnName($propertyName, $className = null)
{
return $propertyName . '_' . $this->referenceColumnName();
}
public function joinTableName($sourceEntity, $targetEntity, $propertyName = null)
{
return strtolower($this->classToTableName($sourceEntity) . '_' .
$this->classToTableName($targetEntity));
}
public function joinKeyColumnName($entityName, $referencedColumnName = null)
{
return strtolower($this->classToTableName($entityName) . '_' .
($referencedColumnName ?: $this->referenceColumnName()));
}
}
Configuring the namingstrategy is easy if.
Just set your naming strategy calling ``Doctrine\ORM\Configuration#setNamingStrategy()`` :.
.. code-block:: php
<?php
$namingStrategy = new MyAppNamingStrategy();
$configuration()->setNamingStrategy($namingStrategy);

View File

@@ -0,0 +1,905 @@
Native SQL
==========
With ``NativeQuery`` you can execute native SELECT SQL statements
and map the results to Doctrine entities or any other result format
supported by Doctrine.
In order to make this mapping possible, you need to describe
to Doctrine what columns in the result map to which entity property.
This description is represented by a ``ResultSetMapping`` object.
With this feature you can map arbitrary SQL code to objects, such as highly
vendor-optimized SQL or stored-procedures.
Writing ``ResultSetMapping`` from scratch is complex, but there is a convenience
wrapper around it called a ``ResultSetMappingBuilder``. It can generate
the mappings for you based on Entities and even generates the ``SELECT``
clause based on this information for you.
.. note::
If you want to execute DELETE, UPDATE or INSERT statements
the Native SQL API cannot be used and will probably throw errors.
Use ``EntityManager#getConnection()`` to access the native database
connection and call the ``executeUpdate()`` method for these
queries.
The NativeQuery class
---------------------
To create a ``NativeQuery`` you use the method
``EntityManager#createNativeQuery($sql, $resultSetMapping)``. As you can see in
the signature of this method, it expects 2 ingredients: The SQL you want to
execute and the ``ResultSetMapping`` that describes how the results will be
mapped.
Once you obtained an instance of a ``NativeQuery``, you can bind parameters to
it with the same API that ``Query`` has and execute it.
.. code-block:: php
<?php
use Doctrine\ORM\Query\ResultSetMapping;
$rsm = new ResultSetMapping();
// build rsm here
$query = $entityManager->createNativeQuery('SELECT id, name, discr FROM users WHERE name = ?', $rsm);
$query->setParameter(1, 'romanb');
$users = $query->getResult();
ResultSetMappingBuilder
-----------------------
An easy start into ResultSet mapping is the ``ResultSetMappingBuilder`` object.
This has several benefits:
- The builder takes care of automatically updating your ``ResultSetMapping``
when the fields or associations change on the metadata of an entity.
- You can generate the required ``SELECT`` expression for a builder
by converting it to a string.
- The API is much simpler than the usual ``ResultSetMapping`` API.
One downside is that the builder API does not yet support entities
with inheritance hierachies.
.. code-block:: php
<?php
use Doctrine\ORM\Query\ResultSetMappingBuilder;
$sql = "SELECT u.id, u.name, a.id AS address_id, a.street, a.city " .
"FROM users u INNER JOIN address a ON u.address_id = a.id";
$rsm = new ResultSetMappingBuilder($entityManager);
$rsm->addRootEntityFromClassMetadata('MyProject\User', 'u');
$rsm->addJoinedEntityFromClassMetadata('MyProject\Address', 'a', 'u', 'address', array('id' => 'address_id'));
The builder extends the ``ResultSetMapping`` class and as such has all the functionality of it as well.
.. versionadded:: 2.4
Starting with Doctrine ORM 2.4 you can generate the ``SELECT`` clause
from a ``ResultSetMappingBuilder``. You can either cast the builder
object to ``(string)`` and the DQL aliases are used as SQL table aliases
or use the ``generateSelectClause($tableAliases)`` method and pass
a mapping from DQL alias (key) to SQL alias (value)
.. code-block:: php
<?php
$selectClause = $builder->generateSelectClause(array(
'u' => 't1',
'g' => 't2'
));
$sql = "SELECT " . $selectClause . " FROM users t1 JOIN groups t2 ON t1.group_id = t2.id";
The ResultSetMapping
--------------------
Understanding the ``ResultSetMapping`` is the key to using a
``NativeQuery``. A Doctrine result can contain the following
components:
- Entity results. These represent root result elements.
- Joined entity results. These represent joined entities in
associations of root entity results.
- Field results. These represent a column in the result set that
maps to a field of an entity. A field result always belongs to an
entity result or joined entity result.
- Scalar results. These represent scalar values in the result set
that will appear in each result row. Adding scalar results to a
ResultSetMapping can also cause the overall result to become
**mixed** (see DQL - Doctrine Query Language) if the same
ResultSetMapping also contains entity results.
- Meta results. These represent columns that contain
meta-information, such as foreign keys and discriminator columns.
When querying for objects (``getResult()``), all meta columns of
root entities or joined entities must be present in the SQL query
and mapped accordingly using ``ResultSetMapping#addMetaResult``.
.. note::
It might not surprise you that Doctrine uses
``ResultSetMapping`` internally when you create DQL queries. As
the query gets parsed and transformed to SQL, Doctrine fills a
``ResultSetMapping`` that describes how the results should be
processed by the hydration routines.
We will now look at each of the result types that can appear in a
ResultSetMapping in detail.
Entity results
~~~~~~~~~~~~~~
An entity result describes an entity type that appears as a root
element in the transformed result. You add an entity result through
``ResultSetMapping#addEntityResult()``. Let's take a look at the
method signature in detail:
.. code-block:: php
<?php
/**
* Adds an entity result to this ResultSetMapping.
*
* @param string $class The class name of the entity.
* @param string $alias The alias for the class. The alias must be unique among all entity
* results or joined entity results within this ResultSetMapping.
*/
public function addEntityResult($class, $alias)
The first parameter is the fully qualified name of the entity
class. The second parameter is some arbitrary alias for this entity
result that must be unique within a ``ResultSetMapping``. You use
this alias to attach field results to the entity result. It is very
similar to an identification variable that you use in DQL to alias
classes or relationships.
An entity result alone is not enough to form a valid
``ResultSetMapping``. An entity result or joined entity result
always needs a set of field results, which we will look at soon.
Joined entity results
~~~~~~~~~~~~~~~~~~~~~
A joined entity result describes an entity type that appears as a
joined relationship element in the transformed result, attached to
a (root) entity result. You add a joined entity result through
``ResultSetMapping#addJoinedEntityResult()``. Let's take a look at
the method signature in detail:
.. code-block:: php
<?php
/**
* Adds a joined entity result.
*
* @param string $class The class name of the joined entity.
* @param string $alias The unique alias to use for the joined entity.
* @param string $parentAlias The alias of the entity result that is the parent of this joined result.
* @param object $relation The association field that connects the parent entity result with the joined entity result.
*/
public function addJoinedEntityResult($class, $alias, $parentAlias, $relation)
The first parameter is the class name of the joined entity. The
second parameter is an arbitrary alias for the joined entity that
must be unique within the ``ResultSetMapping``. You use this alias
to attach field results to the entity result. The third parameter
is the alias of the entity result that is the parent type of the
joined relationship. The fourth and last parameter is the name of
the field on the parent entity result that should contain the
joined entity result.
Field results
~~~~~~~~~~~~~
A field result describes the mapping of a single column in a SQL
result set to a field in an entity. As such, field results are
inherently bound to entity results. You add a field result through
``ResultSetMapping#addFieldResult()``. Again, let's examine the
method signature in detail:
.. code-block:: php
<?php
/**
* Adds a field result that is part of an entity result or joined entity result.
*
* @param string $alias The alias of the entity result or joined entity result.
* @param string $columnName The name of the column in the SQL result set.
* @param string $fieldName The name of the field on the (joined) entity.
*/
public function addFieldResult($alias, $columnName, $fieldName)
The first parameter is the alias of the entity result to which the
field result will belong. The second parameter is the name of the
column in the SQL result set. Note that this name is case
sensitive, i.e. if you use a native query against Oracle it must be
all uppercase. The third parameter is the name of the field on the
entity result identified by ``$alias`` into which the value of the
column should be set.
Scalar results
~~~~~~~~~~~~~~
A scalar result describes the mapping of a single column in a SQL
result set to a scalar value in the Doctrine result. Scalar results
are typically used for aggregate values but any column in the SQL
result set can be mapped as a scalar value. To add a scalar result
use ``ResultSetMapping#addScalarResult()``. The method signature in
detail:
.. code-block:: php
<?php
/**
* Adds a scalar result mapping.
*
* @param string $columnName The name of the column in the SQL result set.
* @param string $alias The result alias with which the scalar result should be placed in the result structure.
*/
public function addScalarResult($columnName, $alias)
The first parameter is the name of the column in the SQL result set
and the second parameter is the result alias under which the value
of the column will be placed in the transformed Doctrine result.
Meta results
~~~~~~~~~~~~
A meta result describes a single column in a SQL result set that
is either a foreign key or a discriminator column. These columns
are essential for Doctrine to properly construct objects out of SQL
result sets. To add a column as a meta result use
``ResultSetMapping#addMetaResult()``. The method signature in
detail:
.. code-block:: php
<?php
/**
* Adds a meta column (foreign key or discriminator column) to the result set.
*
* @param string $alias
* @param string $columnAlias
* @param string $columnName
* @param boolean $isIdentifierColumn
*/
public function addMetaResult($alias, $columnAlias, $columnName, $isIdentifierColumn = false)
The first parameter is the alias of the entity result to which the
meta column belongs. A meta result column (foreign key or
discriminator column) always belongs to an entity result. The
second parameter is the column alias/name of the column in the SQL
result set and the third parameter is the column name used in the
mapping.
The fourth parameter should be set to true in case the primary key
of the entity is the foreign key you're adding.
Discriminator Column
~~~~~~~~~~~~~~~~~~~~
When joining an inheritance tree you have to give Doctrine a hint
which meta-column is the discriminator column of this tree.
.. code-block:: php
<?php
/**
* Sets a discriminator column for an entity result or joined entity result.
* The discriminator column will be used to determine the concrete class name to
* instantiate.
*
* @param string $alias The alias of the entity result or joined entity result the discriminator
* column should be used for.
* @param string $discrColumn The name of the discriminator column in the SQL result set.
*/
public function setDiscriminatorColumn($alias, $discrColumn)
Examples
~~~~~~~~
Understanding a ResultSetMapping is probably easiest through
looking at some examples.
First a basic example that describes the mapping of a single
entity.
.. code-block:: php
<?php
// Equivalent DQL query: "select u from User u where u.name=?1"
// User owns no associations.
$rsm = new ResultSetMapping;
$rsm->addEntityResult('User', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'name', 'name');
$query = $this->_em->createNativeQuery('SELECT id, name FROM users WHERE name = ?', $rsm);
$query->setParameter(1, 'romanb');
$users = $query->getResult();
The result would look like this:
.. code-block:: php
array(
[0] => User (Object)
)
Note that this would be a partial object if the entity has more
fields than just id and name. In the example above the column and
field names are identical but that is not necessary, of course.
Also note that the query string passed to createNativeQuery is
**real native SQL**. Doctrine does not touch this SQL in any way.
In the previous basic example, a User had no relations and the
table the class is mapped to owns no foreign keys. The next example
assumes User has a unidirectional or bidirectional one-to-one
association to a CmsAddress, where the User is the owning side and
thus owns the foreign key.
.. code-block:: php
<?php
// Equivalent DQL query: "select u from User u where u.name=?1"
// User owns an association to an Address but the Address is not loaded in the query.
$rsm = new ResultSetMapping;
$rsm->addEntityResult('User', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'name', 'name');
$rsm->addMetaResult('u', 'address_id', 'address_id');
$query = $this->_em->createNativeQuery('SELECT id, name, address_id FROM users WHERE name = ?', $rsm);
$query->setParameter(1, 'romanb');
$users = $query->getResult();
Foreign keys are used by Doctrine for lazy-loading purposes when
querying for objects. In the previous example, each user object in
the result will have a proxy (a "ghost") in place of the address
that contains the address\_id. When the ghost proxy is accessed, it
loads itself based on this key.
Consequently, associations that are *fetch-joined* do not require
the foreign keys to be present in the SQL result set, only
associations that are lazy.
.. code-block:: php
<?php
// Equivalent DQL query: "select u from User u join u.address a WHERE u.name = ?1"
// User owns association to an Address and the Address is loaded in the query.
$rsm = new ResultSetMapping;
$rsm->addEntityResult('User', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'name', 'name');
$rsm->addJoinedEntityResult('Address' , 'a', 'u', 'address');
$rsm->addFieldResult('a', 'address_id', 'id');
$rsm->addFieldResult('a', 'street', 'street');
$rsm->addFieldResult('a', 'city', 'city');
$sql = 'SELECT u.id, u.name, a.id AS address_id, a.street, a.city FROM users u ' .
'INNER JOIN address a ON u.address_id = a.id WHERE u.name = ?';
$query = $this->_em->createNativeQuery($sql, $rsm);
$query->setParameter(1, 'romanb');
$users = $query->getResult();
In this case the nested entity ``Address`` is registered with the
``ResultSetMapping#addJoinedEntityResult`` method, which notifies
Doctrine that this entity is not hydrated at the root level, but as
a joined entity somewhere inside the object graph. In this case we
specify the alias 'u' as third parameter and ``address`` as fourth
parameter, which means the ``Address`` is hydrated into the
``User::$address`` property.
If a fetched entity is part of a mapped hierarchy that requires a
discriminator column, this column must be present in the result set
as a meta column so that Doctrine can create the appropriate
concrete type. This is shown in the following example where we
assume that there are one or more subclasses that extend User and
either Class Table Inheritance or Single Table Inheritance is used
to map the hierarchy (both use a discriminator column).
.. code-block:: php
<?php
// Equivalent DQL query: "select u from User u where u.name=?1"
// User is a mapped base class for other classes. User owns no associations.
$rsm = new ResultSetMapping;
$rsm->addEntityResult('User', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'name', 'name');
$rsm->addMetaResult('u', 'discr', 'discr'); // discriminator column
$rsm->setDiscriminatorColumn('u', 'discr');
$query = $this->_em->createNativeQuery('SELECT id, name, discr FROM users WHERE name = ?', $rsm);
$query->setParameter(1, 'romanb');
$users = $query->getResult();
Note that in the case of Class Table Inheritance, an example as
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
------------------
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,90 @@
Partial Objects
===============
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.
.. note::
The partial object problem in general does not apply to
methods or queries where you do not retrieve the query result as
objects. Examples are: ``Query#getArrayResult()``,
``Query#getScalarResult()``, ``Query#getSingleScalarResult()``,
etc.
.. warning::
Use of partial objects is tricky. Fields that are not retrieved
from the database will not be updated by the UnitOfWork even if they
get changed in your objects. You can only promote a partial object
to a fully-loaded object by calling ``EntityManager#refresh()``
or a DQL query with the refresh flag.
What is the problem?
--------------------
In short, partial objects are problematic because they are usually
objects with broken invariants. As such, code that uses these
partial objects tends to be very fragile and either needs to "know"
which fields or methods can be safely accessed or add checks around
every field access or method invocation. The same holds true for
the internals, i.e. the method implementations, of such objects.
You usually simply assume the state you need in the method is
available, after all you properly constructed this object before
you pushed it into the database, right? These blind assumptions can
quickly lead to null reference errors when working with such
partial objects.
It gets worse with the scenario of an optional association (0..1 to
1). When the associated field is NULL, you don't know whether this
object does not have an associated object or whether it was simply
not loaded when the owning object was loaded from the database.
These are reasons why many ORMs do not allow partial objects at all
and instead you always have to load an object with all its fields
(associations being proxied). One secure way to allow partial
objects is if the programming language/platform allows the ORM tool
to hook deeply into the object and instrument it in such a way that
individual fields (not only associations) can be loaded lazily on
first access. This is possible in Java, for example, through
bytecode instrumentation. In PHP though this is not possible, so
there is no way to have "secure" partial objects in an ORM with
transparent persistence.
Doctrine, by default, does not allow partial objects. That means,
any query that only selects partial object data and wants to
retrieve the result as objects (i.e. ``Query#getResult()``) will
raise an exception telling you that partial objects are dangerous.
If you want to force a query to return you partial objects,
possibly as a performance tweak, you can use the ``partial``
keyword as follows:
.. code-block:: php
<?php
$q = $em->createQuery("select partial u.{id,name} from MyApp\Domain\User u");
You can also get a partial reference instead of a proxy reference by
calling:
.. code-block:: php
<?php
$reference = $em->getPartialReference('MyApp\Domain\User', 1);
Partial references are objects with only the identifiers set as they
are passed to the second argument of the ``getPartialReference()`` method.
All other fields are null.
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

@@ -0,0 +1,325 @@
PHP Mapping
===========
Doctrine 2 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
---------
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');
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 annotations.
For this you just need to use the ``StaticPHPDriver``:
.. code-block:: php
<?php
$driver = new StaticPHPDriver('/path/to/entities');
$em->getConfiguration()->setMetadataDriverImpl($driver);
Now you just need to define a static function named
``loadMetadata($metadata)`` on your entity:
.. code-block:: php
<?php
namespace Entities;
use Doctrine\ORM\Mapping\ClassMetadata;
class User
{
// ...
public static function loadMetadata(ClassMetadata $metadata)
{
$metadata->mapField(array(
'id' => true,
'fieldName' => 'id',
'type' => 'integer'
));
$metadata->mapField(array(
'fieldName' => 'username',
'type' => 'string'
));
}
}
ClassMetadataBuilder
--------------------
To ease the use of the ClassMetadata API (which is very raw) there is a ``ClassMetadataBuilder`` that you can use.
.. code-block:: php
<?php
namespace Entities;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Mapping\Builder\ClassMetadataBuilder;
class User
{
// ...
public static function loadMetadata(ClassMetadata $metadata)
{
$builder = new ClassMetadataBuilder($metadata);
$builder->createField('id', 'integer')->isPrimaryKey()->generatedValue()->build();
$builder->addField('username', 'string');
}
}
The API of the ClassMetadataBuilder has the following methods with a fluent interface:
- ``addField($name, $type, array $mapping)``
- ``setMappedSuperclass()``
- ``setReadOnly()``
- ``setCustomRepositoryClass($className)``
- ``setTable($name)``
- ``addIndex(array $columns, $indexName)``
- ``addUniqueConstraint(array $columns, $constraintName)``
- ``addNamedQuery($name, $dqlQuery)``
- ``setJoinedTableInheritance()``
- ``setSingleTableInheritance()``
- ``setDiscriminatorColumn($name, $type = 'string', $length = 255)``
- ``addDiscriminatorMapClass($name, $class)``
- ``setChangeTrackingPolicyDeferredExplicit()``
- ``setChangeTrackingPolicyNotify()``
- ``addLifecycleEvent($methodName, $event)``
- ``addManyToOne($name, $targetEntity, $inversedBy = null)``
- ``addInverseOneToOne($name, $targetEntity, $mappedBy)``
- ``addOwningOneToOne($name, $targetEntity, $inversedBy = null)``
- ``addOwningManyToMany($name, $targetEntity, $inversedBy = null)``
- ``addInverseManyToMany($name, $targetEntity, $mappedBy)``
- ``addOneToMany($name, $targetEntity, $mappedBy)``
It also has several methods that create builders (which are necessary for advanced mappings):
- ``createField($name, $type)`` returns a ``FieldBuilder`` instance
- ``createManyToOne($name, $targetEntity)`` returns an ``AssociationBuilder`` instance
- ``createOneToOne($name, $targetEntity)`` returns an ``AssociationBuilder`` instance
- ``createManyToMany($name, $targetEntity)`` returns an ``ManyToManyAssociationBuilder`` instance
- ``createOneToMany($name, $targetEntity)`` returns an ``OneToManyAssociationBuilder`` instance
ClassMetadataInfo API
---------------------
The ``ClassMetadataInfo`` class is the base data object for storing
the mapping metadata for a single entity. It contains all the
getters and setters you need populate and retrieve information for
an entity.
General Setters
~~~~~~~~~~~~~~~
- ``setTableName($tableName)``
- ``setPrimaryTable(array $primaryTableDefinition)``
- ``setCustomRepositoryClass($repositoryClassName)``
- ``setIdGeneratorType($generatorType)``
- ``setIdGenerator($generator)``
- ``setSequenceGeneratorDefinition(array $definition)``
- ``setChangeTrackingPolicy($policy)``
- ``setIdentifier(array $identifier)``
Inheritance Setters
~~~~~~~~~~~~~~~~~~~
- ``setInheritanceType($type)``
- ``setSubclasses(array $subclasses)``
- ``setParentClasses(array $classNames)``
- ``setDiscriminatorColumn($columnDef)``
- ``setDiscriminatorMap(array $map)``
Field Mapping Setters
~~~~~~~~~~~~~~~~~~~~~
- ``mapField(array $mapping)``
- ``mapOneToOne(array $mapping)``
- ``mapOneToMany(array $mapping)``
- ``mapManyToOne(array $mapping)``
- ``mapManyToMany(array $mapping)``
Lifecycle Callback Setters
~~~~~~~~~~~~~~~~~~~~~~~~~~
- ``addLifecycleCallback($callback, $event)``
- ``setLifecycleCallbacks(array $callbacks)``
Versioning Setters
~~~~~~~~~~~~~~~~~~
- ``setVersionMapping(array &$mapping)``
- ``setVersioned($bool)``
- ``setVersionField()``
General Getters
~~~~~~~~~~~~~~~
- ``getTableName()``
- ``getSchemaName()``
- ``getTemporaryIdTableName()``
Identifier Getters
~~~~~~~~~~~~~~~~~~
- ``getIdentifierColumnNames()``
- ``usesIdGenerator()``
- ``isIdentifier($fieldName)``
- ``isIdGeneratorIdentity()``
- ``isIdGeneratorSequence()``
- ``isIdGeneratorTable()``
- ``isIdentifierNatural()``
- ``getIdentifierFieldNames()``
- ``getSingleIdentifierFieldName()``
- ``getSingleIdentifierColumnName()``
Inheritance Getters
~~~~~~~~~~~~~~~~~~~
- ``isInheritanceTypeNone()``
- ``isInheritanceTypeJoined()``
- ``isInheritanceTypeSingleTable()``
- ``isInheritanceTypeTablePerClass()``
- ``isInheritedField($fieldName)``
- ``isInheritedAssociation($fieldName)``
Change Tracking Getters
~~~~~~~~~~~~~~~~~~~~~~~
- ``isChangeTrackingDeferredExplicit()``
- ``isChangeTrackingDeferredImplicit()``
- ``isChangeTrackingNotify()``
Field & Association Getters
~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ``isUniqueField($fieldName)``
- ``isNullable($fieldName)``
- ``getColumnName($fieldName)``
- ``getFieldMapping($fieldName)``
- ``getAssociationMapping($fieldName)``
- ``getAssociationMappings()``
- ``getFieldName($columnName)``
- ``hasField($fieldName)``
- ``getColumnNames(array $fieldNames = null)``
- ``getTypeOfField($fieldName)``
- ``getTypeOfColumn($columnName)``
- ``hasAssociation($fieldName)``
- ``isSingleValuedAssociation($fieldName)``
- ``isCollectionValuedAssociation($fieldName)``
Lifecycle Callback Getters
~~~~~~~~~~~~~~~~~~~~~~~~~~
- ``hasLifecycleCallbacks($lifecycleEvent)``
- ``getLifecycleCallbacks($event)``
ClassMetadata API
-----------------
The ``ClassMetadata`` class extends ``ClassMetadataInfo`` and adds
the runtime functionality required by Doctrine. It adds a few extra
methods related to runtime reflection for working with the entities
themselves.
- ``getReflectionClass()``
- ``getReflectionProperties()``
- ``getReflectionProperty($name)``
- ``getSingleIdReflectionProperty()``
- ``getIdentifierValues($entity)``
- ``setIdentifierValues($entity, $id)``
- ``setFieldValue($entity, $field, $value)``
- ``getFieldValue($entity, $field)``

View File

@@ -0,0 +1,565 @@
The QueryBuilder
================
A ``QueryBuilder`` provides an API that is designed for
conditionally constructing a DQL query in several steps.
It provides a set of classes and methods that is able to
programmatically build queries, and also provides a fluent API.
This means that you can change between one methodology to the other
as you want, and also pick one if you prefer.
Constructing a new QueryBuilder object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The same way you build a normal Query, you build a ``QueryBuilder``
object, just providing the correct method name. Here is an example
how to build a ``QueryBuilder`` object:
.. code-block:: php
<?php
// $em instanceof EntityManager
// example1: creating a QueryBuilder instance
$qb = $em->createQueryBuilder();
Once you have created an instance of QueryBuilder, it provides a
set of useful informative functions that you can use. One good
example is to inspect what type of object the ``QueryBuilder`` is.
.. code-block:: php
<?php
// $qb instanceof QueryBuilder
// example2: retrieving type of QueryBuilder
echo $qb->getType(); // Prints: 0
There're currently 3 possible return values for ``getType()``:
- ``QueryBuilder::SELECT``, which returns value 0
- ``QueryBuilder::DELETE``, returning value 1
- ``QueryBuilder::UPDATE``, which returns value 2
It is possible to retrieve the associated ``EntityManager`` of the
current ``QueryBuilder``, its DQL and also a ``Query`` object when
you finish building your DQL.
.. code-block:: php
<?php
// $qb instanceof QueryBuilder
// example3: retrieve the associated EntityManager
$em = $qb->getEntityManager();
// example4: retrieve the DQL string of what was defined in QueryBuilder
$dql = $qb->getDql();
// example5: retrieve the associated Query object with the processed DQL
$q = $qb->getQuery();
Internally, ``QueryBuilder`` works with a DQL cache to increase
performance. Any changes that may affect the generated DQL actually
modifies the state of ``QueryBuilder`` to a stage we call
STATE\_DIRTY. One ``QueryBuilder`` can be in two different states:
- ``QueryBuilder::STATE_CLEAN``, which means DQL haven't been
altered since last retrieval or nothing were added since its
instantiation
- ``QueryBuilder::STATE_DIRTY``, means DQL query must (and will)
be processed on next retrieval
Working with QueryBuilder
~~~~~~~~~~~~~~~~~~~~~~~~~
High level API methods
^^^^^^^^^^^^^^^^^^^^^^
To simplify even more the way you build a query in Doctrine, we can take
advantage of what we call Helper methods. For all base code, there
is a set of useful methods to simplify a programmer's life. To
illustrate how to work with them, here is the same example 6
re-written using ``QueryBuilder`` helper methods:
.. code-block:: php
<?php
// $qb instanceof QueryBuilder
$qb->select('u')
->from('User', 'u')
->where('u.id = ?1')
->orderBy('u.name', 'ASC');
``QueryBuilder`` helper methods are considered the standard way to
build DQL queries. Although it is supported, it should be avoided
to use string based queries and greatly encouraged to use
``$qb->expr()->*`` methods. Here is a converted example 8 to
suggested standard way to build queries:
.. code-block:: php
<?php
// $qb instanceof QueryBuilder
$qb->select(array('u')) // string 'u' is converted to array internally
->from('User', 'u')
->where($qb->expr()->orX(
$qb->expr()->eq('u.id', '?1'),
$qb->expr()->like('u.nickname', '?2')
))
->orderBy('u.surname', 'ASC'));
Here is a complete list of helper methods available in ``QueryBuilder``:
.. code-block:: php
<?php
class QueryBuilder
{
// Example - $qb->select('u')
// Example - $qb->select(array('u', 'p'))
// Example - $qb->select($qb->expr()->select('u', 'p'))
public function select($select = null);
// addSelect does not override previous calls to select
//
// Example - $qb->select('u');
// ->addSelect('p.area_code');
public function addSelect($select = null);
// Example - $qb->delete('User', 'u')
public function delete($delete = null, $alias = null);
// Example - $qb->update('Group', 'g')
public function update($update = null, $alias = null);
// Example - $qb->set('u.firstName', $qb->expr()->literal('Arnold'))
// Example - $qb->set('u.numChilds', 'u.numChilds + ?1')
// Example - $qb->set('u.numChilds', $qb->expr()->sum('u.numChilds', '?1'))
public function set($key, $value);
// Example - $qb->from('Phonenumber', 'p')
// Example - $qb->from('Phonenumber', 'p', 'p.id')
public function from($from, $alias, $indexBy = null);
// Example - $qb->join('u.Group', 'g', Expr\Join::WITH, $qb->expr()->eq('u.status_id', '?1'))
// Example - $qb->join('u.Group', 'g', 'WITH', 'u.status = ?1')
// Example - $qb->join('u.Group', 'g', 'WITH', 'u.status = ?1', 'g.id')
public function join($join, $alias, $conditionType = null, $condition = null, $indexBy = null);
// Example - $qb->innerJoin('u.Group', 'g', Expr\Join::WITH, $qb->expr()->eq('u.status_id', '?1'))
// Example - $qb->innerJoin('u.Group', 'g', 'WITH', 'u.status = ?1')
// Example - $qb->innerJoin('u.Group', 'g', 'WITH', 'u.status = ?1', 'g.id')
public function innerJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null);
// Example - $qb->leftJoin('u.Phonenumbers', 'p', Expr\Join::WITH, $qb->expr()->eq('p.area_code', 55))
// Example - $qb->leftJoin('u.Phonenumbers', 'p', 'WITH', 'p.area_code = 55')
// Example - $qb->leftJoin('u.Phonenumbers', 'p', 'WITH', 'p.area_code = 55', 'p.id')
public function leftJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null);
// NOTE: ->where() overrides all previously set conditions
//
// Example - $qb->where('u.firstName = ?1', $qb->expr()->eq('u.surname', '?2'))
// Example - $qb->where($qb->expr()->andX($qb->expr()->eq('u.firstName', '?1'), $qb->expr()->eq('u.surname', '?2')))
// Example - $qb->where('u.firstName = ?1 AND u.surname = ?2')
public function where($where);
// NOTE: ->andWhere() can be used directly, without any ->where() before
//
// Example - $qb->andWhere($qb->expr()->orX($qb->expr()->lte('u.age', 40), 'u.numChild = 0'))
public function andWhere($where);
// Example - $qb->orWhere($qb->expr()->between('u.id', 1, 10));
public function orWhere($where);
// NOTE: -> groupBy() overrides all previously set grouping conditions
//
// Example - $qb->groupBy('u.id')
public function groupBy($groupBy);
// Example - $qb->addGroupBy('g.name')
public function addGroupBy($groupBy);
// NOTE: -> having() overrides all previously set having conditions
//
// Example - $qb->having('u.salary >= ?1')
// Example - $qb->having($qb->expr()->gte('u.salary', '?1'))
public function having($having);
// Example - $qb->andHaving($qb->expr()->gt($qb->expr()->count('u.numChild'), 0))
public function andHaving($having);
// Example - $qb->orHaving($qb->expr()->lte('g.managerLevel', '100'))
public function orHaving($having);
// NOTE: -> orderBy() overrides all previously set ordering conditions
//
// Example - $qb->orderBy('u.surname', 'DESC')
public function orderBy($sort, $order = null);
// Example - $qb->addOrderBy('u.firstName')
public function addOrderBy($sort, $order = null); // Default $order = 'ASC'
}
Binding parameters to your query
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Doctrine supports dynamic binding of parameters to your query,
similar to preparing queries. You can use both strings and numbers
as placeholders, although both have a slightly different syntax.
Additionally, you must make your choice: Mixing both styles is not
allowed. Binding parameters can simply be achieved as follows:
.. code-block:: php
<?php
// $qb instanceof QueryBuilder
$qb->select('u')
->from('User', 'u')
->where('u.id = ?1')
->orderBy('u.name', 'ASC')
->setParameter(1, 100); // Sets ?1 to 100, and thus we will fetch a user with u.id = 100
You are not forced to enumerate your placeholders as the
alternative syntax is available:
.. code-block:: php
<?php
// $qb instanceof QueryBuilder
$qb->select('u')
->from('User', 'u')
->where('u.id = :identifier')
->orderBy('u.name', 'ASC')
->setParameter('identifier', 100); // Sets :identifier to 100, and thus we will fetch a user with u.id = 100
Note that numeric placeholders start with a ? followed by a number
while the named placeholders start with a : followed by a string.
Calling ``setParameter()`` automatically infers which type you are setting as
value. This works for integers, arrays of strings/integers, DateTime instances
and for managed entities. If you want to set a type explicitly you can call
the third argument to ``setParameter()`` explicitly. It accepts either a PDO
type or a DBAL Type name for conversion.
If you've got several parameters to bind to your query, you can
also use setParameters() instead of setParameter() with the
following syntax:
.. code-block:: php
<?php
// $qb instanceof QueryBuilder
// Query here...
$qb->setParameters(array(1 => 'value for ?1', 2 => 'value for ?2'));
Getting already bound parameters is easy - simply use the above
mentioned syntax with "getParameter()" or "getParameters()":
.. code-block:: php
<?php
// $qb instanceof QueryBuilder
// See example above
$params = $qb->getParameters();
// $params instanceof \Doctrine\Common\Collections\ArrayCollection
// Equivalent to
$param = $qb->getParameter(1);
// $param instanceof \Doctrine\ORM\Query\Parameter
Note: If you try to get a parameter that was not bound yet,
getParameter() simply returns NULL.
The API of a Query Parameter is:
.. code-block:: php
namespace Doctrine\ORM\Query;
class Parameter
{
public function getName();
public function getValue();
public function getType();
public function setValue($value, $type = null);
}
Limiting the Result
^^^^^^^^^^^^^^^^^^^
To limit a result the query builder has some methods in common with
the Query object which can be retrieved from ``EntityManager#createQuery()``.
.. code-block:: php
<?php
// $qb instanceof QueryBuilder
$offset = (int)$_GET['offset'];
$limit = (int)$_GET['limit'];
$qb->add('select', 'u')
->add('from', 'User u')
->add('orderBy', 'u.name ASC')
->setFirstResult( $offset )
->setMaxResults( $limit );
Executing a Query
^^^^^^^^^^^^^^^^^
The QueryBuilder is a builder object only, it has no means of actually
executing the Query. Additionally a set of parameters such as query hints
cannot be set on the QueryBuilder itself. This is why you always have to convert
a querybuilder instance into a Query object:
.. code-block:: php
<?php
// $qb instanceof QueryBuilder
$query = $qb->getQuery();
// Set additional Query options
$query->setQueryHint('foo', 'bar');
$query->useResultCache('my_cache_id');
// Execute Query
$result = $query->getResult();
$single = $query->getSingleResult();
$array = $query->getArrayResult();
$scalar = $query->getScalarResult();
$singleScalar = $query->getSingleScalarResult();
The Expr class
^^^^^^^^^^^^^^
To workaround some of the issues that ``add()`` method may cause,
Doctrine created a class that can be considered as a helper for
building expressions. This class is called ``Expr``, which provides a
set of useful methods to help build expressions:
.. code-block:: php
<?php
// $qb instanceof QueryBuilder
// example8: QueryBuilder port of:
// "SELECT u FROM User u WHERE u.id = ? OR u.nickname LIKE ? ORDER BY u.name ASC" using Expr class
$qb->add('select', new Expr\Select(array('u')))
->add('from', new Expr\From('User', 'u'))
->add('where', $qb->expr()->orX(
$qb->expr()->eq('u.id', '?1'),
$qb->expr()->like('u.nickname', '?2')
))
->add('orderBy', new Expr\OrderBy('u.name', 'ASC'));
Although it still sounds complex, the ability to programmatically
create conditions are the main feature of ``Expr``. Here it is a
complete list of supported helper methods available:
.. code-block:: php
<?php
class Expr
{
/** Conditional objects **/
// Example - $qb->expr()->andX($cond1 [, $condN])->add(...)->...
public function andX($x = null); // Returns Expr\AndX instance
// Example - $qb->expr()->orX($cond1 [, $condN])->add(...)->...
public function orX($x = null); // Returns Expr\OrX instance
/** Comparison objects **/
// Example - $qb->expr()->eq('u.id', '?1') => u.id = ?1
public function eq($x, $y); // Returns Expr\Comparison instance
// Example - $qb->expr()->neq('u.id', '?1') => u.id <> ?1
public function neq($x, $y); // Returns Expr\Comparison instance
// Example - $qb->expr()->lt('u.id', '?1') => u.id < ?1
public function lt($x, $y); // Returns Expr\Comparison instance
// Example - $qb->expr()->lte('u.id', '?1') => u.id <= ?1
public function lte($x, $y); // Returns Expr\Comparison instance
// Example - $qb->expr()->gt('u.id', '?1') => u.id > ?1
public function gt($x, $y); // Returns Expr\Comparison instance
// Example - $qb->expr()->gte('u.id', '?1') => u.id >= ?1
public function gte($x, $y); // Returns Expr\Comparison instance
// Example - $qb->expr()->isNull('u.id') => u.id IS NULL
public function isNull($x); // Returns string
// Example - $qb->expr()->isNotNull('u.id') => u.id IS NOT NULL
public function isNotNull($x); // Returns string
/** Arithmetic objects **/
// Example - $qb->expr()->prod('u.id', '2') => u.id * 2
public function prod($x, $y); // Returns Expr\Math instance
// Example - $qb->expr()->diff('u.id', '2') => u.id - 2
public function diff($x, $y); // Returns Expr\Math instance
// Example - $qb->expr()->sum('u.id', '2') => u.id + 2
public function sum($x, $y); // Returns Expr\Math instance
// Example - $qb->expr()->quot('u.id', '2') => u.id / 2
public function quot($x, $y); // Returns Expr\Math instance
/** Pseudo-function objects **/
// Example - $qb->expr()->exists($qb2->getDql())
public function exists($subquery); // Returns Expr\Func instance
// Example - $qb->expr()->all($qb2->getDql())
public function all($subquery); // Returns Expr\Func instance
// Example - $qb->expr()->some($qb2->getDql())
public function some($subquery); // Returns Expr\Func instance
// Example - $qb->expr()->any($qb2->getDql())
public function any($subquery); // Returns Expr\Func instance
// Example - $qb->expr()->not($qb->expr()->eq('u.id', '?1'))
public function not($restriction); // Returns Expr\Func instance
// Example - $qb->expr()->in('u.id', array(1, 2, 3))
// Make sure that you do NOT use something similar to $qb->expr()->in('value', array('stringvalue')) as this will cause Doctrine to throw an Exception.
// Instead, use $qb->expr()->in('value', array('?1')) and bind your parameter to ?1 (see section above)
public function in($x, $y); // Returns Expr\Func instance
// Example - $qb->expr()->notIn('u.id', '2')
public function notIn($x, $y); // Returns Expr\Func instance
// Example - $qb->expr()->like('u.firstname', $qb->expr()->literal('Gui%'))
public function like($x, $y); // Returns Expr\Comparison instance
// Example - $qb->expr()->notLike('u.firstname', $qb->expr()->literal('Gui%'))
public function notLike($x, $y); // Returns Expr\Comparison instance
// Example - $qb->expr()->between('u.id', '1', '10')
public function between($val, $x, $y); // Returns Expr\Func
/** Function objects **/
// Example - $qb->expr()->trim('u.firstname')
public function trim($x); // Returns Expr\Func
// Example - $qb->expr()->concat('u.firstname', $qb->expr()->concat($qb->expr()->literal(' '), 'u.lastname'))
public function concat($x, $y); // Returns Expr\Func
// Example - $qb->expr()->substring('u.firstname', 0, 1)
public function substring($x, $from, $len); // Returns Expr\Func
// Example - $qb->expr()->lower('u.firstname')
public function lower($x); // Returns Expr\Func
// Example - $qb->expr()->upper('u.firstname')
public function upper($x); // Returns Expr\Func
// Example - $qb->expr()->length('u.firstname')
public function length($x); // Returns Expr\Func
// Example - $qb->expr()->avg('u.age')
public function avg($x); // Returns Expr\Func
// Example - $qb->expr()->max('u.age')
public function max($x); // Returns Expr\Func
// Example - $qb->expr()->min('u.age')
public function min($x); // Returns Expr\Func
// Example - $qb->expr()->abs('u.currentBalance')
public function abs($x); // Returns Expr\Func
// Example - $qb->expr()->sqrt('u.currentBalance')
public function sqrt($x); // Returns Expr\Func
// Example - $qb->expr()->count('u.firstname')
public function count($x); // Returns Expr\Func
// Example - $qb->expr()->countDistinct('u.surname')
public function countDistinct($x); // Returns Expr\Func
}
Low Level API
^^^^^^^^^^^^^
Now we have describe the low level (thought of as the
hardcore method) of creating queries. It may be useful to work at
this level for optimization purposes, but most of the time it is
preferred to work at a higher level of abstraction.
All helper methods in ``QueryBuilder`` actually rely on a single
one: ``add()``. This method is responsible of building every piece
of DQL. It takes 3 parameters: ``$dqlPartName``, ``$dqlPart`` and
``$append`` (default=false)
- ``$dqlPartName``: Where the ``$dqlPart`` should be placed.
Possible values: select, from, where, groupBy, having, orderBy
- ``$dqlPart``: What should be placed in ``$dqlPartName``. Accepts
a string or any instance of ``Doctrine\ORM\Query\Expr\*``
- ``$append``: Optional flag (default=false) if the ``$dqlPart``
should override all previously defined items in ``$dqlPartName`` or
not (no effect on the ``where`` and ``having`` DQL query parts,
which always override all previously defined items)
-
.. code-block:: php
<?php
// $qb instanceof QueryBuilder
// example6: how to define:
// "SELECT u FROM User u WHERE u.id = ? ORDER BY u.name ASC"
// using QueryBuilder string support
$qb->add('select', 'u')
->add('from', 'User u')
->add('where', 'u.id = ?1')
->add('orderBy', 'u.name ASC');
Expr\* classes
^^^^^^^^^^^^^^
When you call ``add()`` with string, it internally evaluates to an
instance of ``Doctrine\ORM\Query\Expr\Expr\*`` class. Here is the
same query of example 6 written using
``Doctrine\ORM\Query\Expr\Expr\*`` classes:
.. code-block:: php
<?php
// $qb instanceof QueryBuilder
// example7: how to define:
// "SELECT u FROM User u WHERE u.id = ? ORDER BY u.name ASC"
// using QueryBuilder using Expr\* instances
$qb->add('select', new Expr\Select(array('u')))
->add('from', new Expr\From('User', 'u'))
->add('where', new Expr\Comparison('u.id', '=', '?1'))
->add('orderBy', new Expr\OrderBy('u.name', 'ASC'));
Of course this is the hardest way to build a DQL query in Doctrine.
To simplify some of these efforts, we introduce what we call as
``Expr`` helper class.

View File

@@ -0,0 +1,731 @@
The Second Level Cache
======================
.. note::
The second level cache functionality is marked as experimental for now. It
is a very complex feature and we cannot guarantee yet that it works stable
in all cases.
The Second Level Cache is designed to reduce the amount of necessary database access.
It sits between your application and the database to avoid the number of database hits as much as possible.
When turned on, entities will be first searched in cache and if they are not found,
a database query will be fired an then the entity result will be stored in a cache provider.
There are some flavors of caching available, but is better to cache read-only data.
Be aware that caches are not aware of changes made to the persistent store by another application.
They can, however, be configured to regularly expire cached data.
Caching Regions
---------------
Second level cache does not store instances of an entity, instead it caches only entity identifier and values.
Each entity class, collection association and query has its region, where values of each instance are stored.
Caching Regions are specific region into the cache provider that might store entities, collection or queries.
Each cache region resides in a specific cache namespace and has its own lifetime configuration.
Notice that when caching collection and queries only identifiers are stored.
The entity values will be stored in its own region
Something like below for an entity region :
.. code-block:: php
<?php
[
'region_name:entity_1_hash' => ['id'=> 1, 'name' => 'FooBar', 'associationName'=>null],
'region_name:entity_2_hash' => ['id'=> 2, 'name' => 'Foo', 'associationName'=>['id'=>11]],
'region_name:entity_3_hash' => ['id'=> 3, 'name' => 'Bar', 'associationName'=>['id'=>22]]
];
If the entity holds a collection that also needs to be cached.
An collection region could look something like :
.. code-block:: php
<?php
[
'region_name:entity_1_coll_assoc_name_hash' => ['ownerId'=> 1, 'list' => [1, 2, 3]],
'region_name:entity_2_coll_assoc_name_hash' => ['ownerId'=> 2, 'list' => [2, 3]],
'region_name:entity_3_coll_assoc_name_hash' => ['ownerId'=> 3, 'list' => [2, 4]]
];
A query region might be something like :
.. code-block:: php
<?php
[
'region_name:query_1_hash' => ['list' => [1, 2, 3]],
'region_name:query_2_hash' => ['list' => [2, 3]],
'region_name:query_3_hash' => ['list' => [2, 4]]
];
.. note::
The following data structures represents now the cache will looks like, this is not actual cached data.
.. _reference-second-level-cache-regions:
Cache Regions
-------------
``Doctrine\ORM\Cache\Region\DefaultRegion`` It's the default implementation.
A simplest cache region compatible with all doctrine-cache drivers but does not support locking.
``Doctrine\ORM\Cache\Region`` and ``Doctrine\ORM\Cache\ConcurrentRegion``
Defines contracts that should be implemented by a cache provider.
It allows you to provide your own cache implementation that might take advantage of specific cache driver.
If you want to support locking for ``READ_WRITE`` strategies you should implement ``ConcurrentRegion``; ``CacheRegion`` otherwise.
Cache region
~~~~~~~~~~~~
Defines a contract for accessing a particular region.
``Doctrine\ORM\Cache\Region``
Defines a contract for accessing a particular cache region.
`See API Doc <http://www.doctrine-project.org/api/orm/2.5/class-Doctrine.ORM.Cache.Region.html/>`_.
Concurrent cache region
~~~~~~~~~~~~~~~~~~~~~~~
A ``Doctrine\ORM\Cache\ConcurrentRegion`` is designed to store concurrently managed data region.
By default, Doctrine provides a very simple implementation based on file locks ``Doctrine\ORM\Cache\Region\FileLockRegion``.
If you want to use an ``READ_WRITE`` cache, you should consider providing your own cache region.
``Doctrine\ORM\Cache\ConcurrentRegion``
Defines contract for concurrently managed data region.
`See API Doc <http://www.doctrine-project.org/api/orm/2.5/class-Doctrine.ORM.Cache.ConcurrentRegion.html/>`_.
Timestamp region
~~~~~~~~~~~~~~~~
``Doctrine\ORM\Cache\TimestampRegion``
Tracks the timestamps of the most recent updates to particular entity.
`See API Doc <http://www.doctrine-project.org/api/orm/2.5/class-Doctrine.ORM.Cache.TimestampRegion.html/>`_.
.. _reference-second-level-cache-mode:
Caching mode
------------
* ``READ_ONLY`` (DEFAULT)
* Can do reads, inserts and deletes, cannot perform updates or employ any locks.
* Useful for data that is read frequently but never updated.
* Best performer.
* It is Simple.
* ``NONSTRICT_READ_WRITE``
* Read Write Cache doesnt employ any locks but can do reads, inserts, updates and deletes.
* Good if the application needs to update data rarely.
* ``READ_WRITE``
* Read Write cache employs locks before update/delete.
* Use if data needs to be updated.
* Slowest strategy.
* To use it a the cache region implementation must support locking.
Built-in cached persisters
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Cached persisters are responsible to access cache regions.
+-----------------------+-------------------------------------------------------------------------------+
| Cache Usage | Persister |
+=======================+===============================================================================+
| READ_ONLY | Doctrine\\ORM\\Cache\\Persister\\ReadOnlyCachedEntityPersister |
+-----------------------+-------------------------------------------------------------------------------+
| READ_WRITE | Doctrine\\ORM\\Cache\\Persister\\ReadWriteCachedEntityPersister |
+-----------------------+-------------------------------------------------------------------------------+
| NONSTRICT_READ_WRITE | Doctrine\\ORM\\Cache\\Persister\\NonStrictReadWriteCachedEntityPersister |
+-----------------------+-------------------------------------------------------------------------------+
| READ_ONLY | Doctrine\\ORM\\Cache\\Persister\\ReadOnlyCachedCollectionPersister |
+-----------------------+-------------------------------------------------------------------------------+
| READ_WRITE | Doctrine\\ORM\\Cache\\Persister\\ReadWriteCachedCollectionPersister |
+-----------------------+-------------------------------------------------------------------------------+
| NONSTRICT_READ_WRITE | Doctrine\\ORM\\Cache\\Persister\\NonStrictReadWriteCacheCollectionPersister |
+-----------------------+-------------------------------------------------------------------------------+
Configuration
-------------
Doctrine allows you to specify configurations and some points of extension for the second-level-cache
Enable Second Level Cache
~~~~~~~~~~~~~~~~~~~~~~~~~
To enable the second-level-cache, you should provide a cache factory
``\Doctrine\ORM\Cache\DefaultCacheFactory`` is the default implementation.
.. code-block:: php
<?php
/* @var $config \Doctrine\ORM\Cache\RegionsConfiguration */
/* @var $cache \Doctrine\Common\Cache\Cache */
$factory = new \Doctrine\ORM\Cache\DefaultCacheFactory($config, $cache);
// Enable second-level-cache
$config->setSecondLevelCacheEnabled();
// Cache factory
$config->getSecondLevelCacheConfiguration()
->setCacheFactory($factory);
Cache Factory
~~~~~~~~~~~~~
Cache Factory is the main point of extension.
It allows you to provide a specific implementation of the following components :
* ``QueryCache`` Store and retrieve query cache results.
* ``CachedEntityPersister`` Store and retrieve entity results.
* ``CachedCollectionPersister`` Store and retrieve query results.
* ``EntityHydrator`` Transform an entity into a cache entry and cache entry into entities
* ``CollectionHydrator`` Transform a collection into a cache entry and cache entry into collection
`See API Doc <http://www.doctrine-project.org/api/orm/2.5/class-Doctrine.ORM.Cache.DefaultCacheFactory.html/>`_.
Region Lifetime
~~~~~~~~~~~~~~~
To specify a default lifetime for all regions or specify a different lifetime for a specific region.
.. code-block:: php
<?php
/* @var $config \Doctrine\ORM\Configuration */
/* @var $cacheConfig \Doctrine\ORM\Configuration */
$cacheConfig = $config->getSecondLevelCacheConfiguration();
$regionConfig = $cacheConfig->getRegionsConfiguration();
// Cache Region lifetime
$regionConfig->setLifetime('my_entity_region', 3600); // Time to live for a specific region; In seconds
$regionConfig->setDefaultLifetime(7200); // Default time to live; In seconds
Cache Log
~~~~~~~~~
By providing a cache logger you should be able to get information about all cache operations such as hits, misses and puts.
``\Doctrine\ORM\Cache\Logging\StatisticsCacheLogger`` is a built-in implementation that provides basic statistics.
.. code-block:: php
<?php
/* @var $config \Doctrine\ORM\Configuration */
$logger = \Doctrine\ORM\Cache\Logging\StatisticsCacheLogger();
// Cache logger
$config->setSecondLevelCacheEnabled(true);
$config->getSecondLevelCacheConfiguration()
->setCacheLogger($logger);
// Collect cache statistics
// Get the number of entries successfully retrieved from a specific region.
$logger->getRegionHitCount('my_entity_region');
// Get the number of cached entries *not* found in a specific region.
$logger->getRegionMissCount('my_entity_region');
// Get the number of cacheable entries put in cache.
$logger->getRegionPutCount('my_entity_region');
// Get the total number of put in all regions.
$logger->getPutCount();
// Get the total number of entries successfully retrieved from all regions.
$logger->getHitCount();
// Get the total number of cached entries *not* found in all regions.
$logger->getMissCount();
If you want to get more information you should implement ``\Doctrine\ORM\Cache\Logging\CacheLogger``.
and collect all information you want.
`See API Doc <http://www.doctrine-project.org/api/orm/2.5/class-Doctrine.ORM.Cache.CacheLogger.html/>`_.
Entity cache definition
-----------------------
* Entity cache configuration allows you to define the caching strategy and region for an entity.
* ``usage`` Specifies the caching strategy: ``READ_ONLY``, ``NONSTRICT_READ_WRITE``, ``READ_WRITE``. see :ref:`reference-second-level-cache-mode`
* ``region`` Optional value that specifies the name of the second level cache region.
.. configuration-block::
.. code-block:: php
<?php
/**
* @Entity
* @Cache(usage="READ_ONLY", region="my_entity_region")
*/
class Country
{
/**
* @Id
* @GeneratedValue
* @Column(type="integer")
*/
protected $id;
/**
* @Column(unique=true)
*/
protected $name;
// other properties and methods
}
.. code-block:: xml
<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="Country">
<cache usage="READ_ONLY" region="my_entity_region" />
<id name="id" type="integer" column="id">
<generator strategy="IDENTITY"/>
</id>
<field name="name" type="string" column="name"/>
</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.
It caches the primary keys of association and cache each element will be cached into its region.
.. configuration-block::
.. code-block:: php
<?php
/**
* @Entity
* @Cache("NONSTRICT_READ_WRITE")
*/
class State
{
/**
* @Id
* @GeneratedValue
* @Column(type="integer")
*/
protected $id;
/**
* @Column(unique=true)
*/
protected $name;
/**
* @Cache("NONSTRICT_READ_WRITE")
* @ManyToOne(targetEntity="Country")
* @JoinColumn(name="country_id", referencedColumnName="id")
*/
protected $country;
/**
* @Cache("NONSTRICT_READ_WRITE")
* @OneToMany(targetEntity="City", mappedBy="state")
*/
protected $cities;
// other properties and methods
}
.. code-block:: xml
<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="State">
<cache usage="NONSTRICT_READ_WRITE" />
<id name="id" type="integer" column="id">
<generator strategy="IDENTITY"/>
</id>
<field name="name" type="string" column="name"/>
<many-to-one field="country" target-entity="Country">
<cache usage="NONSTRICT_READ_WRITE" />
<join-columns>
<join-column name="country_id" referenced-column-name="id"/>
</join-columns>
</many-to-one>
<one-to-many field="cities" target-entity="City" mapped-by="state">
<cache usage="NONSTRICT_READ_WRITE"/>
</one-to-many>
</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.
Cache usage
~~~~~~~~~~~
Basic entity cache
.. code-block:: php
<?php
$em->persist(new Country($name));
$em->flush(); // Hit database to insert the row and put into cache
$em->clear(); // Clear entity manager
$country1 = $em->find('Country', 1); // Retrieve item from cache
$country->setName("New Name");
$em->persist($country);
$em->flush(); // Hit database to update the row and update cache
$em->clear(); // Clear entity manager
$country2 = $em->find('Country', 1); // Retrieve item from cache
// Notice that $country1 and $country2 are not the same instance.
Association cache
.. code-block:: php
<?php
// Hit database to insert the row and put into cache
$em->persist(new State($name, $country));
$em->flush();
// Clear entity manager
$em->clear();
// Retrieve item from cache
$state = $em->find('State', 1);
// Hit database to update the row and update cache entry
$state->setName("New Name");
$em->persist($state);
$em->flush();
// Create a new collection item
$city = new City($name, $state);
$state->addCity($city);
// Hit database to insert new collection item,
// put entity and collection cache into cache.
$em->persist($city);
$em->persist($state);
$em->flush();
// Clear entity manager
$em->clear();
// Retrieve item from cache
$state = $em->find('State', 1);
// Retrieve association from cache
$country = $state->getCountry();
// Retrieve collection from cache
$cities = $state->getCities();
echo $country->getName();
echo $state->getName();
// Retrieve each collection item from cache
foreach ($cities as $city) {
echo $city->getName();
}
.. note::
Notice that all entities should be marked as cacheable.
Using the query cache
---------------------
The second level cache stores the entities, associations and collections.
The query cache stores the results of the query but as identifiers, entity values are actually stored in the 2nd level cache.
.. note::
Query cache should always be used in conjunction with the second-level-cache for those entities which should be cached.
.. code-block:: php
<?php
/* @var $em \Doctrine\ORM\EntityManager */
// Execute database query, store query cache and entity cache
$result1 = $em->createQuery('SELECT c FROM Country c ORDER BY c.name')
->setCacheable(true)
->getResult();
$em->clear()
// Check if query result is valid and load entities from cache
$result2 = $em->createQuery('SELECT c FROM Country c ORDER BY c.name')
->setCacheable(true)
->getResult();
Cache mode
~~~~~~~~~~
The Cache Mode controls how a particular query interacts with the second-level cache:
* ``Cache::MODE_GET`` - May read items from the cache, but will not add items.
* ``Cache::MODE_PUT`` - Will never read items from the cache, but will add items to the cache as it reads them from the database.
* ``Cache::MODE_NORMAL`` - May read items from the cache, and add items to the cache.
* ``Cache::MODE_REFRESH`` - The query will never read items from the cache, but will refresh items to the cache as it reads them from the database.
.. code-block:: php
<?php
/* @var $em \Doctrine\ORM\EntityManager */
// Will refresh the query cache and all entities the cache as it reads from the database.
$result1 = $em->createQuery('SELECT c FROM Country c ORDER BY c.name')
->setCacheMode(Cache::MODE_GET)
->setCacheable(true)
->getResult();
.. note::
The the default query cache mode is ```Cache::MODE_NORMAL```
DELETE / UPDATE queries
~~~~~~~~~~~~~~~~~~~~~~~
DQL UPDATE / DELETE statements are ported directly into a database and bypass the second-level cache,
Entities that are already cached will NOT be invalidated.
However the cached data could be evicted using the cache API or an special query hint.
Execute the ``UPDATE`` and invalidate ``all cache entries`` using ``Query::HINT_CACHE_EVICT``
.. code-block:: php
<?php
// Execute and invalidate
$this->_em->createQuery("UPDATE Entity\Country u SET u.name = 'unknown' WHERE u.id = 1")
->setHint(Query::HINT_CACHE_EVICT, true)
->execute();
Execute the ``UPDATE`` and invalidate ``all cache entries`` using the cache API
.. code-block:: php
<?php
// Execute
$this->_em->createQuery("UPDATE Entity\Country u SET u.name = 'unknown' WHERE u.id = 1")
->execute();
// Invoke Cache API
$em->getCache()->evictEntityRegion('Entity\Country');
Execute the ``UPDATE`` and invalidate ``a specific cache entry`` using the cache API
.. code-block:: php
<?php
// Execute
$this->_em->createQuery("UPDATE Entity\Country u SET u.name = 'unknown' WHERE u.id = 1")
->execute();
// Invoke Cache API
$em->getCache()->evictEntity('Entity\Country', 1);
Using the repository query cache
---------------------
As well as ``Query Cache`` all persister queries store only identifier values for an individual query.
All persister use a single timestamps cache region keeps track of the last update for each persister,
When a query is loaded from cache, the timestamp region is checked for the last update for that persister.
Using the last update timestamps as part of the query key invalidate the cache key when an update occurs.
.. code-block:: php
<?php
// load from database and store cache query key hashing the query + parameters + last timestamp cache region..
$entities = $em->getRepository('Entity\Country')->findAll();
// load from query and entities from cache..
$entities = $em->getRepository('Entity\Country')->findAll();
// update the timestamp cache region for Country
$em->persist(new Country('zombieland'));
$em->flush();
$em->clear();
// Reload from database.
// At this point the query cache key if not logger valid, the select goes straight
$entities = $em->getRepository('Entity\Country')->findAll();
Cache API
---------
Caches are not aware of changes made by another application.
However, you can use the cache API to check / invalidate cache entries.
.. code-block:: php
<?php
/* @var $cache \Doctrine\ORM\Cache */
$cache = $em->getCache();
$cache->containsEntity('Entity\State', 1) // Check if the cache exists
$cache->evictEntity('Entity\State', 1); // Remove an entity from cache
$cache->evictEntityRegion('Entity\State'); // Remove all entities from cache
$cache->containsCollection('Entity\State', 'cities', 1); // Check if the cache exists
$cache->evictCollection('Entity\State', 'cities', 1); // Remove an entity collection from cache
$cache->evictCollectionRegion('Entity\State', 'cities'); // Remove all collections from cache
Limitations
-----------
Composite primary key
~~~~~~~~~~~~~~~~~~~~~
Composite primary key are supported by second level cache,
however when one of the keys is an association the cached entity should always be retrieved using the association identifier.
For performance reasons the cache API does not extract from composite primary key.
.. code-block:: php
<?php
/**
* @Entity
*/
class Reference
{
/**
* @Id
* @ManyToOne(targetEntity="Article", inversedBy="references")
* @JoinColumn(name="source_id", referencedColumnName="article_id")
*/
private $source;
/**
* @Id
* @ManyToOne(targetEntity="Article")
* @JoinColumn(name="target_id", referencedColumnName="article_id")
*/
private $target;
}
// Supported
/* @var $article Article */
$article = $em->find('Article', 1);
// Supported
/* @var $article Article */
$article = $em->find('Article', $article);
// Supported
$id = array('source' => 1, 'target' => 2);
$reference = $em->find('Reference', $id);
// NOT Supported
$id = array('source' => new Article(1), 'target' => new Article(2));
$reference = $em->find('Reference', $id);
Distributed environments
~~~~~~~~~~~~~~~~~~~~~~~~
Some cache driver are not meant to be used in a distributed environment.
Load-balancer for distributing workloads across multiple computing resources
should be used in conjunction with distributed caching system such as memcached, redis, riak ...
Caches should be used with care when using a load-balancer if you don't share the cache.
While using APC or any file based cache update occurred in a specific machine would not reflect to the cache in other machines.
Paginator
~~~~~~~~~
Count queries generated by ``Doctrine\ORM\Tools\Pagination\Paginator`` are not cached by second-level cache.
Although entities and query result are cached count queries will hit the database every time.

View File

@@ -0,0 +1,151 @@
Security
========
The Doctrine library is operating very close to your database and as such needs
to handle and make assumptions about SQL injection vulnerabilities.
It is vital that you understand how Doctrine approaches security, because
we cannot protect you from SQL injection.
Please also read the documentation chapter on Security in Doctrine DBAL. This
page only handles Security issues in the ORM.
- [DBAL Security Page](https://github.com/doctrine/dbal/blob/master/docs/en/reference/security.rst)
If you find a Security bug in Doctrine, please report it on Jira and change the
Security Level to "Security Issues". It will be visible to Doctrine Core
developers and you only.
User input and Doctrine ORM
---------------------------
The ORM is much better at protecting against SQL injection than the DBAL alone.
You can consider the following APIs to be safe from SQL injection:
- ``\Doctrine\ORM\EntityManager#find()`` and ``getReference()``.
- All values on Objects inserted and updated through ``Doctrine\ORM\EntityManager#persist()``
- All find methods on ``Doctrine\ORM\EntityRepository``.
- User Input set to DQL Queries or QueryBuilder methods through
- ``setParameter()`` or variants
- ``setMaxResults()``
- ``setFirstResult()``
- Queries through the Criteria API on ``Doctrine\ORM\PersistentCollection`` and
``Doctrine\ORM\EntityRepository``.
You are **NOT** save from SQL injection when using user input with:
- Expression API of ``Doctrine\ORM\QueryBuilder``
- Concatenating user input into DQL SELECT, UPDATE or DELETE statements or
Native SQL.
This means SQL injections can only occur with Doctrine ORM when working with
Query Objects of any kind. The safe rule is to always use prepared statement
parameters for user objects when using a Query object.
.. warning::
Insecure code follows, don't copy paste this.
The following example shows insecure DQL usage:
.. code-block:: php
<?php
// INSECURE
$dql = "SELECT u
FROM MyProject\Entity\User u
WHERE u.status = '" . $_GET['status'] . "'
ORDER BY " . $_GET['orderField'] . " ASC";
For Doctrine there is absolutely no way to find out which parts of ``$dql`` are
from user input and which are not, even if we have our own parsing process
this is technically impossible. The correct way is:
.. code-block:: php
<?php
$orderFieldWhitelist = array('email', 'username');
$orderField = "email";
if (in_array($_GET['orderField'], $orderFieldWhitelist)) {
$orderField = $_GET['orderField'];
}
$dql = "SELECT u
FROM MyProject\Entity\User u
WHERE u.status = ?1
ORDER BY u." . $orderField . " ASC";
$query = $entityManager->createQuery($dql);
$query->setParameter(1, $_GET['status']);
Preventing Mass Assignment Vulnerabilities
------------------------------------------
ORMs are very convenient for CRUD applications and Doctrine is no exception.
However CRUD apps are often vulnerable to mass assignment security problems
when implemented naively.
Doctrine is not vulnerable to this problem out of the box, but you can easily
make your entities vulnerable to mass assignment when you add methods of
the kind ``updateFromArray()`` or ``updateFromJson()`` to them. A vulnerable
entity might look like this:
.. code-block:: php
<?php
/**
* @Entity
*/
class InsecureEntity
{
/** @Id @Column(type="integer") @GeneratedValue */
private $id;
/** @Column */
private $email;
/** @Column(type="boolean") */
private $isAdmin;
public function fromArray(array $userInput)
{
foreach ($userInput as $key => $value) {
$this->$key = $value;
}
}
}
Now the possiblity of mass-asignment exists on this entity and can
be exploitet by attackers to set the "isAdmin" flag to true on any
object when you pass the whole request data to this method like:
.. code-block:: php
<?php
$entity = new InsecureEntity();
$entity->fromArray($_POST);
$entityManager->persist($entity);
$entityManager->flush();
You can spot this problem in this very simple example easily. However
in combination with frameworks and form libraries it might not be
so obvious when this issue arises. Be careful to avoid this
kind of mistake.
How to fix this problem? You should always have a whitelist
of allowed key to set via mass assignment functions.
.. code-block:: php
public function fromArray(array $userInput, $allowedFields = array())
{
foreach ($userInput as $key => $value) {
if (in_array($key, $allowedFields)) {
$this->$key = $value;
}
}
}

528
docs/en/reference/tools.rst Normal file
View File

@@ -0,0 +1,528 @@
Tools
=====
Doctrine Console
----------------
The Doctrine Console is a Command Line Interface tool for simplifying common
administration tasks during the development of a project that uses Doctrine 2.
Take a look at the :doc:`Installation and Configuration <configuration>`
chapter for more information how to setup the console command.
Display Help Information
~~~~~~~~~~~~~~~~~~~~~~~~
Type ``php vendor/bin/doctrine`` on the command line and you should see an
overview of the available commands or use the --help flag to get
information on the available commands. If you want to know more
about the use of generate entities for example, you can call:
.. code-block:: php
$> php vendor/bin/doctrine orm:generate-entities --help
Configuration
~~~~~~~~~~~~~
Whenever the ``doctrine`` command line tool is invoked, it can
access all Commands that were registered by developer. There is no
auto-detection mechanism at work. The Doctrine binary
already registers all the commands that currently ship with
Doctrine DBAL and ORM. If you want to use additional commands you
have to register them yourself.
All the commands of the Doctrine Console require access to the ``EntityManager``
or ``DBAL`` Connection. You have to inject them into the console application
using so called Helper-Sets. This requires either the ``db``
or the ``em`` helpers to be defined in order to work correctly.
Whenever you invoke the Doctrine binary the current folder is searched for a
``cli-config.php`` file. This file contains the project specific configuration:
.. code-block:: php
<?php
$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($conn)
));
$cli->setHelperSet($helperSet);
When dealing with the ORM package, the EntityManagerHelper is
required:
.. code-block:: php
<?php
$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
));
$cli->setHelperSet($helperSet);
The HelperSet instance has to be generated in a separate file (i.e.
``cli-config.php``) that contains typical Doctrine bootstrap code
and predefines the needed HelperSet attributes mentioned above. A
sample ``cli-config.php`` file looks as follows:
.. code-block:: php
<?php
// cli-config.php
require_once 'my_bootstrap.php';
// Any way to access the EntityManager from your application
$em = GetMyEntityManager();
$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
));
It is important to define a correct HelperSet that Doctrine binary
script will ultimately use. The Doctrine Binary will automatically
find the first instance of HelperSet in the global variable
namespace and use this.
.. note::
You have to adjust this snippet for your specific application or framework
and use their facilities to access the Doctrine EntityManager and
Connection Resources.
Command Overview
~~~~~~~~~~~~~~~~
The following Commands are currently available:
- ``help`` Displays help for a command (?)
- ``list`` Lists commands
- ``dbal:import`` Import SQL file(s) directly to Database.
- ``dbal:run-sql`` Executes arbitrary SQL directly from the
command line.
- ``orm:clear-cache:metadata`` Clear all metadata cache of the
various cache drivers.
- ``orm:clear-cache:query`` Clear all query cache of the various
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.
- ``orm:run-dql`` Executes arbitrary DQL directly from the command
line.
- ``orm:schema-tool:create`` Processes the schema and either
create it directly on EntityManager Storage Connection or generate
the SQL output.
- ``orm:schema-tool:drop`` Processes the schema and either drop
the database schema of EntityManager Storage Connection or generate
the SQL output.
- ``orm:schema-tool:update`` Processes the schema and either
update the database schema of EntityManager Storage Connection or
generate the SQL output.
For these commands are also available aliases:
- ``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::
Console also supports auto completion, for example, instead of
``orm:clear-cache:query`` you can use just ``o:c:q``.
Database Schema Generation
--------------------------
.. note::
SchemaTool can do harm to your database. It will drop or alter
tables, indexes, sequences and such. Please use this tool with
caution in development and not on a production server. It is meant
for helping you develop your Database Schema, but NOT with
migrating schema from A to B in production. A safe approach would
be generating the SQL on development server and saving it into SQL
Migration files that are executed manually on the production
server.
SchemaTool assumes your Doctrine Project uses the given database on
its own. Update and Drop commands will mess with other tables if
they are not related to the current project that is using Doctrine.
Please be careful!
To generate your database schema from your Doctrine mapping files
you can use the ``SchemaTool`` class or the ``schema-tool`` Console
Command.
When using the SchemaTool class directly, create your schema using
the ``createSchema()`` method. First create an instance of the
``SchemaTool`` and pass it an instance of the ``EntityManager``
that you want to use to create the schema. This method receives an
array of ``ClassMetadataInfo`` instances.
.. code-block:: php
<?php
$tool = new \Doctrine\ORM\Tools\SchemaTool($em);
$classes = array(
$em->getClassMetadata('Entities\User'),
$em->getClassMetadata('Entities\Profile')
);
$tool->createSchema($classes);
To drop the schema you can use the ``dropSchema()`` method.
.. code-block:: php
<?php
$tool->dropSchema($classes);
This drops all the tables that are currently used by your metadata
model. When you are changing your metadata a lot during development
you might want to drop the complete database instead of only the
tables of the current model to clean up with orphaned tables.
.. code-block:: php
<?php
$tool->dropSchema($classes, \Doctrine\ORM\Tools\SchemaTool::DROP_DATABASE);
You can also use database introspection to update your schema
easily with the ``updateSchema()`` method. It will compare your
existing database schema to the passed array of
``ClassMetdataInfo`` instances.
.. code-block:: php
<?php
$tool->updateSchema($classes);
If you want to use this functionality from the command line you can
use the ``schema-tool`` command.
To create the schema use the ``create`` command:
.. code-block:: php
$ php doctrine orm:schema-tool:create
To drop the schema use the ``drop`` command:
.. code-block:: php
$ php doctrine orm:schema-tool:drop
If you want to drop and then recreate the schema then use both
options:
.. code-block:: php
$ php doctrine orm:schema-tool:drop
$ php doctrine orm:schema-tool:create
As you would think, if you want to update your schema use the
``update`` command:
.. code-block:: php
$ php doctrine orm:schema-tool:update
All of the above commands also accept a ``--dump-sql`` option that
will output the SQL for the ran operation.
.. code-block:: php
$ php doctrine orm:schema-tool:create --dump-sql
Before using the orm:schema-tool commands, remember to configure
your cli-config.php properly.
.. note::
When using the Annotation Mapping Driver you have to either setup
your autoloader in the cli-config.php correctly to find all the
entities, or you can use the second argument of the
``EntityManagerHelper`` to specify all the paths of your entities
(or mapping files), i.e.
``new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em, $mappingPaths);``
Entity Generation
-----------------
Generate entity classes and method stubs from your mapping information.
.. code-block:: php
$ php doctrine orm:generate-entities
$ php doctrine orm:generate-entities --update-entities
$ php 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 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 ``ClassMetadataInfo`` 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 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
$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 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
-----------------------------------------
For performance reasons Doctrine 2 has to skip some of the
necessary validation of metadata mappings. You have to execute
this validation in your development workflow to verify the
associations are correctly defined.
You can either use the Doctrine Command Line Tool:
.. code-block:: php
doctrine orm:validate-schema
Or you can trigger the validation manually:
.. code-block:: php
<?php
use Doctrine\ORM\Tools\SchemaValidator;
$validator = new SchemaValidator($entityManager);
$errors = $validator->validateMapping();
if (count($errors) > 0) {
// Lots of errors!
echo implode("\n\n", $errors);
}
If the mapping is invalid the errors array contains a positive
number of elements with error messages.
.. warning::
One mapping option that is not validated is the use of the referenced column name.
It has to point to the equivalent primary key otherwise Doctrine will not work.
.. note::
One common error is to use a backlash in front of the
fully-qualified class-name. Whenever a FQCN is represented inside a
string (such as in your mapping definitions) you have to drop the
prefix backslash. PHP does this with ``get_class()`` or Reflection
methods for backwards compatibility reasons.
Adding own commands
-------------------
You can also add your own commands on-top of the Doctrine supported
tools if you are using a manually built console script.
To include a new command on Doctrine Console, you need to do modify the
``doctrine.php`` file a little:
.. code-block:: php
<?php
// doctrine.php
use Symfony\Component\Console\Helper\Application;
// as before ...
// replace the ConsoleRunner::run() statement with:
$cli = new Application('Doctrine Command Line Interface', \Doctrine\ORM\Version::VERSION);
$cli->setCatchExceptions(true);
$cli->setHelperSet($helperSet);
// Register All Doctrine Commands
ConsoleRunner::addCommands($cli);
// Register your own command
$cli->addCommand(new \MyProject\Tools\Console\Commands\MyCustomCommand);
// Runs console application
$cli->run();
Additionally, include multiple commands (and overriding previously
defined ones) is possible through the command:
.. code-block:: php
<?php
$cli->addCommands(array(
new \MyProject\Tools\Console\Commands\MyCustomCommand(),
new \MyProject\Tools\Console\Commands\SomethingCommand(),
new \MyProject\Tools\Console\Commands\AnotherCommand(),
new \MyProject\Tools\Console\Commands\OneMoreCommand(),
));
Re-use console application
--------------------------
You are also able to retrieve and re-use the default console application.
Just call ``ConsoleRunner::createApplication(...)`` with an appropriate
HelperSet, like it is described in the configuration section.
.. code-block:: php
<?php
// Retrieve default console application
$cli = ConsoleRunner::createApplication($helperSet);
// Runs console application
$cli->run();

View File

@@ -0,0 +1,350 @@
Transactions and Concurrency
============================
Transaction Demarcation
-----------------------
Transaction demarcation is the task of defining your transaction
boundaries. Proper transaction demarcation is very important
because if not done properly it can negatively affect the
performance of your application. Many databases and database
abstraction layers like PDO by default operate in auto-commit mode,
which means that every single SQL statement is wrapped in a small
transaction. Without any explicit transaction demarcation from your
side, this quickly results in poor performance because transactions
are not cheap.
For the most part, Doctrine 2 already takes care of proper
transaction demarcation for you: All the write operations
(INSERT/UPDATE/DELETE) are queued until ``EntityManager#flush()``
is invoked which wraps all of these changes in a single
transaction.
However, Doctrine 2 also allows (and encourages) you to take over
and control transaction demarcation yourself.
These are two ways to deal with transactions when using the
Doctrine ORM and are now described in more detail.
Approach 1: Implicitly
~~~~~~~~~~~~~~~~~~~~~~
The first approach is to use the implicit transaction handling
provided by the Doctrine ORM EntityManager. Given the following
code snippet, without any explicit transaction demarcation:
.. code-block:: php
<?php
// $em instanceof EntityManager
$user = new User;
$user->setName('George');
$em->persist($user);
$em->flush();
Since we do not do any custom transaction demarcation in the above
code, ``EntityManager#flush()`` will begin and commit/rollback a
transaction. This behavior is made possible by the aggregation of
the DML operations by the Doctrine ORM and is sufficient if all the
data manipulation that is part of a unit of work happens through
the domain model and thus the ORM.
Approach 2: Explicitly
~~~~~~~~~~~~~~~~~~~~~~
The explicit alternative is to use the ``Doctrine\DBAL\Connection``
API directly to control the transaction boundaries. The code then
looks like this:
.. code-block:: php
<?php
// $em instanceof EntityManager
$em->getConnection()->beginTransaction(); // suspend auto-commit
try {
//... do some work
$user = new User;
$user->setName('George');
$em->persist($user);
$em->flush();
$em->getConnection()->commit();
} catch (Exception $e) {
$em->getConnection()->rollback();
throw $e;
}
Explicit transaction demarcation is required when you want to
include custom DBAL operations in a unit of work or when you want
to make use of some methods of the ``EntityManager`` API that
require an active transaction. Such methods will throw a
``TransactionRequiredException`` to inform you of that
requirement.
A more convenient alternative for explicit transaction demarcation is the use
of provided control abstractions in the form of
``Connection#transactional($func)`` and ``EntityManager#transactional($func)``.
When used, these control abstractions ensure that you never forget to rollback
the transaction, in addition to the obvious code reduction. An example that is
functionally equivalent to the previously shown code looks as follows:
.. code-block:: php
<?php
// $em instanceof EntityManager
$em->transactional(function($em) {
//... do some work
$user = new User;
$user->setName('George');
$em->persist($user);
});
The difference between ``Connection#transactional($func)`` and
``EntityManager#transactional($func)`` is that the latter
abstraction flushes the ``EntityManager`` prior to transaction
commit and rolls back the transaction when an
exception occurs.
Exception Handling
~~~~~~~~~~~~~~~~~~
When using implicit transaction demarcation and an exception occurs
during ``EntityManager#flush()``, the transaction is automatically
rolled back and the ``EntityManager`` closed.
When using explicit transaction demarcation and an exception
occurs, the transaction should be rolled back immediately and the
``EntityManager`` closed by invoking ``EntityManager#close()`` and
subsequently discarded, as demonstrated in the example above. This
can be handled elegantly by the control abstractions shown earlier.
Note that when catching ``Exception`` you should generally re-throw
the exception. If you intend to recover from some exceptions, catch
them explicitly in earlier catch blocks (but do not forget to
rollback the transaction and close the ``EntityManager`` there as
well). All other best practices of exception handling apply
similarly (i.e. either log or re-throw, not both, etc.).
As a result of this procedure, all previously managed or removed
instances of the ``EntityManager`` become detached. The state of
the detached objects will be the state at the point at which the
transaction was rolled back. The state of the objects is in no way
rolled back and thus the objects are now out of synch with the
database. The application can continue to use the detached objects,
knowing that their state is potentially no longer accurate.
If you intend to start another unit of work after an exception has
occurred you should do that with a new ``EntityManager``.
Locking Support
---------------
Doctrine 2 offers support for Pessimistic- and Optimistic-locking
strategies natively. This allows to take very fine-grained control
over what kind of locking is required for your Entities in your
application.
Optimistic Locking
~~~~~~~~~~~~~~~~~~
Database transactions are fine for concurrency control during a
single request. However, a database transaction should not span
across requests, the so-called "user think time". Therefore a
long-running "business transaction" that spans multiple requests
needs to involve several database transactions. Thus, database
transactions alone can no longer control concurrency during such a
long-running business transaction. Concurrency control becomes the
partial responsibility of the application itself.
Doctrine has integrated support for automatic optimistic locking
via a version field. In this approach any entity that should be
protected against concurrent modifications during long-running
business transactions gets a version field that is either a simple
number (mapping type: integer) or a timestamp (mapping type:
datetime). When changes to such an entity are persisted at the end
of a long-running conversation the version of the entity is
compared to the version in the database and if they don't match, an
``OptimisticLockException`` is thrown, indicating that the entity
has been modified by someone else already.
You designate a version field in an entity as follows. In this
example we'll use an integer.
.. code-block:: php
<?php
class User
{
// ...
/** @Version @Column(type="integer") */
private $version;
// ...
}
Alternatively a datetime type can be used (which maps to a SQL
timestamp or datetime):
.. code-block:: php
<?php
class User
{
// ...
/** @Version @Column(type="datetime") */
private $version;
// ...
}
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,
depending on the resolution of the timestamp on the particular
database platform.
When a version conflict is encountered during
``EntityManager#flush()``, an ``OptimisticLockException`` is thrown
and the active transaction rolled back (or marked for rollback).
This exception can be caught and handled. Potential responses to an
OptimisticLockException are to present the conflict to the user or
to refresh or reload objects in a new transaction and then retrying
the transaction.
With PHP promoting a share-nothing architecture, the time between
showing an update form and actually modifying the entity can in the
worst scenario be as long as your applications session timeout. If
changes happen to the entity in that time frame you want to know
directly when retrieving the entity that you will hit an optimistic
locking exception:
You can always verify the version of an entity during a request
either when calling ``EntityManager#find()``:
.. code-block:: php
<?php
use Doctrine\DBAL\LockMode;
use Doctrine\ORM\OptimisticLockException;
$theEntityId = 1;
$expectedVersion = 184;
try {
$entity = $em->find('User', $theEntityId, LockMode::OPTIMISTIC, $expectedVersion);
// do the work
$em->flush();
} catch(OptimisticLockException $e) {
echo "Sorry, but someone else has already changed this entity. Please apply the changes again!";
}
Or you can use ``EntityManager#lock()`` to find out:
.. code-block:: php
<?php
use Doctrine\DBAL\LockMode;
use Doctrine\ORM\OptimisticLockException;
$theEntityId = 1;
$expectedVersion = 184;
$entity = $em->find('User', $theEntityId);
try {
// assert version
$em->lock($entity, LockMode::OPTIMISTIC, $expectedVersion);
} catch(OptimisticLockException $e) {
echo "Sorry, but someone else has already changed this entity. Please apply the changes again!";
}
Important Implementation Notes
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You can easily get the optimistic locking workflow wrong if you
compare the wrong versions. Say you have Alice and Bob editing a
hypothetical blog post:
- Alice reads the headline of the blog post being "Foo", at
optimistic lock version 1 (GET Request)
- Bob reads the headline of the blog post being "Foo", at
optimistic lock version 1 (GET Request)
- Bob updates the headline to "Bar", upgrading the optimistic lock
version to 2 (POST Request of a Form)
- Alice updates the headline to "Baz", ... (POST Request of a
Form)
Now at the last stage of this scenario the blog post has to be read
again from the database before Alice's headline can be applied. At
this point you will want to check if the blog post is still at
version 1 (which it is not in this scenario).
Using optimistic locking correctly, you *have* to add the version
as an additional hidden field (or into the SESSION for more
safety). Otherwise you cannot verify the version is still the one
being originally read from the database when Alice performed her
GET request for the blog post. If this happens you might see lost
updates you wanted to prevent with Optimistic Locking.
See the example code, The form (GET Request):
.. code-block:: php
<?php
$post = $em->find('BlogPost', 123456);
echo '<input type="hidden" name="id" value="' . $post->getId() . '" />';
echo '<input type="hidden" name="version" value="' . $post->getCurrentVersion() . '" />';
And the change headline action (POST Request):
.. code-block:: php
<?php
$postId = (int)$_GET['id'];
$postVersion = (int)$_GET['version'];
$post = $em->find('BlogPost', $postId, \Doctrine\DBAL\LockMode::OPTIMISTIC, $postVersion);
Pessimistic Locking
~~~~~~~~~~~~~~~~~~~
Doctrine 2 supports Pessimistic Locking at the database level. No
attempt is being made to implement pessimistic locking inside
Doctrine, rather vendor-specific and ANSI-SQL commands are used to
acquire row-level locks. Every Entity can be part of a pessimistic
lock, there is no special metadata required to use this feature.
However for Pessimistic Locking to work you have to disable the
Auto-Commit Mode of your Database and start a transaction around
your pessimistic lock use-case using the "Approach 2: Explicit
Transaction Demarcation" described above. Doctrine 2 will throw an
Exception if you attempt to acquire an pessimistic lock and no
transaction is running.
Doctrine 2 currently supports two pessimistic lock modes:
- Pessimistic Write
(``Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE``), locks the
underlying database rows for concurrent Read and Write Operations.
- Pessimistic Read (``Doctrine\DBAL\LockMode::PESSIMISTIC_READ``),
locks other concurrent requests that attempt to update or lock rows
in write mode.
You can use pessimistic locks in three different scenarios:
1. Using
``EntityManager#find($className, $id, \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE)``
or
``EntityManager#find($className, $id, \Doctrine\DBAL\LockMode::PESSIMISTIC_READ)``
2. Using
``EntityManager#lock($entity, \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE)``
or
``EntityManager#lock($entity, \Doctrine\DBAL\LockMode::PESSIMISTIC_READ)``
3. Using
``Query#setLockMode(\Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE)``
or
``Query#setLockMode(\Doctrine\DBAL\LockMode::PESSIMISTIC_READ)``

View File

@@ -0,0 +1,60 @@
Association Updates: Owning Side and Inverse Side
=================================================
When mapping bidirectional associations it is important to
understand the concept of the owning and inverse sides. The
following general rules apply:
- Relationships may be bidirectional or unidirectional.
- A bidirectional relationship has both an owning side and an inverse side
- A unidirectional relationship only has an owning side.
- Doctrine will **only** check the owning side of an association for changes.
Bidirectional Associations
--------------------------
The following rules apply to **bidirectional** associations:
- The inverse side has to use the ``mappedBy`` attribute of the OneToOne,
OneToMany, or ManyToMany mapping declaration. The mappedBy
attribute contains the name of the association-field on the owning side.
- The owning side has to use the ``inversedBy`` attribute of the
OneToOne, ManyToOne, or ManyToMany mapping declaration.
The inversedBy attribute contains the name of the association-field
on the inverse-side.
- ManyToOne is always the owning side of a bidirectional association.
- OneToMany is always the inverse side of a bidirectional association.
- The owning side of a OneToOne association is the entity with the table
containing the foreign key.
- You can pick the owning side of a many-to-many association yourself.
Important concepts
------------------
**Doctrine will only check the owning side of an association for changes.**
To fully understand this, remember how bidirectional associations
are maintained in the object world. There are 2 references on each
side of the association and these 2 references both represent the
same association but can change independently of one another. Of
course, in a correct application the semantics of the bidirectional
association are properly maintained by the application developer
(that's his responsibility). Doctrine needs to know which of these
two in-memory references is the one that should be persisted and
which not. This is what the owning/inverse concept is mainly used
for.
**Changes made only to the inverse side of an association are ignored. Make sure to update both sides of a bidirectional association (or at least the owning side, from Doctrine's point of view)**
The owning side of a bidirectional association is the side Doctrine
"looks at" when determining the state of the association, and
consequently whether there is anything to do to update the
association in the database.
.. note::
"Owning side" and "inverse side" are technical concepts of
the ORM technology, not concepts of your domain model. What you
consider as the owning side in your domain model can be different
from what the owning side is for Doctrine. These are unrelated.

View File

@@ -0,0 +1,201 @@
Doctrine Internals explained
============================
Object relational mapping is a complex topic and sufficiently understanding how Doctrine works internally helps you use its full power.
How Doctrine keeps track of Objects
-----------------------------------
Doctrine uses the Identity Map pattern to track objects. Whenever you fetch an
object from the database, Doctrine will keep a reference to this object inside
its UnitOfWork. The array holding all the entity references is two-levels deep
and has the keys "root entity name" and "id". Since Doctrine allows composite
keys the id is a sorted, serialized version of all the key columns.
This allows Doctrine room for optimizations. If you call the EntityManager and
ask for an entity with a specific ID twice, it will return the same instance:
.. code-block:: php
public function testIdentityMap()
{
$objectA = $this->entityManager->find('EntityName', 1);
$objectB = $this->entityManager->find('EntityName', 1);
$this->assertSame($objectA, $objectB)
}
Only one SELECT query will be fired against the database here. In the second
``EntityManager#find()`` call Doctrine will check the identity map first and
doesn't need to make that database roundtrip.
Even if you get a proxy object first then fetch the object by the same id you
will still end up with the same reference:
.. code-block:: php
public function testIdentityMapReference()
{
$objectA = $this->entityManager->getReference('EntityName', 1);
// check for proxyinterface
$this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $objectA);
$objectB = $this->entityManager->find('EntityName', 1);
$this->assertSame($objectA, $objectB)
}
The identity map being indexed by primary keys only allows shortcuts when you
ask for objects by primary key. Assume you have the following ``persons``
table:
::
id | name
-------------
1 | Benjamin
2 | Bud
Take the following example where two
consecutive calls are made against a repository to fetch an entity by a set of
criteria:
.. code-block:: php
public function testIdentityMapRepositoryFindBy()
{
$repository = $this->entityManager->getRepository('Person');
$objectA = $repository->findOneBy(array('name' => 'Benjamin'));
$objectB = $repository->findOneBy(array('name' => 'Benjamin'));
$this->assertSame($objectA, $objectB);
}
This query will still return the same references and `$objectA` and `$objectB`
are indeed referencing the same object. However when checking your SQL logs you
will realize that two queries have been executed against the database. Doctrine
only knows objects by id, so a query for different criteria has to go to the
database, even if it was executed just before.
But instead of creating a second Person object Doctrine first gets the primary
key from the row and check if it already has an object inside the UnitOfWork
with that primary key. In our example it finds an object and decides to return
this instead of creating a new one.
The identity map has a second use-case. When you call ``EntityManager#flush``
Doctrine will ask the identity map for all objects that are currently managed.
This means you don't have to call ``EntityManager#persist`` over and over again
to pass known objects to the EntityManager. This is a NO-OP for known entities,
but leads to much code written that is confusing to other developers.
The following code WILL update your database with the changes made to the
``Person`` object, even if you did not call ``EntityManager#persist``:
.. code-block:: php
<?php
$user = $entityManager->find("Person", 1);
$user->setName("Guilherme");
$entityManager->flush();
How Doctrine Detects Changes
----------------------------
Doctrine is a data-mapper that tries to achieve persistence-ignorance (PI).
This means you map php objects into a relational database that don't
necessarily know about the database at all. A natural question would now be,
"how does Doctrine even detect objects have changed?".
For this Doctrine keeps a second map inside the UnitOfWork. Whenever you fetch
an object from the database Doctrine will keep a copy of all the properties and
associations inside the UnitOfWork. Because variables in the PHP language are
subject to "copy-on-write" the memory usage of a PHP request that only reads
objects from the database is the same as if Doctrine did not keep this variable
copy. Only if you start changing variables PHP will create new variables internally
that consume new memory.
Now whenever you call ``EntityManager#flush`` Doctrine will iterate over the
Identity Map and for each object compares the original property and association
values with the values that are currently set on the object. If changes are
detected then the object is queued for a SQL UPDATE operation. Only the fields
that actually changed are updated.
This process has an obvious performance impact. The larger the size of the
UnitOfWork is, the longer this computation takes. There are several ways to
optimize the performance of the Flush Operation:
- Mark entities as read only. These entities can only be inserted or removed,
but are never updated. They are omitted in the changeset calculation.
- 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.
Query Internals
---------------
The different ORM Layers
------------------------
Doctrine ships with a set of layers with different responsibilities. This
section gives a short explanation of each layer.
Hydration
~~~~~~~~~
Responsible for creating a final result from a raw database statement and a
result-set mapping object. The developer can choose which kind of result he
wishes to be hydrated. Default result-types include:
- SQL to Entities
- SQL to structured Arrays
- SQL to simple scalar result arrays
- SQL to a single result variable
Hydration to entities and arrays is one of most complex parts of Doctrine
algorithm-wise. It can build results with for example:
- Single table selects
- Joins with n:1 or 1:n cardinality, grouping belonging to the same parent.
- Mixed results of objects and scalar values
- Hydration of results by a given scalar value as key.
Persisters
~~~~~~~~~~
tbr
UnitOfWork
~~~~~~~~~~
tbr
ResultSetMapping
~~~~~~~~~~~~~~~~
tbr
DQL Parser
~~~~~~~~~~
tbr
SQLWalker
~~~~~~~~~
tbr
EntityManager
~~~~~~~~~~~~~
tbr
ClassMetadataFactory
~~~~~~~~~~~~~~~~~~~~
tbr

View File

@@ -0,0 +1,712 @@
Working with Associations
=========================
Associations between entities are represented just like in regular
object-oriented PHP code using references to other objects or
collections of objects.
Changes to associations in your code are not synchronized to the
database directly, only when calling ``EntityManager#flush()``.
There are other concepts you should know about when working
with associations in Doctrine:
- If an entity is removed from a collection, the association is
removed, not the entity itself. A collection of entities always
only represents the association to the containing entities, not the
entity itself.
- When a bidirectional assocation is updated, Doctrine only checks
on one of both sides for these changes. This is called the :doc:`owning side <unitofwork-associations>`
of the association.
- A property with a reference to many entities has to be instances of the
``Doctrine\Common\Collections\Collection`` interface.
Association Example Entities
----------------------------
We will use a simple comment system with Users and Comments as
entities to show examples of association management. See the PHP
docblocks of each association in the following example for
information about its type and if it's the owning or inverse side.
.. code-block:: php
<?php
/** @Entity */
class User
{
/** @Id @GeneratedValue @Column(type="string") */
private $id;
/**
* Bidirectional - Many users have Many favorite comments (OWNING SIDE)
*
* @ManyToMany(targetEntity="Comment", inversedBy="userFavorites")
* @JoinTable(name="user_favorite_comments")
*/
private $favorites;
/**
* Unidirectional - Many users have marked many comments as read
*
* @ManyToMany(targetEntity="Comment")
* @JoinTable(name="user_read_comments")
*/
private $commentsRead;
/**
* Bidirectional - One-To-Many (INVERSE SIDE)
*
* @OneToMany(targetEntity="Comment", mappedBy="author")
*/
private $commentsAuthored;
/**
* Unidirectional - Many-To-One
*
* @ManyToOne(targetEntity="Comment")
*/
private $firstComment;
}
/** @Entity */
class Comment
{
/** @Id @GeneratedValue @Column(type="string") */
private $id;
/**
* Bidirectional - Many comments are favorited by many users (INVERSE SIDE)
*
* @ManyToMany(targetEntity="User", mappedBy="favorites")
*/
private $userFavorites;
/**
* Bidirectional - Many Comments are authored by one user (OWNING SIDE)
*
* @ManyToOne(targetEntity="User", inversedBy="commentsAuthored")
*/
private $author;
}
This two entities generate the following MySQL Schema (Foreign Key
definitions omitted):
.. code-block:: sql
CREATE TABLE User (
id VARCHAR(255) NOT NULL,
firstComment_id VARCHAR(255) DEFAULT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE Comment (
id VARCHAR(255) NOT NULL,
author_id VARCHAR(255) DEFAULT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE user_favorite_comments (
user_id VARCHAR(255) NOT NULL,
favorite_comment_id VARCHAR(255) NOT NULL,
PRIMARY KEY(user_id, favorite_comment_id)
) ENGINE = InnoDB;
CREATE TABLE user_read_comments (
user_id VARCHAR(255) NOT NULL,
comment_id VARCHAR(255) NOT NULL,
PRIMARY KEY(user_id, comment_id)
) ENGINE = InnoDB;
Establishing Associations
-------------------------
Establishing an association between two entities is
straight-forward. Here are some examples for the unidirectional
relations of the ``User``:
.. code-block:: php
<?php
class User
{
// ...
public function getReadComments() {
return $this->commentsRead;
}
public function setFirstComment(Comment $c) {
$this->firstComment = $c;
}
}
The interaction code would then look like in the following snippet
(``$em`` here is an instance of the EntityManager):
.. code-block:: php
<?php
$user = $em->find('User', $userId);
// unidirectional many to many
$comment = $em->find('Comment', $readCommentId);
$user->getReadComments()->add($comment);
$em->flush();
// unidirectional many to one
$myFirstComment = new Comment();
$user->setFirstComment($myFirstComment);
$em->persist($myFirstComment);
$em->flush();
In the case of bi-directional associations you have to update the
fields on both sides:
.. code-block:: php
<?php
class User
{
// ..
public function getAuthoredComments() {
return $this->commentsAuthored;
}
public function getFavoriteComments() {
return $this->favorites;
}
}
class Comment
{
// ...
public function getUserFavorites() {
return $this->userFavorites;
}
public function setAuthor(User $author = null) {
$this->author = $author;
}
}
// Many-to-Many
$user->getFavorites()->add($favoriteComment);
$favoriteComment->getUserFavorites()->add($user);
$em->flush();
// Many-To-One / One-To-Many Bidirectional
$newComment = new Comment();
$user->getAuthoredComments()->add($newComment);
$newComment->setAuthor($user);
$em->persist($newComment);
$em->flush();
Notice how always both sides of the bidirectional association are
updated. The previous unidirectional associations were simpler to
handle.
Removing Associations
---------------------
Removing an association between two entities is similarly
straight-forward. There are two strategies to do so, by key and by
element. Here are some examples:
.. code-block:: php
<?php
// Remove by Elements
$user->getComments()->removeElement($comment);
$comment->setAuthor(null);
$user->getFavorites()->removeElement($comment);
$comment->getUserFavorites()->removeElement($user);
// Remove by Key
$user->getComments()->remove($ithComment);
$comment->setAuthor(null);
You need to call ``$em->flush()`` to make persist these changes in
the database permanently.
Notice how both sides of the bidirectional association are always
updated. Unidirectional associations are consequently simpler to
handle. Also note that if you use type-hinting in your methods, i.e.
``setAddress(Address $address)``, PHP will only allow null
values if ``null`` is set as default value. Otherwise
setAddress(null) will fail for removing the association. If you
insist on type-hinting a typical way to deal with this is to
provide a special method, like ``removeAddress()``. This can also
provide better encapsulation as it hides the internal meaning of
not having an address.
When working with collections, keep in mind that a Collection is
essentially an ordered map (just like a PHP array). That is why the
``remove`` operation accepts an index/key. ``removeElement`` is a
separate method that has O(n) complexity using ``array_search``,
where n is the size of the map.
.. note::
Since Doctrine always only looks at the owning side of a
bidirectional association for updates, it is not necessary for
write operations that an inverse collection of a bidirectional
one-to-many or many-to-many association is updated. This knowledge
can often be used to improve performance by avoiding the loading of
the inverse collection.
You can also clear the contents of a whole collection using the
``Collections::clear()`` method. You should be aware that using
this method can lead to a straight and optimized database delete or
update call during the flush operation that is not aware of
entities that have been re-added to the collection.
Say you clear a collection of tags by calling
``$post->getTags()->clear();`` and then call
``$post->getTags()->add($tag)``. This will not recognize the tag having
already been added previously and will consequently issue two separate database
calls.
Association Management Methods
------------------------------
It is generally a good idea to encapsulate proper association
management inside the entity classes. This makes it easier to use
the class correctly and can encapsulate details about how the
association is maintained.
The following code shows updates to the previous User and Comment
example that encapsulate much of the association management code:
.. code-block:: php
<?php
class User
{
//...
public function markCommentRead(Comment $comment) {
// Collections implement ArrayAccess
$this->commentsRead[] = $comment;
}
public function addComment(Comment $comment) {
if (count($this->commentsAuthored) == 0) {
$this->setFirstComment($comment);
}
$this->comments[] = $comment;
$comment->setAuthor($this);
}
private function setFirstComment(Comment $c) {
$this->firstComment = $c;
}
public function addFavorite(Comment $comment) {
$this->favorites->add($comment);
$comment->addUserFavorite($this);
}
public function removeFavorite(Comment $comment) {
$this->favorites->removeElement($comment);
$comment->removeUserFavorite($this);
}
}
class Comment
{
// ..
public function addUserFavorite(User $user) {
$this->userFavorites[] = $user;
}
public function removeUserFavorite(User $user) {
$this->userFavorites->removeElement($user);
}
}
You will notice that ``addUserFavorite`` and ``removeUserFavorite``
do not call ``addFavorite`` and ``removeFavorite``, thus the
bidirectional association is strictly-speaking still incomplete.
However if you would naively add the ``addFavorite`` in
``addUserFavorite``, you end up with an infinite loop, so more work
is needed. As you can see, proper bidirectional association
management in plain OOP is a non-trivial task and encapsulating all
the details inside the classes can be challenging.
.. note::
If you want to make sure that your collections are perfectly
encapsulated you should not return them from a
``getCollectionName()`` method directly, but call
``$collection->toArray()``. This way a client programmer for the
entity cannot circumvent the logic you implement on your entity for
association management. For example:
.. code-block:: php
<?php
class User {
public function getReadComments() {
return $this->commentsRead->toArray();
}
}
This will however always initialize the collection, with all the
performance penalties given the size. In some scenarios of large
collections it might even be a good idea to completely hide the
read access behind methods on the EntityRepository.
There is no single, best way for association management. It greatly
depends on the requirements of your concrete domain model as well
as your preferences.
Synchronizing Bidirectional Collections
---------------------------------------
In the case of Many-To-Many associations you as the developer have the
responsibility of keeping the collections on the owning and inverse side
in sync when you apply changes to them. Doctrine can only
guarantee a consistent state for the hydration, not for your client
code.
Using the User-Comment entities from above, a very simple example
can show the possible caveats you can encounter:
.. code-block:: php
<?php
$user->getFavorites()->add($favoriteComment);
// not calling $favoriteComment->getUserFavorites()->add($user);
$user->getFavorites()->contains($favoriteComment); // TRUE
$favoriteComment->getUserFavorites()->contains($user); // FALSE
There are two approaches to handle this problem in your code:
1. Ignore updating the inverse side of bidirectional collections,
BUT never read from them in requests that changed their state. In
the next Request Doctrine hydrates the consistent collection state
again.
2. Always keep the bidirectional collections in sync through
association management methods. Reads of the Collections directly
after changes are consistent then.
Transitive persistence / Cascade Operations
-------------------------------------------
Persisting, removing, detaching, refreshing and merging individual entities can
become pretty cumbersome, especially when a highly interweaved object graph
is involved. Therefore Doctrine 2 provides a
mechanism for transitive persistence through cascading of these
operations. Each association to another entity or a collection of
entities can be configured to automatically cascade certain
operations. By default, no operations are cascaded.
The following cascade options exist:
- persist : Cascades persist operations to the associated
entities.
- remove : Cascades remove operations to the associated entities.
- merge : Cascades merge operations to the associated entities.
- detach : Cascades detach operations to the associated entities.
- refresh : Cascades refresh operations to the associated entities.
- all : Cascades persist, remove, merge, refresh and detach operations to
associated entities.
.. note::
Cascade operations are performed in memory. That means collections and related entities
are fetched into memory, even if they are still marked as lazy when
the cascade operation is about to be performed. However this approach allows
entity lifecycle events to be performed for each of these operations.
However, pulling objects graph into memory on cascade can cause considerable performance
overhead, especially when cascading collections are large. Makes sure
to weigh the benefits and downsides of each cascade operation that you define.
To rely on the database level cascade operations for the delete operation instead, you can
configure each join column with the **onDelete** option. See the respective
mapping driver chapters for more information.
The following example is an extension to the User-Comment example
of this chapter. Suppose in our application a user is created
whenever he writes his first comment. In this case we would use the
following code:
.. code-block:: php
<?php
$user = new User();
$myFirstComment = new Comment();
$user->addComment($myFirstComment);
$em->persist($user);
$em->persist($myFirstComment);
$em->flush();
Even if you *persist* a new User that contains our new Comment this
code would fail if you removed the call to
``EntityManager#persist($myFirstComment)``. Doctrine 2 does not
cascade the persist operation to all nested entities that are new
as well.
More complicated is the deletion of all of a user's comments when he is
removed from the system:
.. code-block:: php
<?php
$user = $em->find('User', $deleteUserId);
foreach ($user->getAuthoredComments() as $comment) {
$em->remove($comment);
}
$em->remove($user);
$em->flush();
Without the loop over all the authored comments Doctrine would use
an UPDATE statement only to set the foreign key to NULL and only
the User would be deleted from the database during the
flush()-Operation.
To have Doctrine handle both cases automatically we can change the
``User#commentsAuthored`` property to cascade both the "persist"
and the "remove" operation.
.. code-block:: php
<?php
class User
{
//...
/**
* Bidirectional - One-To-Many (INVERSE SIDE)
*
* @OneToMany(targetEntity="Comment", mappedBy="author", cascade={"persist", "remove"})
*/
private $commentsAuthored;
//...
}
Even though automatic cascading is convenient it should be used
with care. Do not blindly apply cascade=all to all associations as
it will unnecessarily degrade the performance of your application.
For each cascade operation that gets activated Doctrine also
applies that operation to the association, be it single or
collection valued.
Persistence by Reachability: Cascade Persist
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
There are additional semantics that apply to the Cascade Persist
operation. During each flush() operation Doctrine detects if there
are new entities in any collection and three possible cases can
happen:
1. New entities in a collection marked as cascade persist will be
directly persisted by Doctrine.
2. New entities in a collection not marked as cascade persist will
produce an Exception and rollback the flush() operation.
3. Collections without new entities are skipped.
This concept is called Persistence by Reachability: New entities
that are found on already managed entities are automatically
persisted as long as the association is defined as cascade
persist.
Orphan Removal
--------------
There is another concept of cascading that is relevant only when removing entities
from collections. If an Entity of type ``A`` contains references to privately
owned Entities ``B`` then if the reference from ``A`` to ``B`` is removed the
entity ``B`` should also be removed, because it is not used anymore.
OrphanRemoval works with one-to-one, one-to-many and many-to-many associations.
.. note::
When using the ``orphanRemoval=true`` option Doctrine makes the assumption
that the entities are privately owned and will **NOT** be reused by other entities.
If you neglect this assumption your entities will get deleted by Doctrine even if
you assigned the orphaned entity to another one.
As a better example consider an Addressbook application where you have Contacts, Addresses
and StandingData:
.. code-block:: php
<?php
namespace Addressbook;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @Entity
*/
class Contact
{
/** @Id @Column(type="integer") @GeneratedValue */
private $id;
/** @OneToOne(targetEntity="StandingData", orphanRemoval=true) */
private $standingData;
/** @OneToMany(targetEntity="Address", mappedBy="contact", orphanRemoval=true) */
private $addresses;
public function __construct()
{
$this->addresses = new ArrayCollection();
}
public function newStandingData(StandingData $sd)
{
$this->standingData = $sd;
}
public function removeAddress($pos)
{
unset($this->addresses[$pos]);
}
}
Now two examples of what happens when you remove the references:
.. code-block:: php
<?php
$contact = $em->find("Addressbook\Contact", $contactId);
$contact->newStandingData(new StandingData("Firstname", "Lastname", "Street"));
$contact->removeAddress(1);
$em->flush();
In this case you have not only changed the ``Contact`` entity itself but
you have also removed the references for standing data and as well as one
address reference. When flush is called not only are the references removed
but both the old standing data and the one address entity are also deleted
from the database.
Filtering Collections
---------------------
.. filtering-collections:
Collections have a filtering API that allows to slice parts of data from
a collection. If the collection has not been loaded from the database yet,
the filtering API can work on the SQL level to make optimized access to
large collections.
.. code-block:: php
<?php
use Doctrine\Common\Collections\Criteria;
$group = $entityManager->find('Group', $groupId);
$userCollection = $group->getUsers();
$criteria = Criteria::create()
->where(Criteria::expr()->eq("birthday", "1982-02-17"))
->orderBy(array("username" => Criteria::ASC))
->setFirstResult(0)
->setMaxResults(20)
;
$birthdayUsers = $userCollection->matching($criteria);
.. tip::
You can move the access of slices of collections into dedicated methods of
an entity. For example ``Group#getTodaysBirthdayUsers()``.
The Criteria has a limited matching language that works both on the
SQL and on the PHP collection level. This means you can use collection matching
interchangeably, independent of in-memory or sql-backed collections.
.. code-block:: php
<?php
use Doctrine\Common\Collections;
class Criteria
{
/**
* @return Criteria
*/
static public function create();
/**
* @param Expression $where
* @return Criteria
*/
public function where(Expression $where);
/**
* @param Expression $where
* @return Criteria
*/
public function andWhere(Expression $where);
/**
* @param Expression $where
* @return Criteria
*/
public function orWhere(Expression $where);
/**
* @param array $orderings
* @return Criteria
*/
public function orderBy(array $orderings);
/**
* @param int $firstResult
* @return Criteria
*/
public function setFirstResult($firstResult);
/**
* @param int $maxResults
* @return Criteria
*/
public function setMaxResults($maxResults);
public function getOrderings();
public function getWhereExpression();
public function getFirstResult();
public function getMaxResults();
}
You can build expressions through the ExpressionBuilder. It has the following
methods:
* ``andX($arg1, $arg2, ...)``
* ``orX($arg1, $arg2, ...)``
* ``eq($field, $value)``
* ``gt($field, $value)``
* ``lt($field, $value)``
* ``lte($field, $value)``
* ``gte($field, $value)``
* ``neq($field, $value)``
* ``isNull($field)``
* ``in($field, array $values)``
* ``notIn($field, array $values)``
* ``contains($field, $value)``
.. note::
There is a limitation on the compatibility of Criteria comparisons.
You have to use scalar values only as the value in a comparison or
the behaviour between different backends is not the same.

View File

@@ -0,0 +1,852 @@
Working with Objects
====================
In this chapter we will help you understand the ``EntityManager``
and the ``UnitOfWork``. A Unit of Work is similar to an
object-level transaction. A new Unit of Work is implicitly started
when an EntityManager is initially created or after
``EntityManager#flush()`` has been invoked. A Unit of Work is
committed (and a new one started) by invoking
``EntityManager#flush()``.
A Unit of Work can be manually closed by calling
EntityManager#close(). Any changes to objects within this Unit of
Work that have not yet been persisted are lost.
.. note::
It is very important to understand that only
``EntityManager#flush()`` ever causes write operations against the
database to be executed. Any other methods such as
``EntityManager#persist($entity)`` or
``EntityManager#remove($entity)`` only notify the UnitOfWork to
perform these operations during flush.
Not calling ``EntityManager#flush()`` will lead to all changes
during that request being lost.
Entities and the Identity Map
-----------------------------
Entities are objects with identity. Their identity has a conceptual
meaning inside your domain. In a CMS application each article has a
unique id. You can uniquely identify each article by that id.
Take the following example, where you find an article with the
headline "Hello World" with the ID 1234:
.. code-block:: php
<?php
$article = $entityManager->find('CMS\Article', 1234);
$article->setHeadline('Hello World dude!');
$article2 = $entityManager->find('CMS\Article', 1234);
echo $article2->getHeadline();
In this case the Article is accessed from the entity manager twice,
but modified in between. Doctrine 2 realizes this and will only
ever give you access to one instance of the Article with ID 1234,
no matter how often do you retrieve it from the EntityManager and
even no matter what kind of Query method you are using (find,
Repository Finder or DQL). This is called "Identity Map" pattern,
which means Doctrine keeps a map of each entity and ids that have
been retrieved per PHP request and keeps returning you the same
instances.
In the previous example the echo prints "Hello World dude!" to the
screen. You can even verify that ``$article`` and ``$article2`` are
indeed pointing to the same instance by running the following
code:
.. code-block:: php
<?php
if ($article === $article2) {
echo "Yes we are the same!";
}
Sometimes you want to clear the identity map of an EntityManager to
start over. We use this regularly in our unit-tests to enforce
loading objects from the database again instead of serving them
from the identity map. You can call ``EntityManager#clear()`` to
achieve this result.
Entity Object Graph Traversal
-----------------------------
Although Doctrine allows for a complete separation of your domain
model (Entity classes) there will never be a situation where
objects are "missing" when traversing associations. You can walk
all the associations inside your entity models as deep as you
want.
Take the following example of a single ``Article`` entity fetched
from newly opened EntityManager.
.. code-block:: php
<?php
/** @Entity */
class Article
{
/** @Id @Column(type="integer") @GeneratedValue */
private $id;
/** @Column(type="string") */
private $headline;
/** @ManyToOne(targetEntity="User") */
private $author;
/** @OneToMany(targetEntity="Comment", mappedBy="article") */
private $comments;
public function __construct()
{
$this->comments = new ArrayCollection();
}
public function getAuthor() { return $this->author; }
public function getComments() { return $this->comments; }
}
$article = $em->find('Article', 1);
This code only retrieves the ``Article`` instance with id 1 executing
a single SELECT statement against the articles table in the database.
You can still access the associated properties author and comments
and the associated objects they contain.
This works by utilizing the lazy loading pattern. Instead of
passing you back a real Author instance and a collection of
comments Doctrine will create proxy instances for you. Only if you
access these proxies for the first time they will go through the
EntityManager and load their state from the database.
This lazy-loading process happens behind the scenes, hidden from
your code. See the following code:
.. code-block:: php
<?php
$article = $em->find('Article', 1);
// accessing a method of the user instance triggers the lazy-load
echo "Author: " . $article->getAuthor()->getName() . "\n";
// Lazy Loading Proxies pass instanceof tests:
if ($article->getAuthor() instanceof User) {
// a User Proxy is a generated "UserProxy" class
}
// accessing the comments as an iterator triggers the lazy-load
// retrieving ALL the comments of this article from the database
// using a single SELECT statement
foreach ($article->getComments() as $comment) {
echo $comment->getText() . "\n\n";
}
// Article::$comments passes instanceof tests for the Collection interface
// But it will NOT pass for the ArrayCollection interface
if ($article->getComments() instanceof \Doctrine\Common\Collections\Collection) {
echo "This will always be true!";
}
A slice of the generated proxy classes code looks like the
following piece of code. A real proxy class override ALL public
methods along the lines of the ``getName()`` method shown below:
.. code-block:: php
<?php
class UserProxy extends User implements Proxy
{
private function _load()
{
// lazy loading code
}
public function getName()
{
$this->_load();
return parent::getName();
}
// .. other public methods of User
}
.. warning::
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
object-graph that you need as efficiently as possible.
Persisting entities
-------------------
An entity can be made persistent by passing it to the
``EntityManager#persist($entity)`` method. By applying the persist
operation on some entity, that entity becomes MANAGED, which means
that its persistence is from now on managed by an EntityManager. As
a result the persistent state of such an entity will subsequently
be properly synchronized with the database when
``EntityManager#flush()`` is invoked.
.. note::
Invoking the ``persist`` method on an entity does NOT
cause an immediate SQL INSERT to be issued on the database.
Doctrine applies a strategy called "transactional write-behind",
which means that it will delay most SQL commands until
``EntityManager#flush()`` is invoked which will then issue all
necessary SQL statements to synchronize your objects with the
database in the most efficient way and a single, short transaction,
taking care of maintaining referential integrity.
Example:
.. code-block:: php
<?php
$user = new User;
$user->setName('Mr.Right');
$em->persist($user);
$em->flush();
.. note::
Generated entity identifiers / primary keys are
guaranteed to be available after the next successful flush
operation that involves the entity in question. You can not rely on
a generated identifier to be available directly after invoking
``persist``. The inverse is also true. You can not rely on a
generated identifier being not available after a failed flush
operation.
The semantics of the persist operation, applied on an entity X, are
as follows:
- If X is a new entity, it becomes managed. The entity X will be
entered into the database as a result of the flush operation.
- If X is a preexisting managed entity, it is ignored by the
persist operation. However, the persist operation is cascaded to
entities referenced by X, if the relationships from X to these
other entities are mapped with cascade=PERSIST or cascade=ALL (see
"Transitive Persistence").
- If X is a removed entity, it becomes managed.
- If X is a detached entity, an exception will be thrown on
flush.
Removing entities
-----------------
An entity can be removed from persistent storage by passing it to
the ``EntityManager#remove($entity)`` method. By applying the
``remove`` operation on some entity, that entity becomes REMOVED,
which means that its persistent state will be deleted once
``EntityManager#flush()`` is invoked.
.. note::
Just like ``persist``, invoking ``remove`` on an entity
does NOT cause an immediate SQL DELETE to be issued on the
database. The entity will be deleted on the next invocation of
``EntityManager#flush()`` that involves that entity. This
means that entities scheduled for removal can still be queried
for and appear in query and collection results. See
the section on :ref:`Database and UnitOfWork Out-Of-Sync <workingobjects_database_uow_outofsync>`
for more information.
Example:
.. code-block:: php
<?php
$em->remove($user);
$em->flush();
The semantics of the remove operation, applied to an entity X are
as follows:
- If X is a new entity, it is ignored by the remove operation.
However, the remove operation is cascaded to entities referenced by
X, if the relationship from X to these other entities is mapped
with cascade=REMOVE or cascade=ALL (see "Transitive Persistence").
- If X is a managed entity, the remove operation causes it to
become removed. The remove operation is cascaded to entities
referenced by X, if the relationships from X to these other
entities is mapped with cascade=REMOVE or cascade=ALL (see
"Transitive Persistence").
- If X is a detached entity, an InvalidArgumentException will be
thrown.
- If X is a removed entity, it is ignored by the remove operation.
- A removed entity X will be removed from the database as a result
of the flush operation.
After an entity has been removed its in-memory state is the same as
before the removal, except for generated identifiers.
Removing an entity will also automatically delete any existing
records in many-to-many join tables that link this entity. The
action taken depends on the value of the ``@joinColumn`` mapping
attribute "onDelete". Either Doctrine issues a dedicated ``DELETE``
statement for records of each join table or it depends on the
foreign key semantics of onDelete="CASCADE".
Deleting an object with all its associated objects can be achieved
in multiple ways with very different performance impacts.
1. If an association is marked as ``CASCADE=REMOVE`` Doctrine 2
will fetch this association. If its a Single association it will
pass this entity to
´EntityManager#remove()``. If the association is a collection, Doctrine will loop over all its elements and pass them to``EntityManager#remove()\`.
In both cases the cascade remove semantics are applied recursively.
For large object graphs this removal strategy can be very costly.
2. Using a DQL ``DELETE`` statement allows you to delete multiple
entities of a type with a single command and without hydrating
these entities. This can be very efficient to delete large object
graphs from the database.
3. Using foreign key semantics ``onDelete="CASCADE"`` can force the
database to remove all associated objects internally. This strategy
is a bit tricky to get right but can be very powerful and fast. You
should be aware however that using strategy 1 (``CASCADE=REMOVE``)
completely by-passes any foreign key ``onDelete=CASCADE`` option,
because Doctrine will fetch and remove all associated entities
explicitly nevertheless.
Detaching entities
------------------
An entity is detached from an EntityManager and thus no longer
managed by invoking the ``EntityManager#detach($entity)`` method on
it or by cascading the detach operation to it. Changes made to the
detached entity, if any (including removal of the entity), will not
be synchronized to the database after the entity has been
detached.
Doctrine will not hold on to any references to a detached entity.
Example:
.. code-block:: php
<?php
$em->detach($entity);
The semantics of the detach operation, applied to an entity X are
as follows:
- If X is a managed entity, the detach operation causes it to
become detached. The detach operation is cascaded to entities
referenced by X, if the relationships from X to these other
entities is mapped with cascade=DETACH or cascade=ALL (see
"Transitive Persistence"). Entities which previously referenced X
will continue to reference X.
- If X is a new or detached entity, it is ignored by the detach
operation.
- If X is a removed entity, the detach operation is cascaded to
entities referenced by X, if the relationships from X to these
other entities is mapped with cascade=DETACH or cascade=ALL (see
"Transitive Persistence"). Entities which previously referenced X
will continue to reference X.
There are several situations in which an entity is detached
automatically without invoking the ``detach`` method:
- When ``EntityManager#clear()`` is invoked, all entities that are
currently managed by the EntityManager instance become detached.
- When serializing an entity. The entity retrieved upon subsequent
unserialization will be detached (This is the case for all entities
that are serialized and stored in some cache, i.e. when using the
Query Result Cache).
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.
.. note::
When you want to serialize/unserialize entities you
have to make all entity properties protected, never private. The
reason for this is, if you serialize a class that was a proxy
instance before, the private variables won't be serialized and a
PHP Notice is thrown.
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 "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
---------------------------------
The state of persistent entities is synchronized with the database
on flush of an ``EntityManager`` which commits the underlying
``UnitOfWork``. The synchronization involves writing any updates to
persistent entities and their relationships to the database.
Thereby bidirectional relationships are persisted based on the
references held by the owning side of the relationship as explained
in the Association Mapping chapter.
When ``EntityManager#flush()`` is called, Doctrine inspects all
managed, new and removed entities and will perform the following
operations.
.. _workingobjects_database_uow_outofsync:
Effects of Database and UnitOfWork being Out-Of-Sync
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
As soon as you begin to change the state of entities, call persist or remove the
contents of the UnitOfWork and the database will drive out of sync. They can
only be synchronized by calling ``EntityManager#flush()``. This section
describes the effects of database and UnitOfWork being out of sync.
- Entities that are scheduled for removal can still be queried from the database.
They are returned from DQL and Repository queries and are visible in collections.
- Entities that are passed to ``EntityManager#persist`` do not turn up in query
results.
- Entities that have changed will not be overwritten with the state from the database.
This is because the identity map will detect the construction of an already existing
entity and assumes its the most up to date version.
``EntityManager#flush()`` is never called implicitly by Doctrine. You always have to trigger it manually.
Synchronizing New and Managed Entities
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The flush operation applies to a managed entity with the following
semantics:
- The entity itself is synchronized to the database using a SQL
UPDATE statement, only if at least one persistent field has
changed.
- No SQL updates are executed if the entity did not change.
The flush operation applies to a new entity with the following
semantics:
- The entity itself is synchronized to the database using a SQL
INSERT statement.
For all (initialized) relationships of the new or managed entity
the following semantics apply to each associated entity X:
- If X is new and persist operations are configured to cascade on
the relationship, X will be persisted.
- If X is new and no persist operations are configured to cascade
on the relationship, an exception will be thrown as this indicates
a programming error.
- If X is removed and persist operations are configured to cascade
on the relationship, an exception will be thrown as this indicates
a programming error (X would be re-persisted by the cascade).
- If X is detached and persist operations are configured to
cascade on the relationship, an exception will be thrown (This is
semantically the same as passing X to persist()).
Synchronizing Removed Entities
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The flush operation applies to a removed entity by deleting its
persistent state from the database. No cascade options are relevant
for removed entities on flush, the cascade remove option is already
executed during ``EntityManager#remove($entity)``.
The size of a Unit of Work
~~~~~~~~~~~~~~~~~~~~~~~~~~
The size of a Unit of Work mainly refers to the number of managed
entities at a particular point in time.
The cost of flushing
~~~~~~~~~~~~~~~~~~~~
How costly a flush operation is, mainly depends on two factors:
- The size of the EntityManager's current UnitOfWork.
- The configured change tracking policies
You can get the size of a UnitOfWork as follows:
.. code-block:: php
<?php
$uowSize = $em->getUnitOfWork()->size();
The size represents the number of managed entities in the Unit of
Work. This size affects the performance of flush() operations due
to change tracking (see "Change Tracking Policies") and, of course,
memory consumption, so you may want to check it from time to time
during development.
.. note::
Do not invoke ``flush`` after every change to an entity
or every single invocation of persist/remove/merge/... 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
single HTTP request there should be usually no need for invoking
``flush`` more than 0-2 times.
Direct access to a Unit of Work
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can get direct access to the Unit of Work by calling
``EntityManager#getUnitOfWork()``. This will return the UnitOfWork
instance the EntityManager is currently using.
.. code-block:: php
<?php
$uow = $em->getUnitOfWork();
.. note::
Directly manipulating a UnitOfWork is not recommended.
When working directly with the UnitOfWork API, respect methods
marked as INTERNAL by not using them and carefully read the API
documentation.
Entity State
~~~~~~~~~~~~
As outlined in the architecture overview an entity can be in one of
four possible states: NEW, MANAGED, REMOVED, DETACHED. If you
explicitly need to find out what the current state of an entity is
in the context of a certain ``EntityManager`` you can ask the
underlying ``UnitOfWork``:
.. code-block:: php
<?php
switch ($em->getUnitOfWork()->getEntityState($entity)) {
case UnitOfWork::STATE_MANAGED:
...
case UnitOfWork::STATE_REMOVED:
...
case UnitOfWork::STATE_DETACHED:
...
case UnitOfWork::STATE_NEW:
...
}
An entity is in MANAGED state if it is associated with an
``EntityManager`` and it is not REMOVED.
An entity is in REMOVED state after it has been passed to
``EntityManager#remove()`` until the next flush operation of the
same EntityManager. A REMOVED entity is still associated with an
``EntityManager`` until the next flush operation.
An entity is in DETACHED state if it has persistent state and
identity but is currently not associated with an
``EntityManager``.
An entity is in NEW state if has no persistent state and identity
and is not associated with an ``EntityManager`` (for example those
just created via the "new" operator).
Querying
--------
Doctrine 2 provides the following ways, in increasing level of
power and flexibility, to query for persistent objects. You should
always start with the simplest one that suits your needs.
By Primary Key
~~~~~~~~~~~~~~
The most basic way to query for a persistent object is by its
identifier / primary key using the
``EntityManager#find($entityName, $id)`` method. Here is an
example:
.. code-block:: php
<?php
// $em instanceof EntityManager
$user = $em->find('MyProject\Domain\User', $id);
The return value is either the found entity instance or null if no
instance could be found with the given identifier.
Essentially, ``EntityManager#find()`` is just a shortcut for the
following:
.. code-block:: php
<?php
// $em instanceof EntityManager
$user = $em->getRepository('MyProject\Domain\User')->find($id);
``EntityManager#getRepository($entityName)`` returns a repository
object which provides many ways to retrieve entities of the
specified type. By default, the repository instance is of type
``Doctrine\ORM\EntityRepository``. You can also use custom
repository classes as shown later.
By Simple Conditions
~~~~~~~~~~~~~~~~~~~~
To query for one or more entities based on several conditions that
form a logical conjunction, use the ``findBy`` and ``findOneBy``
methods on a repository as follows:
.. code-block:: php
<?php
// $em instanceof EntityManager
// All users that are 20 years old
$users = $em->getRepository('MyProject\Domain\User')->findBy(array('age' => 20));
// All users that are 20 years old and have a surname of 'Miller'
$users = $em->getRepository('MyProject\Domain\User')->findBy(array('age' => 20, 'surname' => 'Miller'));
// A single user by its nickname
$user = $em->getRepository('MyProject\Domain\User')->findOneBy(array('nickname' => 'romanb'));
You can also load by owning side associations through the repository:
.. code-block:: php
<?php
$number = $em->find('MyProject\Domain\Phonenumber', 1234);
$user = $em->getRepository('MyProject\Domain\User')->findOneBy(array('phone' => $number->getId()));
Be careful that this only works by passing the ID of the associated entity, not yet by passing the associated entity itself.
The ``EntityRepository#findBy()`` method additionally accepts orderings, limit and offset as second to fourth parameters:
.. code-block:: php
<?php
$tenUsers = $em->getRepository('MyProject\Domain\User')->findBy(array('age' => 20), array('name' => 'ASC'), 10, 0);
If you pass an array of values Doctrine will convert the query into a WHERE field IN (..) query automatically:
.. code-block:: php
<?php
$users = $em->getRepository('MyProject\Domain\User')->findBy(array('age' => array(20, 30, 40)));
// translates roughly to: SELECT * FROM users WHERE age IN (20, 30, 40)
An EntityRepository also provides a mechanism for more concise
calls through its use of ``__call``. Thus, the following two
examples are equivalent:
.. code-block:: php
<?php
// A single user by its nickname
$user = $em->getRepository('MyProject\Domain\User')->findOneBy(array('nickname' => 'romanb'));
// A single user by its nickname (__call magic)
$user = $em->getRepository('MyProject\Domain\User')->findOneByNickname('romanb');
By Criteria
~~~~~~~~~~~
.. versionadded:: 2.3
The Repository implement the ``Doctrine\Common\Collections\Selectable``
interface. That means you can build ``Doctrine\Common\Collections\Criteria``
and pass them to the ``matching($criteria)`` method.
See the :ref:`Working with Associations: Filtering collections
<filtering-collections>`.
By Eager Loading
~~~~~~~~~~~~~~~~
Whenever you query for an entity that has persistent associations
and these associations are mapped as EAGER, they will automatically
be loaded together with the entity being queried and is thus
immediately available to your application.
By Lazy Loading
~~~~~~~~~~~~~~~
Whenever you have a managed entity instance at hand, you can
traverse and use any associations of that entity that are
configured LAZY as if they were in-memory already. Doctrine will
automatically load the associated objects on demand through the
concept of lazy-loading.
By DQL
~~~~~~
The most powerful and flexible method to query for persistent
objects is the Doctrine Query Language, an object query language.
DQL enables you to query for persistent objects in the language of
objects. DQL understands classes, fields, inheritance and
associations. DQL is syntactically very similar to the familiar SQL
but *it is not SQL*.
A DQL query is represented by an instance of the
``Doctrine\ORM\Query`` class. You create a query using
``EntityManager#createQuery($dql)``. Here is a simple example:
.. code-block:: php
<?php
// $em instanceof EntityManager
// All users with an age between 20 and 30 (inclusive).
$q = $em->createQuery("select u from MyDomain\Model\User u where u.age >= 20 and u.age <= 30");
$users = $q->getResult();
Note that this query contains no knowledge about the relational
schema, only about the object model. DQL supports positional as
well as named parameters, many functions, (fetch) joins,
aggregates, subqueries and much more. Detailed information about
DQL and its syntax as well as the Doctrine class can be found in
:doc:`the dedicated chapter <dql-doctrine-query-language>`.
For programmatically building up queries based on conditions that
are only known at runtime, Doctrine provides the special
``Doctrine\ORM\QueryBuilder`` class. More information on
constructing queries with a QueryBuilder can be found
:doc:`in Query Builder chapter <query-builder>`.
By Native Queries
~~~~~~~~~~~~~~~~~
As an alternative to DQL or as a fallback for special SQL
statements native queries can be used. Native queries are built by
using a hand-crafted SQL query and a ResultSetMapping that
describes how the SQL result set should be transformed by Doctrine.
More information about native queries can be found in
:doc:`the dedicated chapter <native-sql>`.
Custom Repositories
~~~~~~~~~~~~~~~~~~~
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 Annotation, XML or YAML 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.
.. code-block:: php
<?php
namespace MyDomain\Model;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="MyDomain\Model\UserRepository")
*/
class User
{
}
class UserRepository extends EntityRepository
{
public function getAllAdminUsers()
{
return $this->_em->createQuery('SELECT u FROM MyDomain\Model\User u WHERE u.status = "admin"')
->getResult();
}
}
You can access your repository now by calling:
.. code-block:: php
<?php
// $em instanceof EntityManager
$admins = $em->getRepository('MyDomain\Model\User')->getAllAdminUsers();

View File

@@ -0,0 +1,782 @@
XML Mapping
===========
The XML mapping driver enables you to provide the ORM metadata in
form of XML documents.
The XML driver is backed by an XML Schema document that describes
the structure of a mapping document. The most recent version of the
XML Schema document is available online at
`http://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd <http://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd>`_.
In order to point to the latest version of the document of a
particular stable release branch, just append the release number,
i.e.: doctrine-mapping-2.0.xsd The most convenient way to work with
XML mapping files is to use an IDE/editor that can provide
code-completion based on such an XML Schema document. The following
is an outline of a XML mapping document with the proper xmlns/xsi
setup for the latest code in trunk.
.. code-block:: xml
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
https://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd">
...
</doctrine-mapping>
The XML 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 XML
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 (.). For example an Entity with the fully
qualified class-name "MyProject" would require a mapping file
"MyProject.Entities.User.dcm.xml" unless the extension is changed.
- All mapping documents should get the extension ".dcm.xml" 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('.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
want to. In order to tell the XmlDriver 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
$config = new \Doctrine\ORM\Configuration();
$driver = new \Doctrine\ORM\Mapping\Driver\XmlDriver(array('/path/to/files1', '/path/to/files2'));
$config->setMetadataDriverImpl($driver);
.. warning::
Note that Doctrine ORM does not modify any settings for ``libxml``,
therefore, external XML entities may or may not be enabled or
configured correctly.
XML mappings are not XXE/XEE attack vectors since they are not
related with user input, but it is recommended that you do not
use external XML entities in your mapping files to avoid running
into unexpected behaviour.
Simplified XML Driver
~~~~~~~~~~~~~~~~~~~~~
The Symfony project sponsored a driver that simplifies usage of the XML Driver.
The changes between the original driver are:
1. File Extension is .orm.xml
2. Filenames are shortened, "MyProject\Entities\User" will become User.orm.xml
3. 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\SimplifiedXmlDriver($namespaces);
$driver->setGlobalBasename('global'); // global.orm.xml
Example
-------
As a quick start, here is a small example document that makes use
of several common elements:
.. code-block:: xml
// Doctrine.Tests.ORM.Mapping.User.dcm.xml
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd">
<entity name="Doctrine\Tests\ORM\Mapping\User" table="cms_users">
<indexes>
<index name="name_idx" columns="name"/>
<index columns="user_email"/>
</indexes>
<unique-constraints>
<unique-constraint columns="name,user_email" name="search_idx" />
</unique-constraints>
<lifecycle-callbacks>
<lifecycle-callback type="prePersist" method="doStuffOnPrePersist"/>
<lifecycle-callback type="prePersist" method="doOtherStuffOnPrePersistToo"/>
<lifecycle-callback type="postPersist" method="doStuffOnPostPersist"/>
</lifecycle-callbacks>
<id name="id" type="integer" column="id">
<generator strategy="AUTO"/>
<sequence-generator sequence-name="tablename_seq" allocation-size="100" initial-value="1" />
</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" />
<one-to-one field="address" target-entity="Address" inversed-by="user">
<cascade><cascade-remove /></cascade>
<join-column name="address_id" referenced-column-name="id" on-delete="CASCADE" on-update="CASCADE"/>
</one-to-one>
<one-to-many field="phonenumbers" target-entity="Phonenumber" mapped-by="user">
<cascade>
<cascade-persist/>
</cascade>
<order-by>
<order-by-field name="number" direction="ASC" />
</order-by>
</one-to-many>
<many-to-many field="groups" target-entity="Group">
<cascade>
<cascade-all/>
</cascade>
<join-table name="cms_users_groups">
<join-columns>
<join-column name="user_id" referenced-column-name="id" nullable="false" unique="false" />
</join-columns>
<inverse-join-columns>
<join-column name="group_id" referenced-column-name="id" column-definition="INT NULL" />
</inverse-join-columns>
</join-table>
</many-to-many>
</entity>
</doctrine-mapping>
Be aware that class-names specified in the XML files should be
fully qualified.
XML-Element Reference
---------------------
The XML-Element reference explains all the tags and attributes that
the Doctrine Mapping XSD Schema defines. You should read the
Basic-, Association- and Inheritance Mapping chapters to understand
what each of this definitions means in detail.
Defining an Entity
~~~~~~~~~~~~~~~~~~
Each XML Mapping File contains the definition of one entity,
specified as the ``<entity />`` element as a direct child of the
``<doctrine-mapping />`` element:
.. code-block:: xml
<doctrine-mapping>
<entity name="MyProject\User" table="cms_users" schema="schema_name" repository-class="MyProject\UserRepository">
<!-- definition here -->
</entity>
</doctrine-mapping>
Required attributes:
- name - The fully qualified class-name of the entity.
Optional attributes:
- **table** - The Table-Name to be used for this entity. Otherwise the
Unqualified Class-Name is used by default.
- **repository-class** - The fully qualified class-name of an
alternative ``Doctrine\ORM\EntityRepository`` implementation to be
used with this entity.
- **inheritance-type** - The type of inheritance, defaults to none. A
more detailed description follows in the
*Defining Inheritance Mappings* section.
- **read-only** - (>= 2.1) Specifies that this entity is marked as read only and not
considered for change-tracking. Entities of this type can be persisted
and removed though.
- **schema** - (>= 2.5) The schema the table lies in, for platforms that support schemas
Defining Fields
~~~~~~~~~~~~~~~
Each entity class can contain zero to infinite fields that are
managed by Doctrine. You can define them using the ``<field />``
element as a children to the ``<entity />`` element. The field
element is only used for primitive types that are not the ID of the
entity. For the ID mapping you have to use the ``<id />`` element.
.. code-block:: xml
<entity name="MyProject\User">
<field name="name" type="string" length="50" />
<field name="username" type="string" unique="true" />
<field name="age" type="integer" nullable="true" />
<field name="isActive" column="is_active" type="boolean" />
<field name="weight" type="decimal" scale="5" precision="2" />
<field name="login_count" type="integer" nullable="false">
<options>
<option name="comment">The number of times the user has logged in.</option>
<option name="default">0</option>
</options>
</field>
</entity>
Required attributes:
- name - The name of the Property/Field on the given Entity PHP
class.
Optional attributes:
- type - The ``Doctrine\DBAL\Types\Type`` name, defaults to
"string"
- column - Name of the column in the database, defaults to the
field name.
- length - The length of the given type, for use with strings
only.
- unique - Should this field contain a unique value across the
table? Defaults to false.
- nullable - Should this field allow NULL as a value? Defaults to
false.
- version - Should this field be used for optimistic locking? Only
works on fields with type integer or datetime.
- scale - Scale of a decimal type.
- precision - Precision of a decimal type.
- options - Array of additional options:
- default - The default value to set for the column if no value
is supplied.
- unsigned - Boolean value to determine if the column should
be capable of representing only non-negative integers
(applies only for integer column and might not be supported by
all vendors).
- fixed - Boolean value to determine if the specified length of
a string column should be fixed or varying (applies only for
string/binary column and might not be supported by all vendors).
- comment - The comment of the column in the schema (might not
be supported by all vendors).
- customSchemaOptions - Array of additional schema options
which are mostly vendor specific.
- column-definition - Optional alternative SQL representation for
this column. This definition begin after the field-name and has to
specify the complete column definition. Using this feature will
turn this field dirty for Schema-Tool update commands at all
times.
.. note::
For more detailed information on each attribute, please refer to
the DBAL ``Schema-Representation`` documentation.
Defining Identity and Generator Strategies
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
An entity has to have at least one ``<id />`` element. For
composite keys you can specify more than one id-element, however
surrogate keys are recommended for use with Doctrine 2. The Id
field allows to define properties of the identifier and allows a
subset of the ``<field />`` element attributes:
.. code-block:: xml
<entity name="MyProject\User">
<id name="id" type="integer" column="user_id" />
</entity>
Required attributes:
- name - The name of the Property/Field on the given Entity PHP
class.
- type - The ``Doctrine\DBAL\Types\Type`` name, preferably
"string" or "integer".
Optional attributes:
- column - Name of the column in the database, defaults to the
field name.
Using the simplified definition above Doctrine will use no
identifier strategy for this entity. That means you have to
manually set the identifier before calling
``EntityManager#persist($entity)``. This is the so called
``ASSIGNED`` strategy.
If you want to switch the identifier generation strategy you have
to nest a ``<generator />`` element inside the id-element. This of
course only works for surrogate keys. For composite keys you always
have to use the ``ASSIGNED`` strategy.
.. code-block:: xml
<entity name="MyProject\User">
<id name="id" type="integer" column="user_id">
<generator strategy="AUTO" />
</id>
</entity>
The following values are allowed for the ``<generator />`` strategy
attribute:
- AUTO - Automatic detection of the identifier strategy based on
the preferred solution of the database vendor.
- IDENTITY - Use of a IDENTIFY strategy such as Auto-Increment IDs
available to Doctrine AFTER the INSERT statement has been executed.
- SEQUENCE - Use of a database sequence to retrieve the
entity-ids. This is possible before the INSERT statement is
executed.
If you are using the SEQUENCE strategy you can define an additional
element to describe the sequence:
.. code-block:: xml
<entity name="MyProject\User">
<id name="id" type="integer" column="user_id">
<generator strategy="SEQUENCE" />
<sequence-generator sequence-name="user_seq" allocation-size="5" initial-value="1" />
</id>
</entity>
Required attributes for ``<sequence-generator />``:
- sequence-name - The name of the sequence
Optional attributes for ``<sequence-generator />``:
- allocation-size - By how much steps should the sequence be
incremented when a value is retrieved. Defaults to 1
- initial-value - What should the initial value of the sequence
be.
**NOTE**
If you want to implement a cross-vendor compatible application you
have to specify and additionally define the <sequence-generator />
element, if Doctrine chooses the sequence strategy for a
platform.
Defining a Mapped Superclass
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sometimes you want to define a class that multiple entities inherit
from, which itself is not an entity however. The chapter on
*Inheritance Mapping* describes a Mapped Superclass in detail. You
can define it in XML using the ``<mapped-superclass />`` tag.
.. code-block:: xml
<doctrine-mapping>
<mapped-superclass name="MyProject\BaseClass">
<field name="created" type="datetime" />
<field name="updated" type="datetime" />
</mapped-superclass>
</doctrine-mapping>
Required attributes:
- name - Class name of the mapped superclass.
You can nest any number of ``<field />`` and unidirectional
``<many-to-one />`` or ``<one-to-one />`` associations inside a
mapped superclass.
Defining Inheritance Mappings
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
There are currently two inheritance persistence strategies that you
can choose from when defining entities that inherit from each
other. Single Table inheritance saves the fields of the complete
inheritance hierarchy in a single table, joined table inheritance
creates a table for each entity combining the fields using join
conditions.
You can specify the inheritance type in the ``<entity />`` element
and then use the ``<discriminator-column />`` and
``<discriminator-mapping />`` attributes.
.. code-block:: xml
<entity name="MyProject\Animal" inheritance-type="JOINED">
<discriminator-column name="discr" type="string" />
<discriminator-map>
<discriminator-mapping value="cat" class="MyProject\Cat" />
<discriminator-mapping value="dog" class="MyProject\Dog" />
<discriminator-mapping value="mouse" class="MyProject\Mouse" />
</discriminator-map>
</entity>
The allowed values for inheritance-type attribute are ``JOINED`` or
``SINGLE_TABLE``.
.. note::
All inheritance related definitions have to be defined on the root
entity of the hierarchy.
Defining Lifecycle Callbacks
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can define the lifecycle callback methods on your entities
using the ``<lifecycle-callbacks />`` element:
.. code-block:: xml
<entity name="Doctrine\Tests\ORM\Mapping\User" table="cms_users">
<lifecycle-callbacks>
<lifecycle-callback type="prePersist" method="onPrePersist" />
</lifecycle-callbacks>
</entity>
Defining One-To-One Relations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can define One-To-One Relations/Associations using the
``<one-to-one />`` element. The required and optional attributes
depend on the associations being on the inverse or owning side.
For the inverse side the mapping is as simple as:
.. code-block:: xml
<entity class="MyProject\User">
<one-to-one field="address" target-entity="Address" mapped-by="user" />
</entity>
Required attributes for inverse One-To-One:
- field - Name of the property/field on the entity's PHP class.
- target-entity - Name of the entity associated entity class. If
this is not qualified the namespace of the current class is
prepended. *IMPORTANT:* No leading backslash!
- mapped-by - Name of the field on the owning side (here Address
entity) that contains the owning side association.
For the owning side this mapping would look like:
.. code-block:: xml
<entity class="MyProject\Address">
<one-to-one field="user" target-entity="User" inversed-by="address" />
</entity>
Required attributes for owning One-to-One:
- field - Name of the property/field on the entity's PHP class.
- target-entity - Name of the entity associated entity class. If
this is not qualified the namespace of the current class is
prepended. *IMPORTANT:* No leading backslash!
Optional attributes for owning One-to-One:
- inversed-by - If the association is bidirectional the
inversed-by attribute has to be specified with the name of the
field on the inverse entity that contains the back-reference.
- orphan-removal - If true, the inverse side entity is always
deleted when the owning side entity is. Defaults to false.
- fetch - Either LAZY or EAGER, defaults to LAZY. This attribute
makes only sense on the owning side, the inverse side *ALWAYS* has
to use the ``FETCH`` strategy.
The definition for the owning side relies on a bunch of mapping
defaults for the join column names. Without the nested
``<join-column />`` element Doctrine assumes to foreign key to be
called ``user_id`` on the Address Entities table. This is because
the ``MyProject\Address`` entity is the owning side of this
association, which means it contains the foreign key.
The completed explicitly defined mapping is:
.. code-block:: xml
<entity class="MyProject\Address">
<one-to-one field="user" target-entity="User" inversed-by="address">
<join-column name="user_id" referenced-column-name="id" />
</one-to-one>
</entity>
Defining Many-To-One Associations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The many-to-one association is *ALWAYS* the owning side of any
bidirectional association. This simplifies the mapping compared to
the one-to-one case. The minimal mapping for this association looks
like:
.. code-block:: xml
<entity class="MyProject\Article">
<many-to-one field="author" target-entity="User" />
</entity>
Required attributes:
- field - Name of the property/field on the entity's PHP class.
- target-entity - Name of the entity associated entity class. If
this is not qualified the namespace of the current class is
prepended. *IMPORTANT:* No leading backslash!
Optional attributes:
- inversed-by - If the association is bidirectional the
inversed-by attribute has to be specified with the name of the
field on the inverse entity that contains the back-reference.
- orphan-removal - If true the entity on the inverse side is
always deleted when the owning side entity is and it is not
connected to any other owning side entity anymore. Defaults to
false.
- fetch - Either LAZY or EAGER, defaults to LAZY.
This definition relies on a bunch of mapping defaults with regards
to the naming of the join-column/foreign key. The explicitly
defined mapping includes a ``<join-column />`` tag nested inside
the many-to-one association tag:
.. code-block:: xml
<entity class="MyProject\Article">
<many-to-one field="author" target-entity="User">
<join-column name="author_id" referenced-column-name="id" />
</many-to-one>
</entity>
The join-column attribute ``name`` specifies the column name of the
foreign key and the ``referenced-column-name`` attribute specifies
the name of the primary key column on the User entity.
Defining One-To-Many Associations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The one-to-many association is *ALWAYS* the inverse side of any
association. There exists no such thing as a uni-directional
one-to-many association, which means this association only ever
exists for bi-directional associations.
.. code-block:: xml
<entity class="MyProject\User">
<one-to-many field="phonenumbers" target-entity="Phonenumber" mapped-by="user" />
</entity>
Required attributes:
- field - Name of the property/field on the entity's PHP class.
- target-entity - Name of the entity associated entity class. If
this is not qualified the namespace of the current class is
prepended. *IMPORTANT:* No leading backslash!
- mapped-by - Name of the field on the owning side (here
Phonenumber entity) that contains the owning side association.
Optional attributes:
- fetch - Either LAZY, EXTRA_LAZY or EAGER, defaults to LAZY.
- index-by: Index the collection by a field on the target entity.
Defining Many-To-Many Associations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
From all the associations the many-to-many has the most complex
definition. When you rely on the mapping defaults you can omit many
definitions and rely on their implicit values.
.. code-block:: xml
<entity class="MyProject\User">
<many-to-many field="groups" target-entity="Group" />
</entity>
Required attributes:
- field - Name of the property/field on the entity's PHP class.
- target-entity - Name of the entity associated entity class. If
this is not qualified the namespace of the current class is
prepended. *IMPORTANT:* No leading backslash!
Optional attributes:
- mapped-by - Name of the field on the owning side that contains
the owning side association if the defined many-to-many association
is on the inverse side.
- inversed-by - If the association is bidirectional the
inversed-by attribute has to be specified with the name of the
field on the inverse entity that contains the back-reference.
- fetch - Either LAZY, EXTRA_LAZY or EAGER, defaults to LAZY.
- index-by: Index the collection by a field on the target entity.
The mapping defaults would lead to a join-table with the name
"User\_Group" being created that contains two columns "user\_id"
and "group\_id". The explicit definition of this mapping would be:
.. code-block:: xml
<entity class="MyProject\User">
<many-to-many field="groups" target-entity="Group">
<join-table name="cms_users_groups">
<join-columns>
<join-column name="user_id" referenced-column-name="id"/>
</join-columns>
<inverse-join-columns>
<join-column name="group_id" referenced-column-name="id"/>
</inverse-join-columns>
</join-table>
</many-to-many>
</entity>
Here both the ``<join-columns>`` and ``<inverse-join-columns>``
tags are necessary to tell Doctrine for which side the specified
join-columns apply. These are nested inside a ``<join-table />``
attribute which allows to specify the table name of the
many-to-many join-table.
Cascade Element
~~~~~~~~~~~~~~~
Doctrine allows cascading of several UnitOfWork operations to
related entities. You can specify the cascade operations in the
``<cascade />`` element inside any of the association mapping
tags.
.. code-block:: xml
<entity class="MyProject\User">
<many-to-many field="groups" target-entity="Group">
<cascade>
<cascade-all/>
</cascade>
</many-to-many>
</entity>
Besides ``<cascade-all />`` the following operations can be
specified by their respective tags:
- ``<cascade-persist />``
- ``<cascade-merge />``
- ``<cascade-remove />``
- ``<cascade-refresh />``
Join Column Element
~~~~~~~~~~~~~~~~~~~
In any explicitly defined association mapping you will need the
``<join-column />`` tag. It defines how the foreign key and primary
key names are called that are used for joining two entities.
Required attributes:
- name - The column name of the foreign key.
- referenced-column-name - The column name of the associated
entities primary key
Optional attributes:
- unique - If the join column should contain a UNIQUE constraint.
This makes sense for Many-To-Many join-columns only to simulate a
one-to-many unidirectional using a join-table.
- nullable - should the join column be nullable, defaults to true.
- on-delete - Foreign Key Cascade action to perform when entity is
deleted, defaults to NO ACTION/RESTRICT but can be set to
"CASCADE".
Defining Order of To-Many Associations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can require one-to-many or many-to-many associations to be
retrieved using an additional ``ORDER BY``.
.. code-block:: xml
<entity class="MyProject\User">
<many-to-many field="groups" target-entity="Group">
<order-by>
<order-by-field name="name" direction="ASC" />
</order-by>
</many-to-many>
</entity>
Defining Indexes or Unique Constraints
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To define additional indexes or unique constraints on the entities
table you can use the ``<indexes />`` and
``<unique-constraints />`` elements:
.. code-block:: xml
<entity name="Doctrine\Tests\ORM\Mapping\User" table="cms_users">
<indexes>
<index name="name_idx" columns="name"/>
<index columns="user_email"/>
</indexes>
<unique-constraints>
<unique-constraint columns="name,user_email" name="search_idx" />
</unique-constraints>
</entity>
You have to specify the column and not the entity-class field names
in the index and unique-constraint definitions.
Derived Entities ID syntax
~~~~~~~~~~~~~~~~~~~~~~~~~~
If the primary key of an entity contains a foreign key to another entity we speak of a derived
entity relationship. You can define this in XML with the "association-key" attribute in the ``<id>`` tag.
.. code-block:: xml
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd">
<entity name="Application\Model\ArticleAttribute">
<id name="article" association-key="true" />
<id name="attribute" type="string" />
<field name="value" type="string" />
<many-to-one field="article" target-entity="Article" inversed-by="attributes" />
</entity>
</doctrine-mapping>

View File

@@ -0,0 +1,154 @@
YAML Mapping
============
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 ]

87
docs/en/toc.rst Normal file
View File

@@ -0,0 +1,87 @@
Welcome to Doctrine 2 ORM's documentation!
==========================================
Tutorials
---------
.. toctree::
:maxdepth: 1
tutorials/getting-started
tutorials/getting-started-database
tutorials/getting-started-models
tutorials/working-with-indexed-associations
tutorials/extra-lazy-associations
tutorials/composite-primary-keys
tutorials/ordered-associations
tutorials/override-field-association-mappings-in-subclasses
tutorials/pagination.rst
tutorials/embeddables.rst
Reference Guide
---------------
.. toctree::
:maxdepth: 1
:numbered:
reference/architecture
reference/configuration.rst
reference/faq
reference/basic-mapping
reference/association-mapping
reference/inheritance-mapping
reference/working-with-objects
reference/working-with-associations
reference/events
reference/unitofwork
reference/unitofwork-associations
reference/transactions-and-concurrency
reference/batch-processing
reference/dql-doctrine-query-language
reference/query-builder
reference/native-sql
reference/change-tracking-policies
reference/partial-objects
reference/xml-mapping
reference/yaml-mapping
reference/annotations-reference
reference/php-mapping
reference/caching
reference/improving-performance
reference/tools
reference/metadata-drivers
reference/best-practices
reference/limitations-and-known-issues
tutorials/pagination
reference/filters
reference/namingstrategy
reference/advanced-configuration
reference/second-level-cache
reference/security
Cookbook
--------
.. toctree::
:maxdepth: 1
cookbook/aggregate-fields
cookbook/custom-mapping-types
cookbook/decorator-pattern
cookbook/dql-custom-walkers
cookbook/dql-user-defined-functions
cookbook/implementing-arrayaccess-for-domain-objects
cookbook/implementing-the-notify-changetracking-policy
cookbook/implementing-wakeup-or-clone
cookbook/integrating-with-codeigniter
cookbook/resolve-target-entity-listener
cookbook/sql-table-prefixes
cookbook/strategy-cookbook-introduction
cookbook/validation-of-entities
cookbook/working-with-datetime
cookbook/mysql-enums
cookbook/advanced-field-value-conversion-using-custom-mapping-types
cookbook/entities-in-session

View File

@@ -0,0 +1,375 @@
Composite and Foreign Keys as Primary Key
=========================================
.. versionadded:: 2.1
Doctrine 2 supports composite primary keys natively. Composite keys are a very powerful relational database concept
and we took good care to make sure Doctrine 2 supports as many of the composite primary key use-cases.
For Doctrine 2.0 composite keys of primitive data-types are supported, for Doctrine 2.1 even foreign keys as
primary keys are supported.
This tutorial shows how the semantics of composite primary keys work and how they map to the database.
General Considerations
~~~~~~~~~~~~~~~~~~~~~~
Every entity with a composite key cannot use an id generator other than "ASSIGNED". That means
the ID fields have to have their values set before you call ``EntityManager#persist($entity)``.
Primitive Types only
~~~~~~~~~~~~~~~~~~~~
Even in version 2.0 you can have composite keys as long as they only consist of the primitive types
``integer`` and ``string``. Suppose you want to create a database of cars and use the model-name
and year of production as primary keys:
.. configuration-block::
.. code-block:: php
<?php
namespace VehicleCatalogue\Model;
/**
* @Entity
*/
class Car
{
/** @Id @Column(type="string") */
private $name;
/** @Id @Column(type="integer") */
private $year
public function __construct($name, $year)
{
$this->name = $name;
$this->year = $year;
}
public function getModelName()
{
return $this->name;
}
public function getYearOfProduction()
{
return $this->year;
}
}
.. code-block:: xml
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="VehicleCatalogue\Model\Car">
<id field="name" type="string" />
<id field="year" type="integer" />
</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
<?php
namespace VehicleCatalogue\Model;
// $em is the EntityManager
$car = new Car("Audi A8", 2010);
$em->persist($car);
$em->flush();
And for querying you can use arrays to both DQL and EntityRepositories:
.. code-block:: php
<?php
namespace VehicleCatalogue\Model;
// $em is the EntityManager
$audi = $em->find("VehicleCatalogue\Model\Car", array("name" => "Audi A8", "year" => 2010));
$dql = "SELECT c FROM VehicleCatalogue\Model\Car c WHERE c.id = ?1";
$audi = $em->createQuery($dql)
->setParameter(1, array("name" => "Audi A8", "year" => 2010))
->getSingleResult();
You can also use this entity in associations. Doctrine will then generate two foreign keys one for ``name``
and to ``year`` to the related entities.
.. note::
This example shows how you can nicely solve the requirement for existing
values before ``EntityManager#persist()``: By adding them as mandatory values for the constructor.
Identity through foreign Entities
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. note::
Identity through foreign entities is only supported with Doctrine 2.1
There are tons of use-cases where the identity of an Entity should be determined by the entity
of one or many parent entities.
- Dynamic Attributes of an Entity (for example Article). Each Article has many
attributes with primary key "article_id" and "attribute_name".
- Address object of a Person, the primary key of the address is "user_id". This is not a case of a composite primary
key, but the identity is derived through a foreign entity and a foreign key.
- Join Tables with metadata can be modelled as Entity, for example connections between two articles
with a little description and a score.
The semantics of mapping identity through foreign entities are easy:
- Only allowed on Many-To-One or One-To-One associations.
- Plug an ``@Id`` annotation 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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We keep up the example of an Article with arbitrary attributes, the mapping looks like this:
.. configuration-block::
.. code-block:: php
<?php
namespace Application\Model;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @Entity
*/
class Article
{
/** @Id @Column(type="integer") @GeneratedValue */
private $id;
/** @Column(type="string") */
private $title;
/**
* @OneToMany(targetEntity="ArticleAttribute", mappedBy="article", cascade={"ALL"}, indexBy="attribute")
*/
private $attributes;
public function addAttribute($name, $value)
{
$this->attributes[$name] = new ArticleAttribute($name, $value, $this);
}
}
/**
* @Entity
*/
class ArticleAttribute
{
/** @Id @ManyToOne(targetEntity="Article", inversedBy="attributes") */
private $article;
/** @Id @Column(type="string") */
private $attribute;
/** @Column(type="string") */
private $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"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="Application\Model\ArticleAttribute">
<id name="article" association-key="true" />
<id name="attribute" type="string" />
<field name="value" type="string" />
<many-to-one field="article" target-entity="Article" inversed-by="attributes" />
<entity>
</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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sometimes you have the requirement that two objects are related by a One-To-One association
and that the dependent class should re-use the primary key of the class it depends on.
One good example for this is a user-address relationship:
.. configuration-block::
.. code-block:: php
<?php
/**
* @Entity
*/
class User
{
/** @Id @Column(type="integer") @GeneratedValue */
private $id;
}
/**
* @Entity
*/
class Address
{
/** @Id @OneToOne(targetEntity="User") */
private $user;
}
.. 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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In the classic order product shop example there is the concept of the order item
which contains references to order and product and additional data such as the amount
of products purchased and maybe even the current price.
.. code-block:: php
<?php
use Doctrine\Common\Collections\ArrayCollection;
/** @Entity */
class Order
{
/** @Id @Column(type="integer") @GeneratedValue */
private $id;
/** @ManyToOne(targetEntity="Customer") */
private $customer;
/** @OneToMany(targetEntity="OrderItem", mappedBy="order") */
private $items;
/** @Column(type="boolean") */
private $payed = false;
/** @Column(type="boolean") */
private $shipped = false;
/** @Column(type="datetime") */
private $created;
public function __construct(Customer $customer)
{
$this->customer = $customer;
$this->items = new ArrayCollection();
$this->created = new \DateTime("now");
}
}
/** @Entity */
class Product
{
/** @Id @Column(type="integer") @GeneratedValue */
private $id;
/** @Column(type="string") */
private $name;
/** @Column(type="decimal") */
private $currentPrice;
public function getCurrentPrice()
{
return $this->currentPrice;
}
}
/** @Entity */
class OrderItem
{
/** @Id @ManyToOne(targetEntity="Order") */
private $order;
/** @Id @ManyToOne(targetEntity="Product") */
private $product;
/** @Column(type="integer") */
private $amount = 1;
/** @Column(type="decimal") */
private $offeredPrice;
public function __construct(Order $order, Product $product, $amount = 1)
{
$this->order = $order;
$this->product = $product;
$this->offeredPrice = $product->getCurrentPrice();
}
}
Performance Considerations
~~~~~~~~~~~~~~~~~~~~~~~~~~
Using composite keys always comes with a performance hit compared to using entities with
a simple surrogate key. This performance impact is mostly due to additional PHP code that is
necessary to handle this kind of keys, most notably when using derived identifiers.
On the SQL side there is not much overhead as no additional or unexpected queries have to be
executed to manage entities with derived foreign keys.

View File

@@ -0,0 +1,162 @@
Separating Concerns using Embeddables
-------------------------------------
Embeddables are classes which are not entities themself, but are embedded
in entities and can also be queried in DQL. You'll mostly want to use them
to reduce duplication or separating concerns. Value objects such as date range
or address are the primary use case for this feature. Embeddables can only
contain properties with basic ``@Column`` mapping.
For the purposes of this tutorial, we will assume that you have a ``User``
class in your application and you would like to store an address in
the ``User`` class. We will model the ``Address`` class as an embeddable
instead of simply adding the respective columns to the ``User`` class.
.. configuration-block::
.. code-block:: php
<?php
/** @Entity */
class User
{
/** @Embedded(class = "Address") */
private $address;
}
/** @Embeddable */
class Address
{
/** @Column(type = "string") */
private $street;
/** @Column(type = "string") */
private $postalCode;
/** @Column(type = "string") */
private $city;
/** @Column(type = "string") */
private $country;
}
.. code-block:: xml
<doctrine-mapping>
<entity name="User">
<embedded name="address" class="Address" />
</entity>
<embeddable name="Address">
<field name="street" type="string" />
<field name="postalCode" type="string" />
<field name="city" type="string" />
<field name="country" type="string" />
</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.
Column Prefixing
----------------
By default, Doctrine names your columns by prefixing them, using the value
object name.
Following the example above, your columns would be named as ``address_street``,
``address_postalCode``...
You can change this behaviour to meet your needs by changing the
``columnPrefix`` attribute in the ``@Embedded`` notation.
The following example shows you how to set your prefix to ``myPrefix_``:
.. configuration-block::
.. code-block:: php
<?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):
.. configuration-block::
.. code-block:: php
<?php
/** @Entity */
class User
{
/** @Embedded(class = "Address", columnPrefix = false) */
private $address;
}
.. code-block:: yaml
User:
type: entity
embedded:
address:
class: Address
columnPrefix: false
.. code-block:: xml
<entity name="User">
<embedded name="address" class="Address" use-column-prefix="false" />
</entity>
DQL
---
You can also use mapped fields of embedded classes in DQL queries, just
as if they were declared in the ``User`` class:
.. code-block:: sql
SELECT u FROM User u WHERE u.address.city = :myCity

View File

@@ -0,0 +1,86 @@
Extra Lazy Associations
=======================
.. versionadded:: 2.1
In many cases associations between entities can get pretty large. Even in a simple scenario like a blog.
where posts can be commented, you always have to assume that a post draws hundreds of comments.
In Doctrine 2.0 if you accessed an association it would always get loaded completely into memory. This
can lead to pretty serious performance problems, if your associations contain several hundreds or thousands
of entities.
With Doctrine 2.1 a feature called **Extra Lazy** is introduced for associations. Associations
are marked as **Lazy** by default, which means the whole collection object for an association is populated
the first time its accessed. If you mark an association as extra lazy the following methods on collections
can be called without triggering a full load of the collection:
- ``Collection#contains($entity)``
- ``Collection#containsKey($key)`` (available with Doctrine 2.5)
- ``Collection#count()``
- ``Collection#get($key)`` (available with Doctrine 2.4)
- ``Collection#slice($offset, $length = null)``
For each of the above methods the following semantics apply:
- For each call, if the Collection is not yet loaded, issue a straight SELECT statement against the database.
- For each call, if the collection is already loaded, fallback to the default functionality for lazy collections. No additional SELECT statements are executed.
Additionally even with Doctrine 2.0 the following methods do not trigger the collection load:
- ``Collection#add($entity)``
- ``Collection#offsetSet($key, $entity)`` - ArrayAccess with no specific key ``$coll[] = $entity``, it does
not work when setting specific keys like ``$coll[0] = $entity``.
With extra lazy collections you can now not only add entities to large collections but also paginate them
easily using a combination of ``count`` and ``slice``.
Enabling Extra-Lazy Associations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The mapping configuration is simple. Instead of using the default value of ``fetch="LAZY"`` you have to
switch to extra lazy as shown in these examples:
.. configuration-block::
.. code-block:: php
<?php
namespace Doctrine\Tests\Models\CMS;
/**
* @Entity
*/
class CmsGroup
{
/**
* @ManyToMany(targetEntity="CmsUser", mappedBy="groups", fetch="EXTRA_LAZY")
*/
public $users;
}
.. code-block:: xml
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="Doctrine\Tests\Models\CMS\CmsGroup">
<!-- ... -->
<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

@@ -0,0 +1,27 @@
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 :doc:`Database First <getting-started-database>`, 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 and up to Doctrine 2.2, the code generator hasn't
been flexible enough to achieve this.
We spinned off a subproject, Doctrine CodeGenerator, that will fill this gap and
allow you to do *Database First* development.

View File

@@ -0,0 +1,24 @@
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 :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 :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.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,110 @@
Ordering To-Many Associations
-----------------------------
There are use-cases when you'll want to sort collections when they are
retrieved from the database. In userland you do this as long as you
haven't initially saved an entity with its associations into the
database. To retrieve a sorted collection from the database you can
use the ``@OrderBy`` annotation with an collection that specifies
an DQL snippet that is appended to all queries with this
collection.
Additional to any ``@OneToMany`` or ``@ManyToMany`` annotation you
can specify the ``@OrderBy`` in the following way:
.. configuration-block::
.. code-block:: php
<?php
/** @Entity **/
class User
{
// ...
/**
* @ManyToMany(targetEntity="Group")
* @OrderBy({"name" = "ASC"})
**/
private $groups;
}
.. code-block:: xml
<doctrine-mapping>
<entity name="User">
<many-to-many field="groups" target-entity="Group">
<order-by>
<order-by-field name="name" direction="ASC" />
</order-by>
</many-to-many>
</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 (,).
The referenced field names have to exist on the ``targetEntity``
class of the ``@ManyToMany`` or ``@OneToMany`` annotation.
The semantics of this feature can be described as follows.
- ``@OrderBy`` acts as an implicit ORDER BY clause for the given
fields, that is appended to all the explicitly given ORDER BY
items.
- All collections of the ordered type are always retrieved in an
ordered fashion.
- To keep the database impact low, these implicit ORDER BY items
are only added to an DQL Query if the collection is fetch joined in
the DQL query.
Given our previously defined example, the following would not add
ORDER BY, since g is not fetch joined:
.. code-block:: sql
SELECT u FROM User u JOIN u.groups g WHERE SIZE(g) > 10
However the following:
.. code-block:: sql
SELECT u, g FROM User u JOIN u.groups g WHERE u.id = 10
...would internally be rewritten to:
.. code-block:: sql
SELECT u, g FROM User u JOIN u.groups g WHERE u.id = 10 ORDER BY g.name ASC
You can reverse the order with an explicit DQL ORDER BY:
.. code-block:: sql
SELECT u, g FROM User u JOIN u.groups g WHERE u.id = 10 ORDER BY g.name DESC
...is internally rewritten to:
.. code-block:: sql
SELECT u, g FROM User u JOIN u.groups g WHERE u.id = 10 ORDER BY g.name DESC, g.name ASC

View File

@@ -0,0 +1,90 @@
Override Field Association Mappings In Subclasses
-------------------------------------------------
Sometimes there is a need to persist entities but override all or part of the
mapping metadata. Sometimes also the mapping to override comes from entities
using traits where the traits have mapping metadata.
This tutorial explains how to override mapping metadata,
i.e. attributes and associations metadata in particular. The example here shows
the overriding of a class that uses a trait but is similar when extending a base
class as shown at the end of this tutorial.
Suppose we have a class ExampleEntityWithOverride. This class uses trait ExampleTrait:
.. code-block:: php
<?php
/**
* @Entity
*
* @AttributeOverrides({
* @AttributeOverride(name="foo",
* column=@Column(
* name = "foo_overridden",
* type = "integer",
* length = 140,
* nullable = false,
* unique = false
* )
* )
* })
*
* @AssociationOverrides({
* @AssociationOverride(name="bar",
* joinColumns=@JoinColumn(
* name="example_entity_overridden_bar_id", referencedColumnName="id"
* )
* )
* })
*/
class ExampleEntityWithOverride
{
use ExampleTrait;
}
/**
* @Entity
*/
class Bar
{
/** @Id @Column(type="string") */
private $id;
}
The docblock is showing metadata override of the attribute and association type. It
basically changes the names of the columns mapped for a property ``foo`` and for
the association ``bar`` which relates to Bar class shown above. Here is the trait
which has mapping metadata that is overridden by the annotation above:
.. code-block:: php
/**
* Trait class
*/
trait ExampleTrait
{
/** @Id @Column(type="string") */
private $id;
/**
* @Column(name="trait_foo", type="integer", length=100, nullable=true, unique=true)
*/
protected $foo;
/**
* @OneToOne(targetEntity="Bar", cascade={"persist", "merge"})
* @JoinColumn(name="example_trait_bar_id", referencedColumnName="id")
*/
protected $bar;
}
The case for just extending a class would be just the same but:
.. code-block:: php
class ExampleEntityWithOverride extends BaseEntityWithSomeMapping
{
// ...
}
Overriding is also supported via XML and YAML (:ref:`examples <inheritence_mapping_overrides>`).

View File

@@ -0,0 +1,43 @@
Pagination
==========
.. versionadded:: 2.2
Starting with version 2.2 Doctrine ships with a Paginator for DQL queries. It
has a very simple API and implements the SPL interfaces ``Countable`` and
``IteratorAggregate``.
.. code-block:: php
<?php
use Doctrine\ORM\Tools\Pagination\Paginator;
$dql = "SELECT p, c FROM BlogPost p JOIN p.comments c";
$query = $entityManager->createQuery($dql)
->setFirstResult(0)
->setMaxResults(100);
$paginator = new Paginator($query, $fetchJoinCollection = true);
$c = count($paginator);
foreach ($paginator as $post) {
echo $post->getHeadline() . "\n";
}
Paginating Doctrine queries is not as simple as you might think in the
beginning. If you have complex fetch-join scenarios with one-to-many or
many-to-many associations using the "default" LIMIT functionality of database
vendors is not sufficient to get the correct results.
By default the pagination extension does the following steps to compute the
correct result:
- Perform a Count query using `DISTINCT` keyword.
- Perform a Limit Subquery with `DISTINCT` to find all ids of the entity in from on the current page.
- Perform a WHERE IN query to get all results for the current page.
This behavior is only necessary if you actually fetch join a to-many
collection. You can disable this behavior by setting the
``$fetchJoinCollection`` flag to ``false``; in that case only 2 instead of the 3 queries
described are executed. We hope to automate the detection for this in
the future.

View File

@@ -0,0 +1,298 @@
Working with Indexed Associations
=================================
.. note::
This feature is scheduled for version 2.1 of Doctrine and not included in the 2.0.x series.
Doctrine 2 collections are modelled after PHPs native arrays. PHP arrays are an ordered hashmap, but in
the first version of Doctrine keys retrieved from the database were always numerical unless ``INDEX BY``
was used. Starting with Doctrine 2.1 you can index your collections by a value in the related entity.
This is a first step towards full ordered hashmap support through the Doctrine ORM.
The feature works like an implicit ``INDEX BY`` for the selected association but has several
downsides also:
- You have to manage both the key and field if you want to change the index by field value.
- On each request the keys are regenerated from the field value not from the previous collection key.
- Values of the Index-By keys are never considered during persistence, it only exists for accessing purposes.
- Fields that are used for the index by feature **HAVE** to be unique in the database. The behavior for multiple entities
with the same index-by field value is undefined.
As an example we will design a simple stock exchange list view. The domain consists of the entity ``Stock``
and ``Market`` where each Stock has a symbol and is traded on a single market. Instead of having a numerical
list of stocks traded on a market they will be indexed by their symbol, which is unique across all markets.
Mapping Indexed Associations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can map indexed associations by adding:
* ``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:
.. configuration-block::
.. code-block:: php
<?php
namespace Doctrine\Tests\Models\StockExchange;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @Entity
* @Table(name="exchange_markets")
*/
class Market
{
/**
* @Id @Column(type="integer") @GeneratedValue
* @var int
*/
private $id;
/**
* @Column(type="string")
* @var string
*/
private $name;
/**
* @OneToMany(targetEntity="Stock", mappedBy="market", indexBy="symbol")
* @var Stock[]
*/
private $stocks;
public function __construct($name)
{
$this->name = $name;
$this->stocks = new ArrayCollection();
}
public function getId()
{
return $this->id;
}
public function getName()
{
return $this->name;
}
public function addStock(Stock $stock)
{
$this->stocks[$stock->getSymbol()] = $stock;
}
public function getStock($symbol)
{
if (!isset($this->stocks[$symbol])) {
throw new \InvalidArgumentException("Symbol is not traded on this market.");
}
return $this->stocks[$symbol];
}
public function getStocks()
{
return $this->stocks->toArray();
}
}
.. code-block:: xml
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="Doctrine\Tests\Models\StockExchange\Market">
<id name="id" type="integer">
<generator strategy="AUTO" />
</id>
<field name="name" type="string"/>
<one-to-many target-entity="Stock" mapped-by="market" field="stocks" index-by="symbol" />
</entity>
</doctrine-mapping>
.. code-block:: yaml
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
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.
The ``Stock`` entity doesn't contain any special instructions that are new, but for completeness
here are the code and mappings for it:
.. configuration-block::
.. code-block:: php
<?php
namespace Doctrine\Tests\Models\StockExchange;
/**
* @Entity
* @Table(name="exchange_stocks")
*/
class Stock
{
/**
* @Id @GeneratedValue @Column(type="integer")
* @var int
*/
private $id;
/**
* For real this column would have to be unique=true. But I want to test behavior of non-unique overrides.
*
* @Column(type="string", unique=true)
*/
private $symbol;
/**
* @ManyToOne(targetEntity="Market", inversedBy="stocks")
* @var Market
*/
private $market;
public function __construct($symbol, Market $market)
{
$this->symbol = $symbol;
$this->market = $market;
$market->addStock($this);
}
public function getSymbol()
{
return $this->symbol;
}
}
.. code-block:: xml
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="Doctrine\Tests\Models\StockExchange\Stock">
<id name="id" type="integer">
<generator strategy="AUTO" />
</id>
<field name="symbol" type="string" unique="true" />
<many-to-one target-entity="Market" field="market" inversed-by="stocks" />
</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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Now that we defined the stocks collection to be indexed by symbol we can take a look at some code,
that makes use of the indexing.
First we will populate our database with two example stocks traded on a single market:
.. code-block:: php
<?php
// $em is the EntityManager
$market = new Market("Some Exchange");
$stock1 = new Stock("AAPL", $market);
$stock2 = new Stock("GOOG", $market);
$em->persist($market);
$em->persist($stock1);
$em->persist($stock2);
$em->flush();
This code is not particular interesting since the indexing feature is not yet used. In a new request we could
now query for the market:
.. code-block:: php
<?php
// $em is the EntityManager
$marketId = 1;
$symbol = "AAPL";
$market = $em->find("Doctrine\Tests\Models\StockExchange\Market", $marketId);
// Access the stocks by symbol now:
$stock = $market->getStock($symbol);
echo $stock->getSymbol(); // will print "AAPL"
The implementation ``Market::addStock()`` in combination with ``indexBy`` allows to access the collection
consistently by the Stock symbol. It does not matter if Stock is managed by Doctrine or not.
The same applies to DQL queries: The ``indexBy`` configuration acts as implicit "INDEX BY" to a join association.
.. code-block:: php
<?php
// $em is the EntityManager
$marketId = 1;
$symbol = "AAPL";
$dql = "SELECT m, s FROM Doctrine\Tests\Models\StockExchange\Market m JOIN m.stocks s WHERE m.id = ?1";
$market = $em->createQuery($dql)
->setParameter(1, $marketId)
->getSingleResult();
// Access the stocks by symbol now:
$stock = $market->getStock($symbol);
echo $stock->getSymbol(); // will print "AAPL"
If you want to use ``INDEX BY`` explicitly on an indexed association you are free to do so. Additionally
indexed associations also work with the ``Collection::slice()`` functionality, no matter if marked as
LAZY or EXTRA_LAZY.
Outlook into the Future
~~~~~~~~~~~~~~~~~~~~~~~
For the inverse side of a many-to-many associations there will be a way to persist the keys and the order
as a third and fourth parameter into the join table. This feature is discussed in `DDC-213 <http://www.doctrine-project.org/jira/browse/DDC-213>`_
This feature cannot be implemented for One-To-Many associations, because they are never the owning side.

View File

@@ -5,9 +5,9 @@
xmlns:orm="http://doctrine-project.org/schemas/orm/doctrine-mapping"
elementFormDefault="qualified">
<xs:annotation>
<xs:documentation><![CDATA[
This is the XML Schema for the object/relational
<xs:annotation>
<xs:documentation><![CDATA[
This is the XML Schema for the object/relational
mapping file used by the Doctrine ORM.
]]></xs:documentation>
</xs:annotation>
@@ -17,31 +17,33 @@
<xs:sequence>
<xs:element name="mapped-superclass" type="orm:mapped-superclass" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="entity" type="orm:entity" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="embeddable" type="orm:embeddable" minOccurs="0" maxOccurs="unbounded" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
</xs:element>
<xs:complexType name="emptyType">
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="cascade-type">
<xs:sequence>
<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-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"/>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:simpleType name="lifecycle-callback-type">
<xs:restriction base="xs:token">
<xs:enumeration value="prePersist"/>
@@ -51,9 +53,18 @@
<xs:enumeration value="preRemove"/>
<xs:enumeration value="postRemove"/>
<xs:enumeration value="postLoad"/>
<xs:enumeration value="preFlush"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="cache-usage-type">
<xs:restriction base="xs:token">
<xs:enumeration value="READ_ONLY"/>
<xs:enumeration value="READ_WRITE"/>
<xs:enumeration value="NONSTRICT_READ_WRITE"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="lifecycle-callback">
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
@@ -62,7 +73,7 @@
<xs:attribute name="method" type="xs:NMTOKEN" use="required" />
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="lifecycle-callbacks">
<xs:sequence>
<xs:element name="lifecycle-callback" type="orm:lifecycle-callback" minOccurs="1" maxOccurs="unbounded" />
@@ -84,20 +95,99 @@
</xs:sequence>
</xs:complexType>
<xs:complexType name="named-native-query">
<xs:sequence>
<xs:element name="query" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="result-class" type="xs:string" />
<xs:attribute name="result-set-mapping" type="xs:string" />
</xs:complexType>
<xs:complexType name="named-native-queries">
<xs:sequence>
<xs:element name="named-native-query" type="orm:named-native-query" minOccurs="1" maxOccurs="unbounded" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="entity-listener">
<xs:sequence>
<xs:element name="lifecycle-callback" type="orm:lifecycle-callback" minOccurs="0" maxOccurs="unbounded"/>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="class" type="xs:string"/>
</xs:complexType>
<xs:complexType name="entity-listeners">
<xs:sequence>
<xs:element name="entity-listener" type="orm:entity-listener" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="column-result">
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
<xs:complexType name="field-result">
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="column" type="xs:string" />
</xs:complexType>
<xs:complexType name="entity-result">
<xs:sequence>
<xs:element name="field-result" type="orm:field-result" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="entity-class" type="xs:string" use="required" />
<xs:attribute name="discriminator-column" type="xs:string" use="optional" />
</xs:complexType>
<xs:complexType name="sql-result-set-mapping">
<xs:sequence>
<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:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:choice>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
<xs:complexType name="sql-result-set-mappings">
<xs:sequence>
<xs:element name="sql-result-set-mapping" type="orm:sql-result-set-mapping" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="cache">
<xs:attribute name="usage" type="orm:cache-usage-type" />
<xs:attribute name="region" type="xs:string" />
</xs:complexType>
<xs:complexType name="entity">
<xs:sequence>
<xs:element name="cache" type="orm:cache" minOccurs="0" maxOccurs="1"/>
<xs:element name="options" type="orm:options" minOccurs="0" />
<xs:element name="indexes" type="orm:indexes" minOccurs="0"/>
<xs:element name="unique-constraints" type="orm:unique-constraints" minOccurs="0"/>
<xs:element name="discriminator-column" type="orm:discriminator-column" minOccurs="0"/>
<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"/>
<xs:element name="one-to-one" type="orm:one-to-one" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="one-to-many" type="orm:one-to-many" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="many-to-one" type="orm:many-to-one" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="many-to-many" type="orm:many-to-many" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="association-overrides" type="orm:association-overrides" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="attribute-overrides" type="orm:attribute-overrides" minOccurs="0" maxOccurs="unbounded" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
@@ -109,7 +199,24 @@
<xs:attribute name="read-only" type="xs:boolean" default="false" />
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="option" mixed="true">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="option" type="orm:option"/>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="name" type="xs:NMTOKEN" use="required"/>
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="options">
<xs:sequence>
<xs:element name="option" type="orm:option" minOccurs="0" maxOccurs="unbounded"/>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="mapped-superclass" >
<xs:complexContent>
<xs:extension base="orm:entity">
@@ -121,6 +228,16 @@
</xs:complexContent>
</xs:complexType>
<xs:complexType name="embeddable">
<xs:complexContent>
<xs:extension base="orm:entity">
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:simpleType name="change-tracking-policy">
<xs:restriction base="xs:token">
<xs:enumeration value="DEFERRED_IMPLICIT"/>
@@ -128,7 +245,7 @@
<xs:enumeration value="NOTIFY"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="inheritance-type">
<xs:restriction base="xs:token">
<xs:enumeration value="SINGLE_TABLE"/>
@@ -136,34 +253,38 @@
<xs:enumeration value="TABLE_PER_CLASS"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="generator-strategy">
<xs:restriction base="xs:token">
<xs:enumeration value="TABLE"/>
<xs:enumeration value="SEQUENCE"/>
<xs:enumeration value="IDENTITY"/>
<xs:enumeration value="AUTO"/>
</xs:restriction>
<xs:simpleType name="generator-strategy">
<xs:restriction base="xs:token">
<xs:enumeration value="NONE"/>
<xs:enumeration value="TABLE"/>
<xs:enumeration value="SEQUENCE"/>
<xs:enumeration value="IDENTITY"/>
<xs:enumeration value="AUTO"/>
<xs:enumeration value="UUID"/>
<xs:enumeration value="CUSTOM" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="fk-action">
<xs:restriction base="xs:token">
<xs:enumeration value="CASCADE"/>
<xs:enumeration value="RESTRICT"/>
<xs:simpleType name="fk-action">
<xs:restriction base="xs:token">
<xs:enumeration value="CASCADE"/>
<xs:enumeration value="RESTRICT"/>
<xs:enumeration value="SET NULL"/>
</xs:restriction>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="fetch-type">
<xs:restriction base="xs:token">
<xs:enumeration value="EAGER"/>
<xs:simpleType name="fetch-type">
<xs:restriction base="xs:token">
<xs:enumeration value="EAGER"/>
<xs:enumeration value="LAZY"/>
<xs:enumeration value="EXTRALAZY"/>
</xs:restriction>
<xs:enumeration value="EXTRA_LAZY"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="field">
<xs:sequence>
<xs:element name="options" type="orm:options" minOccurs="0" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="name" type="xs:NMTOKEN" use="required" />
@@ -178,27 +299,36 @@
<xs:attribute name="scale" type="xs:integer" use="optional" />
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="embedded">
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="class" type="xs:string" use="required" />
<xs:attribute name="column-prefix" type="xs:string" use="optional" />
<xs:attribute name="use-column-prefix" type="xs:boolean" default="true" use="optional" />
</xs:complexType>
<xs:complexType name="discriminator-column">
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="name" type="xs:NMTOKEN" use="required" />
<xs:attribute name="type" type="xs:NMTOKEN" use="required" />
<xs:attribute name="type" type="xs:NMTOKEN"/>
<xs:attribute name="field-name" type="xs:NMTOKEN" />
<xs:attribute name="length" type="xs:NMTOKEN" />
<xs:attribute name="column-definition" type="xs:string" />
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="unique-constraint">
<xs:sequence>
<xs:element name="options" type="orm:options" minOccurs="0" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="name" type="xs:NMTOKEN" use="optional"/>
<xs:attribute name="columns" type="xs:string" use="required"/>
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="unique-constraints">
<xs:sequence>
<xs:element name="unique-constraint" type="orm:unique-constraint" minOccurs="1" maxOccurs="unbounded"/>
@@ -206,16 +336,18 @@
</xs:sequence>
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="index">
<xs:sequence>
<xs:element name="options" type="orm:options" minOccurs="0" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="name" type="xs:NMTOKEN" use="optional"/>
<xs:attribute name="columns" type="xs:string" use="required"/>
<xs:attribute name="flags" type="xs:string" use="optional"/>
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="indexes">
<xs:sequence>
<xs:element name="index" type="orm:index" minOccurs="1" maxOccurs="unbounded"/>
@@ -223,7 +355,7 @@
</xs:sequence>
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="discriminator-mapping">
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
@@ -232,7 +364,7 @@
<xs:attribute name="class" type="xs:string" use="required"/>
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="discriminator-map">
<xs:sequence>
<xs:element name="discriminator-mapping" type="orm:discriminator-mapping" minOccurs="1" maxOccurs="unbounded"/>
@@ -253,12 +385,16 @@
<xs:sequence>
<xs:element name="generator" type="orm:generator" minOccurs="0" />
<xs:element name="sequence-generator" type="orm:sequence-generator" minOccurs="0" maxOccurs="1" />
<xs:element name="custom-id-generator" type="orm:custom-id-generator" minOccurs="0" maxOccurs="1" />
<xs:element name="options" type="orm:options" minOccurs="0" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="name" type="xs:NMTOKEN" use="required" />
<xs:attribute name="type" type="xs:NMTOKEN" />
<xs:attribute name="column" type="xs:NMTOKEN" />
<xs:attribute name="length" type="xs:NMTOKEN" />
<xs:attribute name="association-key" type="xs:boolean" default="false" />
<xs:attribute name="column-definition" type="xs:string" />
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
@@ -272,6 +408,13 @@
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="custom-id-generator">
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="class" type="xs:NMTOKEN" use="required" />
</xs:complexType>
<xs:complexType name="inverse-join-columns">
<xs:sequence>
<xs:element name="join-column" type="orm:join-column" minOccurs="1" maxOccurs="unbounded" />
@@ -284,12 +427,11 @@
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="name" type="xs:NMTOKEN" use="required" />
<xs:attribute name="name" type="xs:NMTOKEN" use="optional" />
<xs:attribute name="referenced-column-name" type="xs:NMTOKEN" use="optional" default="id" />
<xs:attribute name="unique" type="xs:boolean" default="false" />
<xs:attribute name="nullable" type="xs:boolean" default="true" />
<xs:attribute name="on-delete" type="orm:fk-action" />
<xs:attribute name="on-update" type="orm:fk-action" />
<xs:attribute name="column-definition" type="xs:string" />
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
@@ -339,6 +481,7 @@
<xs:complexType name="many-to-many">
<xs:sequence>
<xs:element name="cache" type="orm:cache" minOccurs="0" maxOccurs="1"/>
<xs:element name="cascade" type="orm:cascade-type" minOccurs="0" />
<xs:element name="join-table" type="orm:join-table" minOccurs="0" />
<xs:element name="order-by" type="orm:order-by" minOccurs="0" />
@@ -350,11 +493,13 @@
<xs:attribute name="index-by" type="xs:NMTOKEN" />
<xs:attribute name="inversed-by" type="xs:NMTOKEN" />
<xs:attribute name="fetch" type="orm:fetch-type" default="LAZY" />
<xs:attribute name="orphan-removal" type="xs:boolean" default="false" />
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="one-to-many">
<xs:sequence>
<xs:element name="cache" type="orm:cache" minOccurs="0" maxOccurs="1"/>
<xs:element name="cascade" type="orm:cascade-type" minOccurs="0" />
<xs:element name="order-by" type="orm:order-by" minOccurs="0" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
@@ -367,9 +512,10 @@
<xs:attribute name="fetch" type="orm:fetch-type" default="LAZY" />
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="many-to-one">
<xs:sequence>
<xs:element name="cache" type="orm:cache" minOccurs="0" maxOccurs="1"/>
<xs:element name="cascade" type="orm:cascade-type" minOccurs="0" />
<xs:choice minOccurs="0" maxOccurs="1">
<xs:element name="join-column" type="orm:join-column"/>
@@ -385,9 +531,10 @@
<xs:attribute name="inversed-by" type="xs:NMTOKEN" />
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="one-to-one">
<xs:sequence>
<xs:element name="cache" type="orm:cache" minOccurs="0" maxOccurs="1"/>
<xs:element name="cascade" type="orm:cascade-type" minOccurs="0" />
<xs:choice minOccurs="0" maxOccurs="1">
<xs:element name="join-column" type="orm:join-column"/>
@@ -405,4 +552,52 @@
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
<xs:complexType name="association-overrides">
<xs:sequence>
<xs:element name="association-override" type="orm:association-override" minOccurs="1" maxOccurs="unbounded" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="association-override">
<xs:sequence>
<xs:element name="join-table" type="orm:join-table" minOccurs="0" />
<xs:element name="join-columns" type="orm:join-columns" minOccurs="0" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="name" type="xs:NMTOKEN" use="required" />
</xs:complexType>
<xs:complexType name="attribute-overrides">
<xs:sequence>
<xs:element name="attribute-override" type="orm:attribute-override" minOccurs="1" maxOccurs="unbounded" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="attribute-override">
<xs:sequence>
<xs:element name="field" type="orm:attribute-override-field" minOccurs="1" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="name" type="xs:NMTOKEN" use="required" />
</xs:complexType>
<xs:complexType name="attribute-override-field">
<xs:sequence>
<xs:element name="options" type="orm:options" minOccurs="0" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
</xs:sequence>
<xs:attribute name="type" type="xs:NMTOKEN" default="string" />
<xs:attribute name="column" type="xs:NMTOKEN" />
<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="version" type="xs:boolean" />
<xs:attribute name="column-definition" type="xs:string" />
<xs:attribute name="precision" type="xs:integer" use="optional" />
<xs:attribute name="scale" type="xs:integer" use="optional" />
<xs:anyAttribute namespace="##other"/>
</xs:complexType>
</xs:schema>

File diff suppressed because it is too large Load Diff

178
lib/Doctrine/ORM/Cache.php Normal file
View File

@@ -0,0 +1,178 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\ORM;
/**
* Provides an API for querying/managing the second level cache regions.
*
* @since 2.5
* @author Fabio B. Silva <fabio.bat.silva@gmail.com>
*/
interface Cache
{
const DEFAULT_QUERY_REGION_NAME = 'query_cache_region';
const DEFAULT_TIMESTAMP_REGION_NAME = 'timestamp_cache_region';
/**
* May read items from the cache, but will not add items.
*/
const MODE_GET = 1;
/**
* Will never read items from the cache,
* but will add items to the cache as it reads them from the database.
*/
const MODE_PUT = 2;
/**
* May read items from the cache, and add items to the cache.
*/
const MODE_NORMAL = 3;
/**
* The query will never read items from the cache,
* but will refresh items to the cache as it reads them from the database.
*/
const MODE_REFRESH = 4;
/**
* @param string $className The entity class.
*
* @return \Doctrine\ORM\Cache\Region|null
*/
public function getEntityCacheRegion($className);
/**
* @param string $className The entity class.
* @param string $association The field name that represents the association.
*
* @return \Doctrine\ORM\Cache\Region|null
*/
public function getCollectionCacheRegion($className, $association);
/**
* Determine whether the cache contains data for the given entity "instance".
*
* @param string $className The entity class.
* @param mixed $identifier The entity identifier
*
* @return boolean true if the underlying cache contains corresponding data; false otherwise.
*/
public function containsEntity($className, $identifier);
/**
* 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);
/**
* Evicts all entity data from the given region.
*
* @param string $className The entity metadata.
*
* @return void
*/
public function evictEntityRegion($className);
/**
* Evict data from all entity regions.
*
* @return void
*/
public function evictEntityRegions();
/**
* 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 boolean true if the underlying cache contains corresponding data; false otherwise.
*/
public function containsCollection($className, $association, $ownerIdentifier);
/**
* 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);
/**
* 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);
/**
* Evict data from all collection regions.
*
* @return void
*/
public function evictCollectionRegions();
/**
* Determine whether the cache contains data for the given query.
*
* @param string $regionName The cache name given to the query.
*
* @return boolean true if the underlying cache contains corresponding data; false otherwise.
*/
public function containsQuery($regionName);
/**
* 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.
*/
public function evictQueryRegion($regionName = null);
/**
* Evict data from all query regions.
*
* @return void
*/
public function evictQueryRegions();
/**
* 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 \Doctrine\ORM\Cache\QueryCache The Query Cache associated with the region name.
*/
public function getQueryCache($regionName = null);
}

View File

@@ -0,0 +1,66 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\ORM\Cache;
/**
* Association cache entry
*
* @since 2.5
* @author Fabio B. Silva <fabio.bat.silva@gmail.com>
*/
class AssociationCacheEntry implements CacheEntry
{
/**
* READ-ONLY: Public only for performance reasons, it should be considered immutable.
*
* @var array The entity identifier
*/
public $identifier;
/**
* READ-ONLY: Public only for performance reasons, it should be considered immutable.
*
* @var string The entity class name
*/
public $class;
/**
* @param string $class The entity class.
* @param array $identifier The entity identifier.
*/
public function __construct($class, array $identifier)
{
$this->class = $class;
$this->identifier = $identifier;
}
/**
* Creates a new AssociationCacheEntry
*
* This method allow Doctrine\Common\Cache\PhpFileCache compatibility
*
* @param array $values array containing property values
*/
public static function __set_state(array $values)
{
return new self($values['class'], $values['identifier']);
}
}

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