PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.35.1
MailPoet – Newsletters, Email Marketing, and Automation v5.35.1
5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor-prefixed / doctrine / orm / src / Persisters / Collection / OneToManyPersister.php
mailpoet / vendor-prefixed / doctrine / orm / src / Persisters / Collection Last commit date
AbstractCollectionPersister.php 9 months ago CollectionPersister.php 9 months ago ManyToManyPersister.php 9 months ago OneToManyPersister.php 9 months ago index.php 9 months ago
OneToManyPersister.php
169 lines
1 <?php
2 declare (strict_types=1);
3 namespace MailPoetVendor\Doctrine\ORM\Persisters\Collection;
4 if (!defined('ABSPATH')) exit;
5 use BadMethodCallException;
6 use MailPoetVendor\Doctrine\Common\Collections\Criteria;
7 use MailPoetVendor\Doctrine\DBAL\Exception as DBALException;
8 use MailPoetVendor\Doctrine\DBAL\Types\Type;
9 use MailPoetVendor\Doctrine\ORM\EntityNotFoundException;
10 use MailPoetVendor\Doctrine\ORM\Mapping\MappingException;
11 use MailPoetVendor\Doctrine\ORM\PersistentCollection;
12 use MailPoetVendor\Doctrine\ORM\Utility\PersisterHelper;
13 use function array_fill;
14 use function array_keys;
15 use function array_merge;
16 use function array_reverse;
17 use function array_values;
18 use function assert;
19 use function count;
20 use function implode;
21 use function is_int;
22 use function is_string;
23 class OneToManyPersister extends AbstractCollectionPersister
24 {
25 public function delete(PersistentCollection $collection)
26 {
27 // The only valid case here is when you have weak entities. In this
28 // scenario, you have @OneToMany with orphanRemoval=true, and replacing
29 // the entire collection with a new would trigger this operation.
30 $mapping = $collection->getMapping();
31 if (!$mapping['orphanRemoval']) {
32 // Handling non-orphan removal should never happen, as @OneToMany
33 // can only be inverse side. For owning side one to many, it is
34 // required to have a join table, which would classify as a ManyToManyPersister.
35 return;
36 }
37 $targetClass = $this->em->getClassMetadata($mapping['targetEntity']);
38 return $targetClass->isInheritanceTypeJoined() ? $this->deleteJoinedEntityCollection($collection) : $this->deleteEntityCollection($collection);
39 }
40 public function update(PersistentCollection $collection)
41 {
42 // This can never happen. One to many can only be inverse side.
43 // For owning side one to many, it is required to have a join table,
44 // then classifying it as a ManyToManyPersister.
45 return;
46 }
47 public function get(PersistentCollection $collection, $index)
48 {
49 $mapping = $collection->getMapping();
50 if (!isset($mapping['indexBy'])) {
51 throw new BadMethodCallException('Selecting a collection by index is only supported on indexed collections.');
52 }
53 $persister = $this->uow->getEntityPersister($mapping['targetEntity']);
54 return $persister->load([$mapping['mappedBy'] => $collection->getOwner(), $mapping['indexBy'] => $index], null, $mapping, [], null, 1);
55 }
56 public function count(PersistentCollection $collection)
57 {
58 $mapping = $collection->getMapping();
59 $persister = $this->uow->getEntityPersister($mapping['targetEntity']);
60 // only works with single id identifier entities. Will throw an
61 // exception in Entity Persisters if that is not the case for the
62 // 'mappedBy' field.
63 $criteria = Criteria::create(\true)->where(Criteria::expr()->eq($mapping['mappedBy'], $collection->getOwner()));
64 return $persister->count($criteria);
65 }
66 public function slice(PersistentCollection $collection, $offset, $length = null)
67 {
68 $mapping = $collection->getMapping();
69 $persister = $this->uow->getEntityPersister($mapping['targetEntity']);
70 return $persister->getOneToManyCollection($mapping, $collection->getOwner(), $offset, $length);
71 }
72 public function containsKey(PersistentCollection $collection, $key)
73 {
74 $mapping = $collection->getMapping();
75 if (!isset($mapping['indexBy'])) {
76 throw new BadMethodCallException('Selecting a collection by index is only supported on indexed collections.');
77 }
78 $persister = $this->uow->getEntityPersister($mapping['targetEntity']);
79 // only works with single id identifier entities. Will throw an
80 // exception in Entity Persisters if that is not the case for the
81 // 'mappedBy' field.
82 $criteria = Criteria::create(\true);
83 $criteria->andWhere(Criteria::expr()->eq($mapping['mappedBy'], $collection->getOwner()));
84 $criteria->andWhere(Criteria::expr()->eq($mapping['indexBy'], $key));
85 return (bool) $persister->count($criteria);
86 }
87 public function contains(PersistentCollection $collection, $element)
88 {
89 if (!$this->isValidEntityState($element)) {
90 return \false;
91 }
92 $mapping = $collection->getMapping();
93 $persister = $this->uow->getEntityPersister($mapping['targetEntity']);
94 // only works with single id identifier entities. Will throw an
95 // exception in Entity Persisters if that is not the case for the
96 // 'mappedBy' field.
97 $criteria = Criteria::create(\true)->where(Criteria::expr()->eq($mapping['mappedBy'], $collection->getOwner()));
98 return $persister->exists($element, $criteria);
99 }
100 public function loadCriteria(PersistentCollection $collection, Criteria $criteria)
101 {
102 throw new BadMethodCallException('Filtering a collection by Criteria is not supported by this CollectionPersister.');
103 }
104 private function deleteEntityCollection(PersistentCollection $collection) : int
105 {
106 $mapping = $collection->getMapping();
107 $identifier = $this->uow->getEntityIdentifier($collection->getOwner());
108 $sourceClass = $this->em->getClassMetadata($mapping['sourceEntity']);
109 $targetClass = $this->em->getClassMetadata($mapping['targetEntity']);
110 $columns = [];
111 $parameters = [];
112 $types = [];
113 foreach ($targetClass->associationMappings[$mapping['mappedBy']]['joinColumns'] as $joinColumn) {
114 $columns[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $targetClass, $this->platform);
115 $parameters[] = $identifier[$sourceClass->getFieldForColumn($joinColumn['referencedColumnName'])];
116 $types[] = PersisterHelper::getTypeOfColumn($joinColumn['referencedColumnName'], $sourceClass, $this->em);
117 }
118 $statement = 'DELETE FROM ' . $this->quoteStrategy->getTableName($targetClass, $this->platform) . ' WHERE ' . implode(' = ? AND ', $columns) . ' = ?';
119 if ($targetClass->isInheritanceTypeSingleTable()) {
120 $discriminatorColumn = $targetClass->getDiscriminatorColumn();
121 $discriminatorValues = $targetClass->discriminatorValue ? [$targetClass->discriminatorValue] : array_keys($targetClass->discriminatorMap);
122 $statement .= ' AND ' . $discriminatorColumn['name'] . ' IN (' . implode(', ', array_fill(0, count($discriminatorValues), '?')) . ')';
123 foreach ($discriminatorValues as $discriminatorValue) {
124 $parameters[] = $discriminatorValue;
125 $types[] = $discriminatorColumn['type'];
126 }
127 }
128 $numAffected = $this->conn->executeStatement($statement, $parameters, $types);
129 assert(is_int($numAffected));
130 return $numAffected;
131 }
132 private function deleteJoinedEntityCollection(PersistentCollection $collection) : int
133 {
134 $mapping = $collection->getMapping();
135 $sourceClass = $this->em->getClassMetadata($mapping['sourceEntity']);
136 $targetClass = $this->em->getClassMetadata($mapping['targetEntity']);
137 $rootClass = $this->em->getClassMetadata($targetClass->rootEntityName);
138 // 1) Build temporary table DDL
139 $tempTable = $this->platform->getTemporaryTableName($rootClass->getTemporaryIdTableName());
140 $idColumnNames = $rootClass->getIdentifierColumnNames();
141 $idColumnList = implode(', ', $idColumnNames);
142 $columnDefinitions = [];
143 foreach ($idColumnNames as $idColumnName) {
144 $columnDefinitions[$idColumnName] = ['notnull' => \true, 'type' => Type::getType(PersisterHelper::getTypeOfColumn($idColumnName, $rootClass, $this->em))];
145 }
146 $statement = $this->platform->getCreateTemporaryTableSnippetSQL() . ' ' . $tempTable . ' (' . $this->platform->getColumnDeclarationListSQL($columnDefinitions) . ')';
147 $this->conn->executeStatement($statement);
148 // 2) Build insert table records into temporary table
149 $query = $this->em->createQuery(' SELECT t0.' . implode(', t0.', $rootClass->getIdentifierFieldNames()) . ' FROM ' . $targetClass->name . ' t0 WHERE t0.' . $mapping['mappedBy'] . ' = :owner')->setParameter('owner', $collection->getOwner());
150 $sql = $query->getSQL();
151 assert(is_string($sql));
152 $statement = 'INSERT INTO ' . $tempTable . ' (' . $idColumnList . ') ' . $sql;
153 $parameters = array_values($sourceClass->getIdentifierValues($collection->getOwner()));
154 $numDeleted = $this->conn->executeStatement($statement, $parameters);
155 // 3) Delete records on each table in the hierarchy
156 $classNames = array_merge($targetClass->parentClasses, [$targetClass->name], $targetClass->subClasses);
157 foreach (array_reverse($classNames) as $className) {
158 $tableName = $this->quoteStrategy->getTableName($this->em->getClassMetadata($className), $this->platform);
159 $statement = 'DELETE FROM ' . $tableName . ' WHERE (' . $idColumnList . ')' . ' IN (SELECT ' . $idColumnList . ' FROM ' . $tempTable . ')';
160 $this->conn->executeStatement($statement);
161 }
162 // 4) Drop temporary table
163 $statement = $this->platform->getDropTemporaryTableSQL($tempTable);
164 $this->conn->executeStatement($statement);
165 assert(is_int($numDeleted));
166 return $numDeleted;
167 }
168 }
169