Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
doctrine-dbal
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Tomáš Trávníček
doctrine-dbal
Commits
36763dad
Commit
36763dad
authored
Jan 29, 2009
by
romanb
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
A little progress on the UnitOfWork.
parent
0ac97e7a
Changes
12
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
196 additions
and
151 deletions
+196
-151
Collection.php
lib/Doctrine/Common/Collections/Collection.php
+19
-2
Connection.php
lib/Doctrine/DBAL/Connection.php
+2
-1
ActiveEntity.php
lib/Doctrine/ORM/ActiveEntity.php
+1
-0
Collection.php
lib/Doctrine/ORM/Collection.php
+23
-36
ObjectHydrator.php
lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php
+3
-3
AbstractCollectionPersister.php
lib/Doctrine/ORM/Persisters/AbstractCollectionPersister.php
+24
-14
AbstractEntityPersister.php
lib/Doctrine/ORM/Persisters/AbstractEntityPersister.php
+8
-29
UnitOfWork.php
lib/Doctrine/ORM/UnitOfWork.php
+89
-55
CmsUser.php
tests/Doctrine/Tests/Models/CMS/CmsUser.php
+11
-1
BasicCRUDTest.php
tests/Doctrine/Tests/ORM/Functional/BasicCRUDTest.php
+15
-7
ObjectHydratorTest.php
tests/Doctrine/Tests/ORM/Hydration/ObjectHydratorTest.php
+0
-2
UnitOfWorkTest.php
tests/Doctrine/Tests/ORM/UnitOfWorkTest.php
+1
-1
No files found.
lib/Doctrine/Common/Collections/Collection.php
View file @
36763dad
...
@@ -9,6 +9,7 @@ namespace Doctrine\Common\Collections;
...
@@ -9,6 +9,7 @@ namespace Doctrine\Common\Collections;
use
\Countable
;
use
\Countable
;
use
\IteratorAggregate
;
use
\IteratorAggregate
;
use
\ArrayAccess
;
use
\ArrayAccess
;
use
\ArrayIterator
;
/**
/**
* A Collection is a wrapper around a php array and just like a php array a
* A Collection is a wrapper around a php array and just like a php array a
...
@@ -88,6 +89,22 @@ class Collection implements Countable, IteratorAggregate, ArrayAccess
...
@@ -88,6 +89,22 @@ class Collection implements Countable, IteratorAggregate, ArrayAccess
return
$removed
;
return
$removed
;
}
}
/**
* Removes the specified element from the collection, if it is found.
*
* @param mixed $element
* @return boolean
*/
public
function
removeElement
(
$element
)
{
$key
=
array_search
(
$element
,
$this
->
_data
,
true
);
if
(
$key
!==
false
)
{
unset
(
$this
->
_data
[
$key
]);
return
true
;
}
return
false
;
}
/**
/**
* @see containsKey()
* @see containsKey()
*/
*/
...
@@ -174,7 +191,7 @@ class Collection implements Countable, IteratorAggregate, ArrayAccess
...
@@ -174,7 +191,7 @@ class Collection implements Countable, IteratorAggregate, ArrayAccess
* Tests for the existance of an element that satisfies the given predicate.
* Tests for the existance of an element that satisfies the given predicate.
*
*
* @param function $func
* @param function $func
* @return boolean TRUE if the predicate is TRUE for at least one element, FALS
e
otherwise.
* @return boolean TRUE if the predicate is TRUE for at least one element, FALS
E
otherwise.
*/
*/
public
function
exists
(
Closure
$func
)
{
public
function
exists
(
Closure
$func
)
{
foreach
(
$this
->
_data
as
$key
=>
$element
)
foreach
(
$this
->
_data
as
$key
=>
$element
)
...
@@ -191,7 +208,7 @@ class Collection implements Countable, IteratorAggregate, ArrayAccess
...
@@ -191,7 +208,7 @@ class Collection implements Countable, IteratorAggregate, ArrayAccess
*/
*/
public
function
containsAll
(
$otherColl
)
public
function
containsAll
(
$otherColl
)
{
{
throw
new
Doctrine
_
Exception
(
"Not yet implemented."
);
throw
new
DoctrineException
(
"Not yet implemented."
);
}
}
/**
/**
...
...
lib/Doctrine/DBAL/Connection.php
View file @
36763dad
...
@@ -495,7 +495,7 @@ class Connection
...
@@ -495,7 +495,7 @@ class Connection
*/
*/
public
function
prepare
(
$statement
)
public
function
prepare
(
$statement
)
{
{
echo
$statement
;
echo
$statement
.
PHP_EOL
;
$this
->
connect
();
$this
->
connect
();
try
{
try
{
return
$this
->
_conn
->
prepare
(
$statement
);
return
$this
->
_conn
->
prepare
(
$statement
);
...
@@ -561,6 +561,7 @@ class Connection
...
@@ -561,6 +561,7 @@ class Connection
$this
->
connect
();
$this
->
connect
();
try
{
try
{
if
(
!
empty
(
$params
))
{
if
(
!
empty
(
$params
))
{
//var_dump($params);
$stmt
=
$this
->
prepare
(
$query
);
$stmt
=
$this
->
prepare
(
$query
);
$stmt
->
execute
(
$params
);
$stmt
->
execute
(
$params
);
return
$stmt
->
rowCount
();
return
$stmt
->
rowCount
();
...
...
lib/Doctrine/ORM/ActiveEntity.php
View file @
36763dad
...
@@ -9,6 +9,7 @@
...
@@ -9,6 +9,7 @@
* most method calls to the EntityManager.
* most method calls to the EntityManager.
*
*
* @since 2.0
* @since 2.0
* @todo Any takers for this one? Needs a rewrite.
*/
*/
class
Doctrine_ORM_ActiveEntity
class
Doctrine_ORM_ActiveEntity
{
{
...
...
lib/Doctrine/ORM/Collection.php
View file @
36763dad
...
@@ -21,11 +21,13 @@
...
@@ -21,11 +21,13 @@
namespace
Doctrine\ORM
;
namespace
Doctrine\ORM
;
use
Doctrine\ORM\Mapping\AssociationMapping
;
/**
/**
* A persistent collection wrapper.
* A persistent collection wrapper.
*
*
* A PersistentCollection represents a collection of e
ntities. Collections of
* A PersistentCollection represents a collection of e
lements that have persistent state.
* entities represent only the associations (links) to those entities.
*
Collections of
entities represent only the associations (links) to those entities.
* That means, if the collection is part of a many-many mapping and you remove
* That means, if the collection is part of a many-many mapping and you remove
* entities from the collection, only the links in the xref table are removed (on flush).
* entities from the collection, only the links in the xref table are removed (on flush).
* Similarly, if you remove entities from a collection that is part of a one-many
* Similarly, if you remove entities from a collection that is part of a one-many
...
@@ -104,13 +106,17 @@ final class Collection extends \Doctrine\Common\Collections\Collection
...
@@ -104,13 +106,17 @@ final class Collection extends \Doctrine\Common\Collections\Collection
*/
*/
private
$_hydrationFlag
;
private
$_hydrationFlag
;
/**
* The class descriptor of the owning entity.
*/
private
$_ownerClass
;
private
$_ownerClass
;
/**
/**
* Creates a new persistent collection.
* Creates a new persistent collection.
*/
*/
public
function
__construct
(
EntityManager
$em
,
$entityBaseType
,
$keyField
=
null
)
public
function
__construct
(
EntityManager
$em
,
$entityBaseType
,
array
$data
=
array
(),
$keyField
=
null
)
{
{
parent
::
__construct
(
$data
);
$this
->
_entityBaseType
=
$entityBaseType
;
$this
->
_entityBaseType
=
$entityBaseType
;
$this
->
_em
=
$em
;
$this
->
_em
=
$em
;
$this
->
_ownerClass
=
$em
->
getClassMetadata
(
$entityBaseType
);
$this
->
_ownerClass
=
$em
->
getClassMetadata
(
$entityBaseType
);
...
@@ -151,7 +157,7 @@ final class Collection extends \Doctrine\Common\Collections\Collection
...
@@ -151,7 +157,7 @@ final class Collection extends \Doctrine\Common\Collections\Collection
* @param object $entity
* @param object $entity
* @param AssociationMapping $relation
* @param AssociationMapping $relation
*/
*/
public
function
_setOwner
(
$entity
,
\Doctrine\ORM\Mapping\
AssociationMapping
$relation
)
public
function
_setOwner
(
$entity
,
AssociationMapping
$relation
)
{
{
$this
->
_owner
=
$entity
;
$this
->
_owner
=
$entity
;
$this
->
_association
=
$relation
;
$this
->
_association
=
$relation
;
...
@@ -180,7 +186,7 @@ final class Collection extends \Doctrine\Common\Collections\Collection
...
@@ -180,7 +186,7 @@ final class Collection extends \Doctrine\Common\Collections\Collection
}
}
/**
/**
* Removes an e
ntity
from the collection.
* Removes an e
lement
from the collection.
*
*
* @param mixed $key
* @param mixed $key
* @return boolean
* @return boolean
...
@@ -215,11 +221,11 @@ final class Collection extends \Doctrine\Common\Collections\Collection
...
@@ -215,11 +221,11 @@ final class Collection extends \Doctrine\Common\Collections\Collection
}
}
/**
/**
* Adds an e
ntry
to the collection.
* Adds an e
lement
to the collection.
*
*
* @param mixed $value
* @param mixed $value
* @param string $key
* @param string $key
* @return
boolean
* @return
TRUE
* @override
* @override
*/
*/
public
function
add
(
$value
)
public
function
add
(
$value
)
...
@@ -230,8 +236,8 @@ final class Collection extends \Doctrine\Common\Collections\Collection
...
@@ -230,8 +236,8 @@ final class Collection extends \Doctrine\Common\Collections\Collection
if
(
$this
->
_hydrationFlag
)
{
if
(
$this
->
_hydrationFlag
)
{
if
(
$this
->
_backRefFieldName
)
{
if
(
$this
->
_backRefFieldName
)
{
// set back reference to owner
// set back reference to owner
$this
->
_ownerClass
->
getReflectionProperty
(
$this
->
_ownerClass
->
getReflectionProperty
(
$this
->
_backRefFieldName
)
$this
->
_backRefFieldName
)
->
setValue
(
$value
,
$this
->
_owner
);
->
setValue
(
$value
,
$this
->
_owner
);
}
}
}
else
{
}
else
{
//TODO: Register collection as dirty with the UoW if necessary
//TODO: Register collection as dirty with the UoW if necessary
...
@@ -295,27 +301,6 @@ final class Collection extends \Doctrine\Common\Collections\Collection
...
@@ -295,27 +301,6 @@ final class Collection extends \Doctrine\Common\Collections\Collection
return
$this
->
_snapshot
;
return
$this
->
_snapshot
;
}
}
/**
* INTERNAL:
* Processes the difference of the last snapshot and the current data.
*
* an example:
* Snapshot with the objects 1, 2 and 4
* Current data with objects 2, 3 and 5
*
* The process would remove objects 1 and 4
*
* @return Doctrine_Collection
* @todo Move elsewhere
*/
public
function
processDiff
()
{
foreach
(
array_udiff
(
$this
->
_snapshot
,
$this
->
_data
,
array
(
$this
,
"_compareRecords"
))
as
$record
)
{
$record
->
delete
();
}
return
$this
;
}
/**
/**
* INTERNAL:
* INTERNAL:
* getDeleteDiff
* getDeleteDiff
...
@@ -324,7 +309,7 @@ final class Collection extends \Doctrine\Common\Collections\Collection
...
@@ -324,7 +309,7 @@ final class Collection extends \Doctrine\Common\Collections\Collection
*/
*/
public
function
getDeleteDiff
()
public
function
getDeleteDiff
()
{
{
return
array_udiff
(
$this
->
_snapshot
,
$this
->
_data
,
array
(
$this
,
"_compareRecords"
));
return
array_udiff
(
$this
->
_snapshot
,
$this
->
_data
,
array
(
$this
,
'_compareRecords'
));
}
}
/**
/**
...
@@ -334,7 +319,7 @@ final class Collection extends \Doctrine\Common\Collections\Collection
...
@@ -334,7 +319,7 @@ final class Collection extends \Doctrine\Common\Collections\Collection
*/
*/
public
function
getInsertDiff
()
public
function
getInsertDiff
()
{
{
return
array_udiff
(
$this
->
_data
,
$this
->
_snapshot
,
array
(
$this
,
"_compareRecords"
));
return
array_udiff
(
$this
->
_data
,
$this
->
_snapshot
,
array
(
$this
,
'_compareRecords'
));
}
}
/**
/**
...
@@ -377,8 +362,10 @@ final class Collection extends \Doctrine\Common\Collections\Collection
...
@@ -377,8 +362,10 @@ final class Collection extends \Doctrine\Common\Collections\Collection
private
function
_changed
()
private
function
_changed
()
{
{
/*if ( ! $this->_em->getUnitOfWork()->isCollectionScheduledForUpdate($this)) {
if
(
!
$this
->
_em
->
getUnitOfWork
()
->
isCollectionScheduledForUpdate
(
$this
))
{
$this->_em->getUnitOfWork()->scheduleCollectionUpdate($this);
//var_dump(get_class($this->_snapshot[0]));
}*/
//echo "NOT!";
//$this->_em->getUnitOfWork()->scheduleCollectionUpdate($this);
}
}
}
}
}
lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php
View file @
36763dad
...
@@ -54,7 +54,7 @@ class ObjectHydrator extends AbstractHydrator
...
@@ -54,7 +54,7 @@ class ObjectHydrator extends AbstractHydrator
if
(
$this
->
_parserResult
->
isMixedQuery
())
{
if
(
$this
->
_parserResult
->
isMixedQuery
())
{
$result
=
array
();
$result
=
array
();
}
else
{
}
else
{
$result
=
new
\Doctrine\
ORM\Collection
(
$this
->
_em
,
$this
->
_rootEntityName
)
;
$result
=
new
\Doctrine\
Common\Collections\Collection
;
}
}
$cache
=
array
();
$cache
=
array
();
...
@@ -66,7 +66,7 @@ class ObjectHydrator extends AbstractHydrator
...
@@ -66,7 +66,7 @@ class ObjectHydrator extends AbstractHydrator
foreach
(
$this
->
_collections
as
$coll
)
{
foreach
(
$this
->
_collections
as
$coll
)
{
$coll
->
_takeSnapshot
();
$coll
->
_takeSnapshot
();
$coll
->
_setHydrationFlag
(
false
);
$coll
->
_setHydrationFlag
(
false
);
$this
->
_uow
->
addManagedCollection
(
$coll
);
//
$this->_uow->addManagedCollection($coll);
}
}
// Clean up
// Clean up
...
@@ -105,7 +105,7 @@ class ObjectHydrator extends AbstractHydrator
...
@@ -105,7 +105,7 @@ class ObjectHydrator extends AbstractHydrator
if
(
!
is_object
(
$coll
))
{
if
(
!
is_object
(
$coll
))
{
end
(
$coll
);
end
(
$coll
);
$this
->
_resultPointers
[
$dqlAlias
]
=&
$coll
[
key
(
$coll
)];
$this
->
_resultPointers
[
$dqlAlias
]
=&
$coll
[
key
(
$coll
)];
}
else
if
(
$coll
instanceof
\Doctrine\
ORM
\Collection
)
{
}
else
if
(
$coll
instanceof
\Doctrine\
Common\Collections
\Collection
)
{
if
(
count
(
$coll
)
>
0
)
{
if
(
count
(
$coll
)
>
0
)
{
$this
->
_resultPointers
[
$dqlAlias
]
=
$coll
->
last
();
$this
->
_resultPointers
[
$dqlAlias
]
=
$coll
->
last
();
}
}
...
...
lib/Doctrine/ORM/Persisters/AbstractCollectionPersister.php
View file @
36763dad
<?php
<?php
class
Doctrine_ORM_Persisters_AbstractCollectionPersister
namespace
Doctrine\ORM\Persisters
;
use
Doctrine\ORM\Collection
;
class
AbstractCollectionPersister
{
{
public
function
recreate
(
Doctrine_Collection
$coll
)
public
function
recreate
(
Doctrine_Collection
$coll
)
...
@@ -8,7 +12,6 @@ class Doctrine_ORM_Persisters_AbstractCollectionPersister
...
@@ -8,7 +12,6 @@ class Doctrine_ORM_Persisters_AbstractCollectionPersister
if
(
$coll
->
getRelation
()
->
isInverseSide
())
{
if
(
$coll
->
getRelation
()
->
isInverseSide
())
{
return
;
return
;
}
}
//...
//...
}
}
...
@@ -17,32 +20,39 @@ class Doctrine_ORM_Persisters_AbstractCollectionPersister
...
@@ -17,32 +20,39 @@ class Doctrine_ORM_Persisters_AbstractCollectionPersister
if
(
$coll
->
getRelation
()
->
isInverseSide
())
{
if
(
$coll
->
getRelation
()
->
isInverseSide
())
{
return
;
return
;
}
}
//...
if
(
$coll
->
getRelation
()
instanceof
Doctrine_Association_OneToManyMapping
)
{
//...
}
else
if
(
$coll
->
getRelation
()
instanceof
Doctrine_Association_ManyToManyMapping
)
{
//...
//...
}
}
}
/* collection update actions */
/* collection update actions */
public
function
deleteRows
()
public
function
deleteRows
(
Collection
$coll
)
{
//$collection->getDeleteDiff();
}
public
function
updateRows
(
Collection
$coll
)
{
{
}
}
public
function
updateRows
()
public
function
insertRows
(
Collection
$coll
)
{
//$collection->getInsertDiff();
}
protected
function
_getDeleteRowSql
()
{
{
}
}
p
ublic
function
insertRows
()
p
rotected
function
_getUpdateRowSql
()
{
{
}
}
protected
function
_getDeleteRowSql
()
{
}
}
}
?>
\ No newline at end of file
lib/Doctrine/ORM/Persisters/AbstractEntityPersister.php
View file @
36763dad
...
@@ -33,12 +33,7 @@ namespace Doctrine\ORM\Persisters;
...
@@ -33,12 +33,7 @@ namespace Doctrine\ORM\Persisters;
abstract
class
AbstractEntityPersister
abstract
class
AbstractEntityPersister
{
{
/**
/**
* The names of all the fields that are available on entities.
* Metadata object that describes the mapping of the mapped entity class.
*/
protected
$_fieldNames
=
array
();
/**
* Metadata object that descibes the mapping of the mapped entity class.
*
*
* @var Doctrine\ORM\Mapping\ClassMetadata
* @var Doctrine\ORM\Mapping\ClassMetadata
*/
*/
...
@@ -124,25 +119,13 @@ abstract class AbstractEntityPersister
...
@@ -124,25 +119,13 @@ abstract class AbstractEntityPersister
/**
/**
*
*
* @return
<type>
* @return
Doctrine\ORM\ClassMetadata
*/
*/
public
function
getClassMetadata
()
public
function
getClassMetadata
()
{
{
return
$this
->
_classMetadata
;
return
$this
->
_classMetadata
;
}
}
/**
* @todo Move to ClassMetadata?
*/
public
function
getFieldNames
()
{
if
(
$this
->
_fieldNames
)
{
return
$this
->
_fieldNames
;
}
$this
->
_fieldNames
=
$this
->
_classMetadata
->
getFieldNames
();
return
$this
->
_fieldNames
;
}
/**
/**
* Gets the name of the class in the entity hierarchy that owns the field with
* Gets the name of the class in the entity hierarchy that owns the field with
* the given name. The owning class is the one that defines the field.
* the given name. The owning class is the one that defines the field.
...
@@ -156,15 +139,10 @@ abstract class AbstractEntityPersister
...
@@ -156,15 +139,10 @@ abstract class AbstractEntityPersister
if
(
$this
->
_classMetadata
->
isInheritanceTypeNone
())
{
if
(
$this
->
_classMetadata
->
isInheritanceTypeNone
())
{
return
$this
->
_classMetadata
;
return
$this
->
_classMetadata
;
}
else
{
}
else
{
foreach
(
$this
->
_classMetadata
->
getParentClasses
()
as
$parentClass
)
{
$mapping
=
$this
->
_classMetadata
->
getFieldMapping
(
$fieldName
);
$parentClassMetadata
=
Doctrine_ORM_Mapping_ClassMetadataFactory
::
getInstance
()
return
$mapping
[
'inherited'
];
->
getMetadataFor
(
$parentClass
);
if
(
!
$parentClassMetadata
->
isInheritedField
(
$fieldName
))
{
return
$parentClassMetadata
;
}
}
}
}
throw
new
Doctrine
_
Exception
(
"Unable to find defining class of field '
$fieldName
'."
);
throw
new
DoctrineException
(
"Unable to find defining class of field '
$fieldName
'."
);
}
}
/**
/**
...
@@ -186,8 +164,9 @@ abstract class AbstractEntityPersister
...
@@ -186,8 +164,9 @@ abstract class AbstractEntityPersister
/**
/**
* Prepares all the entity data for insertion into the database.
* Prepares all the entity data for insertion into the database.
*
*
* @param object $entity
* @param array $array
* @param array $array
* @
return void
* @
param boolean $isInsert
*/
*/
protected
function
_prepareData
(
$entity
,
array
&
$result
,
$isInsert
=
false
)
protected
function
_prepareData
(
$entity
,
array
&
$result
,
$isInsert
=
false
)
{
{
...
...
lib/Doctrine/ORM/UnitOfWork.php
View file @
36763dad
...
@@ -23,6 +23,7 @@ namespace Doctrine\ORM;
...
@@ -23,6 +23,7 @@ namespace Doctrine\ORM;
use
Doctrine\ORM\Internal\CommitOrderCalculator
;
use
Doctrine\ORM\Internal\CommitOrderCalculator
;
use
Doctrine\ORM\Internal\CommitOrderNode
;
use
Doctrine\ORM\Internal\CommitOrderNode
;
use
Doctrine\ORM\Collection
;
use
Doctrine\ORM\EntityManager
;
use
Doctrine\ORM\EntityManager
;
use
Doctrine\ORM\Exceptions\UnitOfWorkException
;
use
Doctrine\ORM\Exceptions\UnitOfWorkException
;
...
@@ -110,6 +111,12 @@ class UnitOfWork
...
@@ -110,6 +111,12 @@ class UnitOfWork
*/
*/
protected
$_entityStates
=
array
();
protected
$_entityStates
=
array
();
/**
* Map of entities that are scheduled for dirty checking at commit time.
* This is only used if automatic dirty checking is disabled.
*/
protected
$_scheduledForDirtyCheck
=
array
();
/**
/**
* A list of all new entities that need to be INSERTed.
* A list of all new entities that need to be INSERTed.
*
*
...
@@ -186,15 +193,19 @@ class UnitOfWork
...
@@ -186,15 +193,19 @@ class UnitOfWork
}
}
/**
/**
* Commits the
unit of w
ork, executing all operations that have been postponed
* Commits the
UnitOfW
ork, executing all operations that have been postponed
* up to this point.
* up to this point.
*
* @return void
*/
*/
public
function
commit
()
public
function
commit
()
{
{
// Compute changes in managed entities
// Compute changes in managed entities
$this
->
computeEntityChangeSets
();
$this
->
computeChangeSets
();
/*foreach ($this->_managedCollections as $coll) {
if ($coll->isDirty()) {
}
}*/
if
(
empty
(
$this
->
_newEntities
)
&&
if
(
empty
(
$this
->
_newEntities
)
&&
empty
(
$this
->
_deletedEntities
)
&&
empty
(
$this
->
_deletedEntities
)
&&
...
@@ -214,18 +225,18 @@ class UnitOfWork
...
@@ -214,18 +225,18 @@ class UnitOfWork
$this
->
_executeUpdates
(
$class
);
$this
->
_executeUpdates
(
$class
);
}
}
//TODO: collection deletions
//TODO: collection deletions
(deletions of complete collections)
//TODO: collection updates (deleteRows, updateRows, insertRows)
//TODO: collection updates (deleteRows, updateRows, insertRows
on join tables
)
//TODO: collection recreations
//TODO: collection recreations
(insertions of complete collections)
// Entity deletions come last and need to be in reverse commit order
// Entity deletions come last and need to be in reverse commit order
for
(
$count
=
count
(
$commitOrder
),
$i
=
$count
-
1
;
$i
>=
0
;
$i
--
)
{
for
(
$count
=
count
(
$commitOrder
),
$i
=
$count
-
1
;
$i
>=
0
;
--
$i
)
{
$this
->
_executeDeletions
(
$commitOrder
[
$i
]);
$this
->
_executeDeletions
(
$commitOrder
[
$i
]);
}
}
//TODO: commit transaction here?
//TODO: commit transaction here?
//
c
lear up
//
C
lear up
$this
->
_newEntities
=
array
();
$this
->
_newEntities
=
array
();
$this
->
_dirtyEntities
=
array
();
$this
->
_dirtyEntities
=
array
();
$this
->
_deletedEntities
=
array
();
$this
->
_deletedEntities
=
array
();
...
@@ -253,9 +264,11 @@ class UnitOfWork
...
@@ -253,9 +264,11 @@ class UnitOfWork
*
*
* @param array $entities The entities for which to compute the changesets. If this
* @param array $entities The entities for which to compute the changesets. If this
* parameter is not specified, the changesets of all entities in the identity
* parameter is not specified, the changesets of all entities in the identity
* map are computed.
* map are computed if automatic dirty checking is enabled (the default).
* If automatic dirty checking is disabled, only those changesets will be
* computed that have been scheduled through scheduleForDirtyCheck().
*/
*/
public
function
compute
Entity
ChangeSets
(
array
$entities
=
null
)
public
function
computeChangeSets
(
array
$entities
=
null
)
{
{
$entitySet
=
array
();
$entitySet
=
array
();
if
(
!
is_null
(
$entities
))
{
if
(
!
is_null
(
$entities
))
{
...
@@ -263,21 +276,20 @@ class UnitOfWork
...
@@ -263,21 +276,20 @@ class UnitOfWork
$entitySet
[
get_class
(
$entity
)][]
=
$entity
;
$entitySet
[
get_class
(
$entity
)][]
=
$entity
;
}
}
}
else
if
(
!
$this
->
_em
->
getConfiguration
()
->
getAutomaticDirtyChecking
())
{
}
else
if
(
!
$this
->
_em
->
getConfiguration
()
->
getAutomaticDirtyChecking
())
{
//TODO
$entitySet
=
$this
->
_scheduledForDirtyCheck
;
}
else
{
}
else
{
$entitySet
=
$this
->
_identityMap
;
$entitySet
=
$this
->
_identityMap
;
}
}
foreach
(
$entitySet
as
$className
=>
$entities
)
{
foreach
(
$entitySet
as
$className
=>
$entities
)
{
$class
=
$this
->
_em
->
getClassMetadata
(
$className
);
$class
=
$this
->
_em
->
getClassMetadata
(
$className
);
if
(
!
$class
->
isInheritanceTypeNone
()
&&
count
(
$entities
)
>
0
)
{
$class
=
$this
->
_em
->
getClassMetadata
(
get_class
(
$entities
[
0
]));
}
foreach
(
$entities
as
$entity
)
{
foreach
(
$entities
as
$entity
)
{
$oid
=
spl_object_hash
(
$entity
);
$oid
=
spl_object_hash
(
$entity
);
$state
=
$this
->
getEntityState
(
$entity
);
$state
=
$this
->
getEntityState
(
$entity
);
if
(
$state
==
self
::
STATE_MANAGED
||
$state
==
self
::
STATE_NEW
)
{
if
(
$state
==
self
::
STATE_MANAGED
||
$state
==
self
::
STATE_NEW
)
{
if
(
!
$class
->
isInheritanceTypeNone
())
{
$class
=
$this
->
_em
->
getClassMetadata
(
get_class
(
$entity
));
}
$actualData
=
array
();
$actualData
=
array
();
foreach
(
$class
->
getReflectionProperties
()
as
$name
=>
$refProp
)
{
foreach
(
$class
->
getReflectionProperties
()
as
$name
=>
$refProp
)
{
$actualData
[
$name
]
=
$refProp
->
getValue
(
$entity
);
$actualData
[
$name
]
=
$refProp
->
getValue
(
$entity
);
...
@@ -294,6 +306,7 @@ class UnitOfWork
...
@@ -294,6 +306,7 @@ class UnitOfWork
$originalData
=
$this
->
_originalEntityData
[
$oid
];
$originalData
=
$this
->
_originalEntityData
[
$oid
];
$changeSet
=
array
();
$changeSet
=
array
();
$entityIsDirty
=
false
;
$entityIsDirty
=
false
;
foreach
(
$actualData
as
$propName
=>
$actualValue
)
{
foreach
(
$actualData
as
$propName
=>
$actualValue
)
{
$orgValue
=
isset
(
$originalData
[
$propName
])
?
$originalData
[
$propName
]
:
null
;
$orgValue
=
isset
(
$originalData
[
$propName
])
?
$originalData
[
$propName
]
:
null
;
if
(
is_object
(
$orgValue
)
&&
$orgValue
!==
$actualValue
)
{
if
(
is_object
(
$orgValue
)
&&
$orgValue
!==
$actualValue
)
{
...
@@ -307,8 +320,16 @@ class UnitOfWork
...
@@ -307,8 +320,16 @@ class UnitOfWork
$assoc
=
$class
->
getAssociationMapping
(
$propName
);
$assoc
=
$class
->
getAssociationMapping
(
$propName
);
if
(
$assoc
->
isOneToOne
()
&&
$assoc
->
isOwningSide
())
{
if
(
$assoc
->
isOneToOne
()
&&
$assoc
->
isOwningSide
())
{
$entityIsDirty
=
true
;
$entityIsDirty
=
true
;
}
else
if
(
!
$assoc
->
isOneToOne
())
{
if
(
!
$actualValue
instanceof
Collection
)
{
// Inject PersistentCollection
$coll
=
new
Collection
(
$this
->
_em
,
$assoc
->
getTargetEntityName
(),
$actualValue
);
//$coll->_takeSnapshot();
$class
->
getReflectionProperty
(
$propName
)
->
setValue
(
$entity
,
$coll
);
$actualData
[
$propName
]
=
$coll
;
}
}
$this
->
_handleAssociationValueChanged
(
$assoc
,
$actualValue
);
}
//$this->_handleAssociationValueChanged($assoc, $actualValue);
}
else
{
}
else
{
$entityIsDirty
=
true
;
$entityIsDirty
=
true
;
}
}
...
@@ -322,6 +343,16 @@ class UnitOfWork
...
@@ -322,6 +343,16 @@ class UnitOfWork
$this
->
_originalEntityData
[
$oid
]
=
$actualData
;
$this
->
_originalEntityData
[
$oid
]
=
$actualData
;
}
}
}
}
// Look for changes in associations
if
(
$state
==
self
::
STATE_MANAGED
)
{
foreach
(
$class
->
getAssociationMappings
()
as
$assoc
)
{
$val
=
$actualData
[
$assoc
->
getSourceFieldName
()];
if
(
!
is_null
(
$val
))
{
$this
->
_computeAssociationChanges
(
$assoc
,
$val
);
}
}
}
}
}
}
}
}
}
...
@@ -336,7 +367,7 @@ class UnitOfWork
...
@@ -336,7 +367,7 @@ class UnitOfWork
* @param <type> $assoc
* @param <type> $assoc
* @param <type> $value
* @param <type> $value
*/
*/
private
function
_
handleAssociationValueChanged
(
$assoc
,
$value
)
private
function
_
computeAssociationChanges
(
$assoc
,
$value
)
{
{
if
(
$assoc
->
isOneToOne
())
{
if
(
$assoc
->
isOneToOne
())
{
$value
=
array
(
$value
);
$value
=
array
(
$value
);
...
@@ -376,7 +407,6 @@ class UnitOfWork
...
@@ -376,7 +407,6 @@ class UnitOfWork
// MANAGED associated entities are already taken into account
// MANAGED associated entities are already taken into account
// during changeset calculation anyway, since they are in the identity map.
// during changeset calculation anyway, since they are in the identity map.
}
}
}
}
/**
/**
...
@@ -396,6 +426,7 @@ class UnitOfWork
...
@@ -396,6 +426,7 @@ class UnitOfWork
if
(
get_class
(
$entity
)
==
$className
)
{
if
(
get_class
(
$entity
)
==
$className
)
{
$returnVal
=
$persister
->
insert
(
$entity
);
$returnVal
=
$persister
->
insert
(
$entity
);
if
(
!
is_null
(
$returnVal
))
{
if
(
!
is_null
(
$returnVal
))
{
// Persister returned a post-insert ID
$oid
=
spl_object_hash
(
$entity
);
$oid
=
spl_object_hash
(
$entity
);
$idField
=
$class
->
getSingleIdentifierFieldName
();
$idField
=
$class
->
getSingleIdentifierFieldName
();
$class
->
getReflectionProperty
(
$idField
)
->
setValue
(
$entity
,
$returnVal
);
$class
->
getReflectionProperty
(
$idField
)
->
setValue
(
$entity
,
$returnVal
);
...
@@ -454,11 +485,6 @@ class UnitOfWork
...
@@ -454,11 +485,6 @@ class UnitOfWork
$this
->
_deletedEntities
);
$this
->
_deletedEntities
);
}
}
/* if (count($entityChangeSet) == 1) {
* return array($entityChangeSet[0]->getClass());
* }
*/
// TODO: We can cache computed commit orders in the metadata cache!
// TODO: We can cache computed commit orders in the metadata cache!
// Check cache at this point here!
// Check cache at this point here!
...
@@ -830,7 +856,7 @@ class UnitOfWork
...
@@ -830,7 +856,7 @@ class UnitOfWork
/**
/**
* Saves an entity as part of the current unit of work.
* Saves an entity as part of the current unit of work.
*
*
* @param
Doctrine\ORM\Entity
$entity The entity to save.
* @param
object
$entity The entity to save.
*/
*/
public
function
save
(
$entity
)
public
function
save
(
$entity
)
{
{
...
@@ -839,8 +865,8 @@ class UnitOfWork
...
@@ -839,8 +865,8 @@ class UnitOfWork
$this
->
_doSave
(
$entity
,
$visited
,
$insertNow
);
$this
->
_doSave
(
$entity
,
$visited
,
$insertNow
);
if
(
!
empty
(
$insertNow
))
{
if
(
!
empty
(
$insertNow
))
{
// We have no choice. This means that there are new entities
// We have no choice. This means that there are new entities
// with a
n IDENTITY column key
generation strategy.
// with a
post-insert ID
generation strategy.
$this
->
compute
Entity
ChangeSets
(
$insertNow
);
$this
->
computeChangeSets
(
$insertNow
);
$commitOrder
=
$this
->
_getCommitOrder
(
$insertNow
);
$commitOrder
=
$this
->
_getCommitOrder
(
$insertNow
);
foreach
(
$commitOrder
as
$class
)
{
foreach
(
$commitOrder
as
$class
)
{
$this
->
_executeInserts
(
$class
);
$this
->
_executeInserts
(
$class
);
...
@@ -858,6 +884,8 @@ class UnitOfWork
...
@@ -858,6 +884,8 @@ class UnitOfWork
*
*
* @param object $entity The entity to save.
* @param object $entity The entity to save.
* @param array $visited The already visited entities.
* @param array $visited The already visited entities.
* @param array $insertNow The entities that must be immediately inserted because of
* post-insert ID generation.
*/
*/
private
function
_doSave
(
$entity
,
array
&
$visited
,
array
&
$insertNow
)
private
function
_doSave
(
$entity
,
array
&
$visited
,
array
&
$insertNow
)
{
{
...
@@ -871,7 +899,10 @@ class UnitOfWork
...
@@ -871,7 +899,10 @@ class UnitOfWork
$class
=
$this
->
_em
->
getClassMetadata
(
get_class
(
$entity
));
$class
=
$this
->
_em
->
getClassMetadata
(
get_class
(
$entity
));
switch
(
$this
->
getEntityState
(
$entity
))
{
switch
(
$this
->
getEntityState
(
$entity
))
{
case
self
::
STATE_MANAGED
:
case
self
::
STATE_MANAGED
:
// nothing to do
// nothing to do, except if automatic dirty checking is disabled
if
(
!
$this
->
_em
->
getConfiguration
()
->
getAutomaticDirtyChecking
())
{
$this
->
scheduleForDirtyCheck
(
$entity
);
}
break
;
break
;
case
self
::
STATE_NEW
:
case
self
::
STATE_NEW
:
$idGen
=
$this
->
_em
->
getIdGenerator
(
$class
->
getClassName
());
$idGen
=
$this
->
_em
->
getIdGenerator
(
$class
->
getClassName
());
...
@@ -907,7 +938,6 @@ class UnitOfWork
...
@@ -907,7 +938,6 @@ class UnitOfWork
//TODO: throw UnitOfWorkException::invalidEntityState()
//TODO: throw UnitOfWorkException::invalidEntityState()
throw
new
Doctrine_Exception
(
"Encountered invalid entity state."
);
throw
new
Doctrine_Exception
(
"Encountered invalid entity state."
);
}
}
$this
->
_cascadeSave
(
$entity
,
$visited
,
$insertNow
);
$this
->
_cascadeSave
(
$entity
,
$visited
,
$insertNow
);
}
}
...
@@ -923,9 +953,11 @@ class UnitOfWork
...
@@ -923,9 +953,11 @@ class UnitOfWork
}
}
/**
/**
* Enter description here...
* Deletes an entity as part of the current unit of work.
* This method is internally called during delete() cascades as it tracks
* the already visited entities to prevent infinite recursions.
*
*
* @param
Doctrine\ORM\Entity
$entity
* @param
object
$entity
* @param array $visited
* @param array $visited
*/
*/
private
function
_doDelete
(
$entity
,
array
&
$visited
)
private
function
_doDelete
(
$entity
,
array
&
$visited
)
...
@@ -940,26 +972,23 @@ class UnitOfWork
...
@@ -940,26 +972,23 @@ class UnitOfWork
switch
(
$this
->
getEntityState
(
$entity
))
{
switch
(
$this
->
getEntityState
(
$entity
))
{
case
self
::
STATE_NEW
:
case
self
::
STATE_NEW
:
case
self
::
STATE_DELETED
:
case
self
::
STATE_DELETED
:
// nothing to do
for $entity
// nothing to do
break
;
break
;
case
self
::
STATE_MANAGED
:
case
self
::
STATE_MANAGED
:
$this
->
registerDeleted
(
$entity
);
$this
->
registerDeleted
(
$entity
);
break
;
break
;
case
self
::
STATE_DETACHED
:
case
self
::
STATE_DETACHED
:
//exception?
throw
new
DoctrineException
(
"A detached entity can't be deleted."
);
throw
new
DoctrineException
(
"A detached entity can't be deleted."
);
default
:
default
:
//TODO: throw UnitOfWorkException::invalidEntityState()
throw
new
DoctrineException
(
"Encountered invalid entity state."
);
throw
new
DoctrineException
(
"Encountered invalid entity state."
);
}
}
$this
->
_cascadeDelete
(
$entity
,
$visited
);
$this
->
_cascadeDelete
(
$entity
,
$visited
);
}
}
/**
/**
* Cascades the save operation to associated entities.
* Cascades the save operation to associated entities.
*
*
* @param
Doctrine\ORM\Entity
$entity
* @param
object
$entity
* @param array $visited
* @param array $visited
*/
*/
private
function
_cascadeSave
(
$entity
,
array
&
$visited
,
array
&
$insertNow
)
private
function
_cascadeSave
(
$entity
,
array
&
$visited
,
array
&
$insertNow
)
...
@@ -971,7 +1000,7 @@ class UnitOfWork
...
@@ -971,7 +1000,7 @@ class UnitOfWork
}
}
$relatedEntities
=
$class
->
getReflectionProperty
(
$assocMapping
->
getSourceFieldName
())
$relatedEntities
=
$class
->
getReflectionProperty
(
$assocMapping
->
getSourceFieldName
())
->
getValue
(
$entity
);
->
getValue
(
$entity
);
if
((
$relatedEntities
instanceof
Doctrine_ORM_
Collection
||
is_array
(
$relatedEntities
))
if
((
$relatedEntities
instanceof
\Doctrine\Common\Collections\
Collection
||
is_array
(
$relatedEntities
))
&&
count
(
$relatedEntities
)
>
0
)
{
&&
count
(
$relatedEntities
)
>
0
)
{
foreach
(
$relatedEntities
as
$relatedEntity
)
{
foreach
(
$relatedEntities
as
$relatedEntity
)
{
$this
->
_doSave
(
$relatedEntity
,
$visited
,
$insertNow
);
$this
->
_doSave
(
$relatedEntity
,
$visited
,
$insertNow
);
...
@@ -985,9 +1014,9 @@ class UnitOfWork
...
@@ -985,9 +1014,9 @@ class UnitOfWork
/**
/**
* Cascades the delete operation to associated entities.
* Cascades the delete operation to associated entities.
*
*
* @param
Doctrine\ORM\Entity
$entity
* @param
object
$entity
*/
*/
private
function
_cascadeDelete
(
$entity
)
private
function
_cascadeDelete
(
$entity
,
array
&
$visited
)
{
{
$class
=
$this
->
_em
->
getClassMetadata
(
get_class
(
$entity
));
$class
=
$this
->
_em
->
getClassMetadata
(
get_class
(
$entity
));
foreach
(
$class
->
getAssociationMappings
()
as
$assocMapping
)
{
foreach
(
$class
->
getAssociationMappings
()
as
$assocMapping
)
{
...
@@ -996,13 +1025,13 @@ class UnitOfWork
...
@@ -996,13 +1025,13 @@ class UnitOfWork
}
}
$relatedEntities
=
$class
->
getReflectionProperty
(
$assocMapping
->
getSourceFieldName
())
$relatedEntities
=
$class
->
getReflectionProperty
(
$assocMapping
->
getSourceFieldName
())
->
getValue
(
$entity
);
->
getValue
(
$entity
);
if
(
$relatedEntities
instanceof
\Doctrine\
ORM
\Collection
&&
if
(
$relatedEntities
instanceof
\Doctrine\
Common\Collections
\Collection
&&
count
(
$relatedEntities
)
>
0
)
{
count
(
$relatedEntities
)
>
0
)
{
foreach
(
$relatedEntities
as
$relatedEntity
)
{
foreach
(
$relatedEntities
as
$relatedEntity
)
{
$this
->
_doDelete
(
$relatedEntity
,
$visited
,
$insertNow
);
$this
->
_doDelete
(
$relatedEntity
,
$visited
);
}
}
}
else
if
(
is_object
(
$relatedEntities
))
{
}
else
if
(
is_object
(
$relatedEntities
))
{
$this
->
_doDelete
(
$relatedEntities
,
$visited
,
$insertNow
);
$this
->
_doDelete
(
$relatedEntities
,
$visited
);
}
}
}
}
}
}
...
@@ -1026,34 +1055,34 @@ class UnitOfWork
...
@@ -1026,34 +1055,34 @@ class UnitOfWork
$this
->
_commitOrderCalculator
->
clear
();
$this
->
_commitOrderCalculator
->
clear
();
}
}
public
function
scheduleCollectionUpdate
(
Doctrine\ORM\
Collection
$coll
)
public
function
scheduleCollectionUpdate
(
Collection
$coll
)
{
{
$this
->
_collectionUpdates
[]
=
$coll
;
$this
->
_collectionUpdates
[]
=
$coll
;
}
}
public
function
isCollectionScheduledForUpdate
(
Doctrine\ORM\
Collection
$coll
)
public
function
isCollectionScheduledForUpdate
(
Collection
$coll
)
{
{
//...
//...
}
}
public
function
scheduleCollectionDeletion
(
Doctrine\ORM\
Collection
$coll
)
public
function
scheduleCollectionDeletion
(
Collection
$coll
)
{
{
//TODO: if $coll is already scheduled for recreation ... what to do?
//TODO: if $coll is already scheduled for recreation ... what to do?
// Just remove $coll from the scheduled recreations?
// Just remove $coll from the scheduled recreations?
$this
->
_collectionDeletions
[]
=
$coll
;
$this
->
_collectionDeletions
[]
=
$coll
;
}
}
public
function
isCollectionScheduledForDeletion
(
Doctrine\ORM\
Collection
$coll
)
public
function
isCollectionScheduledForDeletion
(
Collection
$coll
)
{
{
//...
//...
}
}
public
function
scheduleCollectionRecreation
(
Doctrine\ORM\
Collection
$coll
)
public
function
scheduleCollectionRecreation
(
Collection
$coll
)
{
{
$this
->
_collectionRecreations
[]
=
$coll
;
$this
->
_collectionRecreations
[]
=
$coll
;
}
}
public
function
isCollectionScheduledForRecreation
(
Doctrine\ORM\
Collection
$coll
)
public
function
isCollectionScheduledForRecreation
(
Collection
$coll
)
{
{
//...
//...
}
}
...
@@ -1063,7 +1092,7 @@ class UnitOfWork
...
@@ -1063,7 +1092,7 @@ class UnitOfWork
*
*
* @param string $className The name of the entity class.
* @param string $className The name of the entity class.
* @param array $data The data for the entity.
* @param array $data The data for the entity.
* @return
Doctrine\ORM\Entity
* @return
object
* @internal Performance-sensitive method.
* @internal Performance-sensitive method.
*/
*/
public
function
createEntity
(
$className
,
array
$data
,
$query
=
null
)
public
function
createEntity
(
$className
,
array
$data
,
$query
=
null
)
...
@@ -1104,7 +1133,7 @@ class UnitOfWork
...
@@ -1104,7 +1133,7 @@ class UnitOfWork
* Merges the given data into the given entity, optionally overriding
* Merges the given data into the given entity, optionally overriding
* local changes.
* local changes.
*
*
* @param
Doctrine\ORM\Entity
$entity
* @param
object
$entity
* @param array $data
* @param array $data
* @param boolean $overrideLocalChanges
* @param boolean $overrideLocalChanges
*/
*/
...
@@ -1137,14 +1166,11 @@ class UnitOfWork
...
@@ -1137,14 +1166,11 @@ class UnitOfWork
private
function
_inferCorrectClassName
(
array
$data
,
$className
)
private
function
_inferCorrectClassName
(
array
$data
,
$className
)
{
{
$class
=
$this
->
_em
->
getClassMetadata
(
$className
);
$class
=
$this
->
_em
->
getClassMetadata
(
$className
);
$discCol
=
$class
->
getDiscriminatorColumn
();
$discCol
=
$class
->
getDiscriminatorColumn
();
if
(
!
$discCol
)
{
if
(
!
$discCol
)
{
return
$className
;
return
$className
;
}
}
$discMap
=
$class
->
getDiscriminatorMap
();
$discMap
=
$class
->
getDiscriminatorMap
();
if
(
isset
(
$data
[
$discCol
[
'name'
]],
$discMap
[
$data
[
$discCol
[
'name'
]]]))
{
if
(
isset
(
$data
[
$discCol
[
'name'
]],
$discMap
[
$data
[
$discCol
[
'name'
]]]))
{
return
$discMap
[
$data
[
$discCol
[
'name'
]]];
return
$discMap
[
$data
[
$discCol
[
'name'
]]];
}
else
{
}
else
{
...
@@ -1203,10 +1229,10 @@ class UnitOfWork
...
@@ -1203,10 +1229,10 @@ class UnitOfWork
*
*
* @param Doctrine\ORM\Collection $coll
* @param Doctrine\ORM\Collection $coll
*/
*/
public
function
addManagedCollection
(
\Doctrine\ORM\
Collection
$coll
)
/*public function addManagedCollection(
Collection $coll)
{
{
}
}
*/
/**
/**
* Gets the identifier of an entity.
* Gets the identifier of an entity.
...
@@ -1234,9 +1260,17 @@ class UnitOfWork
...
@@ -1234,9 +1260,17 @@ class UnitOfWork
return
false
;
return
false
;
}
}
public
function
scheduleForDirtyCheck
(
$entity
)
{
$rootClassName
=
$this
->
_em
->
getClassMetadata
(
get_class
(
$entity
))
->
getRootClassName
();
$this
->
_scheduledForDirtyCheck
[
$rootClassName
]
=
$entity
;
}
/**
/**
* Calculates the size of the UnitOfWork. The size of the UnitOfWork is the
* Calculates the size of the UnitOfWork. The size of the UnitOfWork is the
* number of entities in the identity map.
* number of entities in the identity map.
*
* @return integer
*/
*/
public
function
size
()
public
function
size
()
{
{
...
...
tests/Doctrine/Tests/Models/CMS/CmsUser.php
View file @
36763dad
...
@@ -27,7 +27,7 @@ class CmsUser
...
@@ -27,7 +27,7 @@ class CmsUser
public
$name
;
public
$name
;
/**
/**
* @DoctrineOneToMany(targetEntity="Doctrine\Tests\Models\CMS\CmsPhonenumber",
* @DoctrineOneToMany(targetEntity="Doctrine\Tests\Models\CMS\CmsPhonenumber",
mappedBy="user", cascade={"save"})
mappedBy="user", cascade={"save"
, "delete"
})
*/
*/
public
$phonenumbers
;
public
$phonenumbers
;
/**
/**
...
@@ -44,4 +44,14 @@ class CmsUser
...
@@ -44,4 +44,14 @@ class CmsUser
$this
->
phonenumbers
[]
=
$phone
;
$this
->
phonenumbers
[]
=
$phone
;
$phone
->
user
=
$this
;
$phone
->
user
=
$this
;
}
}
public
function
removePhonenumber
(
$index
)
{
if
(
isset
(
$this
->
phonenumbers
[
$index
]))
{
$ph
=
$this
->
phonenumbers
[
$index
];
unset
(
$this
->
phonenumbers
[
$index
]);
$ph
->
user
=
null
;
return
true
;
}
return
false
;
}
}
}
tests/Doctrine/Tests/ORM/Functional/BasicCRUDTest.php
View file @
36763dad
...
@@ -42,24 +42,32 @@ class BasicCRUDTest extends \Doctrine\Tests\OrmFunctionalTestCase {
...
@@ -42,24 +42,32 @@ class BasicCRUDTest extends \Doctrine\Tests\OrmFunctionalTestCase {
$em
->
flush
();
$em
->
flush
();
$this
->
assertTrue
(
$em
->
contains
(
$ph
));
$this
->
assertTrue
(
$em
->
contains
(
$ph
));
$this
->
assertTrue
(
$em
->
contains
(
$user
));
$this
->
assertTrue
(
$em
->
contains
(
$user
));
$this
->
assertTrue
(
$user
->
phonenumbers
instanceof
\Doctrine\ORM\Collection
);
// Update
// Update
name
$user
->
name
=
'guilherme'
;
$user
->
name
=
'guilherme'
;
$em
->
flush
();
$em
->
flush
();
$this
->
assertEquals
(
'guilherme'
,
$user
->
name
);
$this
->
assertEquals
(
'guilherme'
,
$user
->
name
);
// Add another phonenumber
$ph2
=
new
CmsPhonenumber
;
$ph2
->
phonenumber
=
"6789"
;
$user
->
addPhonenumber
(
$ph2
);
$em
->
flush
();
$this
->
assertTrue
(
$em
->
contains
(
$ph2
));
// Delete
// Delete
$em
->
delete
(
$user
);
$em
->
delete
(
$user
);
$this
->
assertTrue
(
$em
->
getUnitOfWork
()
->
isRegisteredRemoved
(
$user
));
$this
->
assertTrue
(
$em
->
getUnitOfWork
()
->
isRegisteredRemoved
(
$user
));
$this
->
assertTrue
(
$em
->
getUnitOfWork
()
->
isRegisteredRemoved
(
$ph
));
$this
->
assertTrue
(
$em
->
getUnitOfWork
()
->
isRegisteredRemoved
(
$ph2
));
$em
->
flush
();
$em
->
flush
();
$this
->
assertFalse
(
$em
->
getUnitOfWork
()
->
isRegisteredRemoved
(
$user
));
$this
->
assertFalse
(
$em
->
getUnitOfWork
()
->
isRegisteredRemoved
(
$user
));
$this
->
assertFalse
(
$em
->
getUnitOfWork
()
->
isRegisteredRemoved
(
$ph
));
$this
->
assertFalse
(
$em
->
getUnitOfWork
()
->
isRegisteredRemoved
(
$ph2
));
}
}
public
function
testMore
()
{
/*public function testMore() {
#echo PHP_EOL . "SECOND" . PHP_EOL;
/*$user = new CmsUser;
$user->name = 'jon';
$user->*/
$ph = new CmsPhonenumber;
$ph = new CmsPhonenumber;
$ph->phonenumber = 123456;
$ph->phonenumber = 123456;
...
@@ -67,6 +75,6 @@ class BasicCRUDTest extends \Doctrine\Tests\OrmFunctionalTestCase {
...
@@ -67,6 +75,6 @@ class BasicCRUDTest extends \Doctrine\Tests\OrmFunctionalTestCase {
$this->_em->save($ph);
$this->_em->save($ph);
$this->_em->flush();
$this->_em->flush();
}
}
*/
}
}
tests/Doctrine/Tests/ORM/Hydration/ObjectHydratorTest.php
View file @
36763dad
...
@@ -53,7 +53,6 @@ class ObjectHydratorTest extends HydrationTest
...
@@ -53,7 +53,6 @@ class ObjectHydratorTest extends HydrationTest
$queryComponents
,
$tableAliasMap
));
$queryComponents
,
$tableAliasMap
));
$this
->
assertEquals
(
2
,
count
(
$result
));
$this
->
assertEquals
(
2
,
count
(
$result
));
$this
->
assertTrue
(
$result
instanceof
\Doctrine\ORM\Collection
);
$this
->
assertTrue
(
$result
[
0
]
instanceof
\Doctrine\Tests\Models\CMS\CmsUser
);
$this
->
assertTrue
(
$result
[
0
]
instanceof
\Doctrine\Tests\Models\CMS\CmsUser
);
$this
->
assertTrue
(
$result
[
1
]
instanceof
\Doctrine\Tests\Models\CMS\CmsUser
);
$this
->
assertTrue
(
$result
[
1
]
instanceof
\Doctrine\Tests\Models\CMS\CmsUser
);
$this
->
assertEquals
(
1
,
$result
[
0
]
->
id
);
$this
->
assertEquals
(
1
,
$result
[
0
]
->
id
);
...
@@ -659,7 +658,6 @@ class ObjectHydratorTest extends HydrationTest
...
@@ -659,7 +658,6 @@ class ObjectHydratorTest extends HydrationTest
$queryComponents
,
$tableAliasMap
));
$queryComponents
,
$tableAliasMap
));
$this
->
assertEquals
(
2
,
count
(
$result
));
$this
->
assertEquals
(
2
,
count
(
$result
));
$this
->
assertTrue
(
$result
instanceof
\Doctrine\ORM\Collection
);
$this
->
assertTrue
(
$result
[
0
]
instanceof
\Doctrine\Tests\Models\Forum\ForumCategory
);
$this
->
assertTrue
(
$result
[
0
]
instanceof
\Doctrine\Tests\Models\Forum\ForumCategory
);
$this
->
assertTrue
(
$result
[
1
]
instanceof
\Doctrine\Tests\Models\Forum\ForumCategory
);
$this
->
assertTrue
(
$result
[
1
]
instanceof
\Doctrine\Tests\Models\Forum\ForumCategory
);
$this
->
assertEquals
(
1
,
$result
[
0
]
->
getId
());
$this
->
assertEquals
(
1
,
$result
[
0
]
->
getId
());
...
...
tests/Doctrine/Tests/ORM/UnitOfWorkTest.php
View file @
36763dad
...
@@ -159,7 +159,7 @@ class UnitOfWorkTest extends \Doctrine\Tests\OrmTestCase
...
@@ -159,7 +159,7 @@ class UnitOfWorkTest extends \Doctrine\Tests\OrmTestCase
));
));
// Go
// Go
$this
->
_unitOfWork
->
compute
Entity
ChangeSets
(
array
(
$user1
,
$user2
));
$this
->
_unitOfWork
->
computeChangeSets
(
array
(
$user1
,
$user2
));
// Verify
// Verify
$user1ChangeSet
=
$this
->
_unitOfWork
->
getEntityChangeSet
(
$user1
);
$user1ChangeSet
=
$this
->
_unitOfWork
->
getEntityChangeSet
(
$user1
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment