PersistentCollection
extends AbstractLazyCollection
in package
implements
Selectable
A PersistentCollection represents a collection of elements that have persistent state.
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 entities from the collection, only the links in the relation table are removed (on flush). Similarly, if you remove entities from a collection that is part of a one-many mapping this will only result in the nulling out of the foreign keys on flush.
Tags
Interfaces, Classes, Traits and Enums
- Selectable
- Interface for collections that allow efficient filtering with an expression API.
Table of Contents
- $collection : Collection<string|int, mixed>
- The backed collection to use
- $initialized : bool
- $association : mixed
- The association mapping the collection belongs to.
- $backRefFieldName : string
- The name of the field on the target entities that points to the owner of the collection. This is only set if the association is bi-directional.
- $em : EntityManagerInterface
- The EntityManager that manages the persistence of the collection.
- $isDirty : bool
- Whether the collection is dirty and needs to be synchronized with the database when the UnitOfWork that manages its persistent state commits.
- $owner : object|null
- The entity that owns this collection.
- $snapshot : mixed
- A snapshot of the collection at the moment it was fetched from the database.
- $typeClass : ClassMetadata
- The class descriptor of the collection's entity type.
- __clone() : mixed
- Cleans up internal state of cloned persistent collection.
- __construct() : mixed
- Creates a new persistent collection.
- __sleep() : array<string|int, string>
- Called by PHP when this collection is serialized. Ensures that only the elements are properly serialized.
- add() : true
- Adds an element at the end of the collection.
- clear() : void
- Clears the collection, removing all elements.
- contains() : bool
- Checks whether an element is contained in the collection.
- containsKey() : bool
- Checks whether the collection contains an element with the specified key/index.
- count() : int
- {@inheritDoc}
- current() : mixed
- Gets the element of the collection at the current iterator position.
- exists() : bool
- Tests for the existence of an element that satisfies the given predicate.
- filter() : Collection<string|int, mixed>
- Returns all the elements of this collection that satisfy the predicate p.
- first() : mixed
- Sets the internal iterator to the first element in the collection and returns this element.
- forAll() : bool
- Tests whether the given predicate p holds for all elements of this collection.
- get() : mixed
- Gets the element at the specified key/index.
- getDeleteDiff() : array<string|int, mixed>
- INTERNAL: getDeleteDiff
- getInsertDiff() : array<string|int, mixed>
- INTERNAL: getInsertDiff
- getIterator() : Traversable<int|string, mixed>
- {@inheritDoc}
- getKeys() : array<string|int, int>|array<string|int, string>
- Gets all keys/indices of the collection.
- getMapping() : array<string|int, mixed>|null
- INTERNAL: Gets the association mapping of the collection.
- getOwner() : object|null
- INTERNAL: Gets the collection owner.
- getSnapshot() : array<string|int, mixed>
- INTERNAL: Returns the last snapshot of the elements in the collection.
- getTypeClass() : ClassMetadata
- getValues() : array<string|int, mixed>
- Gets all values of the collection.
- hydrateAdd() : void
- INTERNAL: Adds an element to a collection during hydration. This will automatically complete bidirectional associations in the case of a one-to-many association.
- hydrateSet() : void
- INTERNAL: Sets a keyed element in the collection during hydration.
- indexOf() : int|string|bool
- Gets the index/key of a given element. The comparison of two elements is strict, that means not only the value but also the type must match.
- initialize() : void
- Initializes the collection by loading its contents from the database if the collection is not yet initialized.
- isDirty() : bool
- Gets a boolean flag indicating whether this collection is dirty which means its state needs to be synchronized with the database.
- isEmpty() : bool
- Checks whether the collection is empty (contains no elements).
- isInitialized() : bool
- Is the lazy collection already initialized?
- key() : int|string|null
- Gets the key/index of the element at the current iterator position.
- last() : mixed
- Sets the internal iterator to the last element in the collection and returns this element.
- map() : Collection<string|int, mixed>
- Applies the given function to each element in the collection and returns a new collection with the elements returned by the function.
- matching() : Collection<string|int, mixed>
- Selects all elements from a selectable that match the expression and return a new collection containing these elements.
- next() : mixed
- Moves the internal iterator position to the next element and returns this element.
- offsetExists() : bool
- {@inheritDoc}
- offsetGet() : mixed
- {@inheritDoc}
- offsetSet() : void
- {@inheritDoc}
- offsetUnset() : object|null
- {@inheritDoc}
- partition() : Collection<string|int, mixed>
- Partitions this collection in two collections according to a predicate.
- remove() : object
- Removes the element at the specified index from the collection.
- removeElement() : bool
- Removes the specified element from the collection, if it is found.
- set() : void
- Sets an element in the collection at the specified key/index.
- setDirty() : void
- Sets a boolean flag, indicating whether this collection is dirty.
- setInitialized() : void
- Sets the initialized flag of the collection, forcing it into that state.
- setOwner() : void
- INTERNAL: Sets the collection's owning entity together with the AssociationMapping that describes the association between the owner and the elements of the collection.
- slice() : array<string|int, mixed>
- Extracts a slice of $length elements starting at position $offset from the Collection.
- takeSnapshot() : void
- INTERNAL: Tells this collection to take a snapshot of its current state.
- toArray() : array<string|int, mixed>
- Gets a native PHP array representation of the collection.
- unwrap() : Collection<TKey, T>
- Retrieves the wrapped Collection instance.
- doInitialize() : void
- Do the initialization logic
- changed() : void
- Marks this collection as changed/dirty.
- restoreNewObjectsInDirtyCollection() : void
Properties
$collection
The backed collection to use
protected
Collection<string|int, mixed>
$collection
Tags
$initialized
protected
bool
$initialized
= false
$association
The association mapping the collection belongs to.
private
mixed
$association
This is currently either a OneToManyMapping or a ManyToManyMapping.
Tags
$backRefFieldName
The name of the field on the target entities that points to the owner of the collection. This is only set if the association is bi-directional.
private
string
$backRefFieldName
$em
The EntityManager that manages the persistence of the collection.
private
EntityManagerInterface
$em
$isDirty
Whether the collection is dirty and needs to be synchronized with the database when the UnitOfWork that manages its persistent state commits.
private
bool
$isDirty
= false
$owner
The entity that owns this collection.
private
object|null
$owner
$snapshot
A snapshot of the collection at the moment it was fetched from the database.
private
mixed
$snapshot
= []
This is used to create a diff of the collection at commit time.
Tags
$typeClass
The class descriptor of the collection's entity type.
private
ClassMetadata
$typeClass
Methods
__clone()
Cleans up internal state of cloned persistent collection.
public
__clone() : mixed
The following problems have to be prevented:
- Added entities are added to old PC
- New collection is not dirty, if reused on other entity nothing changes.
- Snapshot leads to invalid diffs being generated.
- Lazy loading grabs entities from old owner object.
- New collection is connected to old owner and leads to duplicate keys.
Return values
mixed —__construct()
Creates a new persistent collection.
public
__construct(EntityManagerInterface $em, ClassMetadata $class, Collection $collection) : mixed
Parameters
- $em : EntityManagerInterface
-
The EntityManager the collection will be associated with.
- $class : ClassMetadata
-
The class descriptor of the entity type of this collection.
- $collection : Collection
Tags
Return values
mixed —__sleep()
Called by PHP when this collection is serialized. Ensures that only the elements are properly serialized.
public
__sleep() : array<string|int, string>
Internal note: Tried to implement Serializable first but that did not work well with circular references. This solution seems simpler and works well.
Tags
Return values
array<string|int, string> —add()
Adds an element at the end of the collection.
public
add(mixed $value) : true
Parameters
- $value : mixed
Return values
true —Always TRUE.
clear()
Clears the collection, removing all elements.
public
clear() : void
Return values
void —contains()
Checks whether an element is contained in the collection.
public
contains(mixed $element) : bool
Parameters
- $element : mixed
-
The element to search for.
Return values
bool —TRUE if the collection contains the element, FALSE otherwise.
containsKey()
Checks whether the collection contains an element with the specified key/index.
public
containsKey(mixed $key) : bool
Parameters
- $key : mixed
-
The key/index to check for.
Return values
bool —TRUE if the collection contains an element with the specified key/index, FALSE otherwise.
count()
{@inheritDoc}
public
count() : int
Return values
int —current()
Gets the element of the collection at the current iterator position.
public
current() : mixed
Return values
mixed —exists()
Tests for the existence of an element that satisfies the given predicate.
public
exists(Closure $p) : bool
Parameters
- $p : Closure
-
The predicate.
Return values
bool —TRUE if the predicate is TRUE for at least one element, FALSE otherwise.
filter()
Returns all the elements of this collection that satisfy the predicate p.
public
filter(Closure $p) : Collection<string|int, mixed>
Parameters
- $p : Closure
-
The predicate used for filtering.
Return values
Collection<string|int, mixed> —A collection with the results of the filter operation.
first()
Sets the internal iterator to the first element in the collection and returns this element.
public
first() : mixed
Return values
mixed —forAll()
Tests whether the given predicate p holds for all elements of this collection.
public
forAll(Closure $p) : bool
Parameters
- $p : Closure
-
The predicate.
Return values
bool —TRUE, if the predicate yields TRUE for all elements, FALSE otherwise.
get()
Gets the element at the specified key/index.
public
get(mixed $key) : mixed
Parameters
- $key : mixed
-
The key/index of the element to retrieve.
Return values
mixed —getDeleteDiff()
INTERNAL: getDeleteDiff
public
getDeleteDiff() : array<string|int, mixed>
Return values
array<string|int, mixed> —getInsertDiff()
INTERNAL: getInsertDiff
public
getInsertDiff() : array<string|int, mixed>
Return values
array<string|int, mixed> —getIterator()
{@inheritDoc}
public
getIterator() : Traversable<int|string, mixed>
Tags
Return values
Traversable<int|string, mixed> —getKeys()
Gets all keys/indices of the collection.
public
getKeys() : array<string|int, int>|array<string|int, string>
Return values
array<string|int, int>|array<string|int, string> —The keys/indices of the collection, in the order of the corresponding elements in the collection.
getMapping()
INTERNAL: Gets the association mapping of the collection.
public
getMapping() : array<string|int, mixed>|null
Tags
Return values
array<string|int, mixed>|null —getOwner()
INTERNAL: Gets the collection owner.
public
getOwner() : object|null
Return values
object|null —getSnapshot()
INTERNAL: Returns the last snapshot of the elements in the collection.
public
getSnapshot() : array<string|int, mixed>
Tags
Return values
array<string|int, mixed> —getTypeClass()
public
getTypeClass() : ClassMetadata
Return values
ClassMetadata —getValues()
Gets all values of the collection.
public
getValues() : array<string|int, mixed>
Return values
array<string|int, mixed> —The values of all elements in the collection, in the order they appear in the collection.
hydrateAdd()
INTERNAL: Adds an element to a collection during hydration. This will automatically complete bidirectional associations in the case of a one-to-many association.
public
hydrateAdd(mixed $element) : void
Parameters
- $element : mixed
-
The element to add.
Return values
void —hydrateSet()
INTERNAL: Sets a keyed element in the collection during hydration.
public
hydrateSet(mixed $key, mixed $element) : void
Parameters
- $key : mixed
-
The key to set.
- $element : mixed
-
The element to set.
Return values
void —indexOf()
Gets the index/key of a given element. The comparison of two elements is strict, that means not only the value but also the type must match.
public
indexOf(mixed $element) : int|string|bool
Parameters
- $element : mixed
-
The element to search for.
Return values
int|string|bool —The key/index of the element or FALSE if the element was not found.
initialize()
Initializes the collection by loading its contents from the database if the collection is not yet initialized.
public
initialize() : void
Return values
void —isDirty()
Gets a boolean flag indicating whether this collection is dirty which means its state needs to be synchronized with the database.
public
isDirty() : bool
Return values
bool —TRUE if the collection is dirty, FALSE otherwise.
isEmpty()
Checks whether the collection is empty (contains no elements).
public
isEmpty() : bool
Return values
bool —TRUE if the collection is empty, FALSE otherwise.
isInitialized()
Is the lazy collection already initialized?
public
isInitialized() : bool
Return values
bool —key()
Gets the key/index of the element at the current iterator position.
public
key() : int|string|null
Return values
int|string|null —last()
Sets the internal iterator to the last element in the collection and returns this element.
public
last() : mixed
Return values
mixed —map()
Applies the given function to each element in the collection and returns a new collection with the elements returned by the function.
public
map(Closure $func) : Collection<string|int, mixed>
Parameters
- $func : Closure
Return values
Collection<string|int, mixed> —matching()
Selects all elements from a selectable that match the expression and return a new collection containing these elements.
public
matching(Criteria $criteria) : Collection<string|int, mixed>
Parameters
- $criteria : Criteria
Tags
Return values
Collection<string|int, mixed> —next()
Moves the internal iterator position to the next element and returns this element.
public
next() : mixed
Return values
mixed —offsetExists()
{@inheritDoc}
public
offsetExists(mixed $offset) : bool
Parameters
- $offset : mixed
Return values
bool —offsetGet()
{@inheritDoc}
public
offsetGet(mixed $offset) : mixed
Parameters
- $offset : mixed
Return values
mixed —offsetSet()
{@inheritDoc}
public
offsetSet(mixed $offset, mixed $value) : void
Parameters
- $offset : mixed
- $value : mixed
Return values
void —offsetUnset()
{@inheritDoc}
public
offsetUnset(mixed $offset) : object|null
Parameters
- $offset : mixed
Return values
object|null —partition()
Partitions this collection in two collections according to a predicate.
public
partition(Closure $p) : Collection<string|int, mixed>
Parameters
- $p : Closure
-
The predicate on which to partition.
Return values
Collection<string|int, mixed> —An array with two elements. The first element contains the collection of elements where the predicate returned TRUE, the second element contains the collection of elements where the predicate returned FALSE.
remove()
Removes the element at the specified index from the collection.
public
remove(mixed $key) : object
Parameters
- $key : mixed
-
The key/index of the element to remove.
Return values
object —removeElement()
Removes the specified element from the collection, if it is found.
public
removeElement(mixed $element) : bool
Parameters
- $element : mixed
-
The element to remove.
Return values
bool —TRUE if this collection contained the specified element, FALSE otherwise.
set()
Sets an element in the collection at the specified key/index.
public
set(mixed $key, mixed $value) : void
Parameters
- $key : mixed
-
The key/index of the element to set.
- $value : mixed
-
The element to set.
Return values
void —setDirty()
Sets a boolean flag, indicating whether this collection is dirty.
public
setDirty(bool $dirty) : void
Parameters
- $dirty : bool
-
Whether the collection should be marked dirty or not.
Return values
void —setInitialized()
Sets the initialized flag of the collection, forcing it into that state.
public
setInitialized(bool $bool) : void
Parameters
- $bool : bool
Return values
void —setOwner()
INTERNAL: Sets the collection's owning entity together with the AssociationMapping that describes the association between the owner and the elements of the collection.
public
setOwner(object $entity, array<string|int, mixed> $assoc) : void
Parameters
- $entity : object
- $assoc : array<string|int, mixed>
Tags
Return values
void —slice()
Extracts a slice of $length elements starting at position $offset from the Collection.
public
slice(int $offset[, int|null $length = null ]) : array<string|int, mixed>
If $length is null it returns all elements from $offset to the end of the Collection. Keys have to be preserved by this method. Calling this method will only return the selected slice and NOT change the elements contained in the collection slice is called on.
Parameters
- $offset : int
- $length : int|null = null
Tags
Return values
array<string|int, mixed> —takeSnapshot()
INTERNAL: Tells this collection to take a snapshot of its current state.
public
takeSnapshot() : void
Return values
void —toArray()
Gets a native PHP array representation of the collection.
public
toArray() : array<string|int, mixed>
Return values
array<string|int, mixed> —unwrap()
Retrieves the wrapped Collection instance.
public
unwrap() : Collection<TKey, T>
Return values
Collection<TKey, T> —doInitialize()
Do the initialization logic
protected
doInitialize() : void
Return values
void —changed()
Marks this collection as changed/dirty.
private
changed() : void
Return values
void —restoreNewObjectsInDirtyCollection()
private
restoreNewObjectsInDirtyCollection(array<string|int, object> $newObjects) : void
Parameters
- $newObjects : array<string|int, object>
-
Note: the only reason why this entire looping/complexity is performed via
spl_object_idis because we want to prevent usingarray_udiff(), which is likely to cause very high overhead (complexity of O(n^2)).array_diff_key()performs the operation in core, which is faster than using a callback for comparisons