. */ namespace Doctrine\ORM\Persisters\Collection; use Doctrine\Common\Collections\Criteria; use Doctrine\ORM\PersistentCollection; /** * Persister for one-to-many collections. * * @author Roman Borschel * @author Guilherme Blanco * @author Alexander * @since 2.0 */ class OneToManyPersister extends AbstractCollectionPersister { /** * {@inheritdoc} */ public function delete(PersistentCollection $collection) { // This can never happen. One to many can only be inverse side. // For owning side one to many, it is required to have a join table, // then classifying it as a ManyToManyPersister. return; } /** * {@inheritdoc} */ public function update(PersistentCollection $collection) { // This can never happen. One to many can only be inverse side. // For owning side one to many, it is required to have a join table, // then classifying it as a ManyToManyPersister. return; } /** * {@inheritdoc} */ public function get(PersistentCollection $collection, $index) { $mapping = $collection->getMapping(); if ( ! isset($mapping['indexBy'])) { throw new \BadMethodCallException("Selecting a collection by index is only supported on indexed collections."); } $persister = $this->uow->getEntityPersister($mapping['targetEntity']); return $persister->load( array( $mapping['mappedBy'] => $collection->getOwner(), $mapping['indexBy'] => $index ), null, $mapping, array(), null, 1 ); } /** * {@inheritdoc} */ public function count(PersistentCollection $collection) { $mapping = $collection->getMapping(); $persister = $this->uow->getEntityPersister($mapping['targetEntity']); // only works with single id identifier entities. Will throw an // exception in Entity Persisters if that is not the case for the // 'mappedBy' field. $criteria = new Criteria(Criteria::expr()->eq($mapping['mappedBy'], $collection->getOwner())); return $persister->count($criteria); } /** * {@inheritdoc} */ public function slice(PersistentCollection $collection, $offset, $length = null) { $mapping = $collection->getMapping(); $persister = $this->uow->getEntityPersister($mapping['targetEntity']); return $persister->getOneToManyCollection($mapping, $collection->getOwner(), $offset, $length); } /** * {@inheritdoc} */ public function containsKey(PersistentCollection $collection, $key) { $mapping = $collection->getMapping(); if ( ! isset($mapping['indexBy'])) { throw new \BadMethodCallException("Selecting a collection by index is only supported on indexed collections."); } $persister = $this->uow->getEntityPersister($mapping['targetEntity']); // only works with single id identifier entities. Will throw an // exception in Entity Persisters if that is not the case for the // 'mappedBy' field. $criteria = new Criteria(); $criteria->andWhere(Criteria::expr()->eq($mapping['mappedBy'], $collection->getOwner())); $criteria->andWhere(Criteria::expr()->eq($mapping['indexBy'], $key)); return (bool) $persister->count($criteria); } /** * {@inheritdoc} */ public function contains(PersistentCollection $collection, $element) { if ( ! $this->isValidEntityState($element)) { return false; } $mapping = $collection->getMapping(); $persister = $this->uow->getEntityPersister($mapping['targetEntity']); // only works with single id identifier entities. Will throw an // exception in Entity Persisters if that is not the case for the // 'mappedBy' field. $criteria = new Criteria(Criteria::expr()->eq($mapping['mappedBy'], $collection->getOwner())); return $persister->exists($element, $criteria); } /** * {@inheritdoc} */ public function removeElement(PersistentCollection $collection, $element) { if ( ! $this->isValidEntityState($element)) { return false; } $mapping = $collection->getMapping(); $persister = $this->uow->getEntityPersister($mapping['targetEntity']); $targetMetadata = $this->em->getClassMetadata($mapping['targetEntity']); // clearing owning side value $targetMetadata->reflFields[$mapping['mappedBy']]->setValue($element, null); $persister->update($element); return true; } /** * {@inheritdoc} */ public function loadCriteria(PersistentCollection $collection, Criteria $criteria) { throw new \BadMethodCallException("Filtering a collection by Criteria is not supported by this CollectionPersister."); } }