summaryrefslogtreecommitdiff
path: root/vendor/doctrine/orm/src/Mapping/ManyToManyOwningSideMapping.php
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2024-08-13 23:45:21 +0200
committerpolo <ordipolo@gmx.fr>2024-08-13 23:45:21 +0200
commitbf6655a534a6775d30cafa67bd801276bda1d98d (patch)
treec6381e3f6c81c33eab72508f410b165ba05f7e9c /vendor/doctrine/orm/src/Mapping/ManyToManyOwningSideMapping.php
parent94d67a4b51f8e62e7d518cce26a526ae1ec48278 (diff)
downloadAppliGestionPHP-bf6655a534a6775d30cafa67bd801276bda1d98d.zip
VERSION 0.2 doctrine ORM et entités
Diffstat (limited to 'vendor/doctrine/orm/src/Mapping/ManyToManyOwningSideMapping.php')
-rw-r--r--vendor/doctrine/orm/src/Mapping/ManyToManyOwningSideMapping.php185
1 files changed, 185 insertions, 0 deletions
diff --git a/vendor/doctrine/orm/src/Mapping/ManyToManyOwningSideMapping.php b/vendor/doctrine/orm/src/Mapping/ManyToManyOwningSideMapping.php
new file mode 100644
index 0000000..b09d56c
--- /dev/null
+++ b/vendor/doctrine/orm/src/Mapping/ManyToManyOwningSideMapping.php
@@ -0,0 +1,185 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\ORM\Mapping;
6
7use function strtolower;
8use function trim;
9
10final class ManyToManyOwningSideMapping extends ToManyOwningSideMapping implements ManyToManyAssociationMapping
11{
12 /**
13 * Specification of the join table and its join columns (foreign keys).
14 * Only valid for many-to-many mappings. Note that one-to-many associations
15 * can be mapped through a join table by simply mapping the association as
16 * many-to-many with a unique constraint on the join table.
17 */
18 public JoinTableMapping $joinTable;
19
20 /** @var list<mixed> */
21 public array $joinTableColumns = [];
22
23 /** @var array<string, string> */
24 public array $relationToSourceKeyColumns = [];
25 /** @var array<string, string> */
26 public array $relationToTargetKeyColumns = [];
27
28 /** @return array<string, mixed> */
29 public function toArray(): array
30 {
31 $array = parent::toArray();
32
33 $array['joinTable'] = $this->joinTable->toArray();
34
35 return $array;
36 }
37
38 /**
39 * @param mixed[] $mappingArray
40 * @psalm-param array{
41 * fieldName: string,
42 * sourceEntity: class-string,
43 * targetEntity: class-string,
44 * cascade?: list<'persist'|'remove'|'detach'|'refresh'|'all'>,
45 * fetch?: ClassMetadata::FETCH_*|null,
46 * inherited?: class-string|null,
47 * declared?: class-string|null,
48 * cache?: array<mixed>|null,
49 * id?: bool|null,
50 * isOnDeleteCascade?: bool|null,
51 * originalClass?: class-string|null,
52 * originalField?: string|null,
53 * orphanRemoval?: bool,
54 * unique?: bool|null,
55 * joinTable?: mixed[]|null,
56 * type?: int,
57 * isOwningSide: bool,
58 * } $mappingArray
59 */
60 public static function fromMappingArrayAndNamingStrategy(array $mappingArray, NamingStrategy $namingStrategy): self
61 {
62 if (isset($mappingArray['joinTable']['joinColumns'])) {
63 foreach ($mappingArray['joinTable']['joinColumns'] as $key => $joinColumn) {
64 if (empty($joinColumn['name'])) {
65 $mappingArray['joinTable']['joinColumns'][$key]['name'] = $namingStrategy->joinKeyColumnName(
66 $mappingArray['sourceEntity'],
67 $joinColumn['referencedColumnName'] ?? null,
68 );
69 }
70 }
71 }
72
73 if (isset($mappingArray['joinTable']['inverseJoinColumns'])) {
74 foreach ($mappingArray['joinTable']['inverseJoinColumns'] as $key => $joinColumn) {
75 if (empty($joinColumn['name'])) {
76 $mappingArray['joinTable']['inverseJoinColumns'][$key]['name'] = $namingStrategy->joinKeyColumnName(
77 $mappingArray['targetEntity'],
78 $joinColumn['referencedColumnName'] ?? null,
79 );
80 }
81 }
82 }
83
84 // owning side MUST have a join table
85 if (! isset($mappingArray['joinTable']) || ! isset($mappingArray['joinTable']['name'])) {
86 $mappingArray['joinTable']['name'] = $namingStrategy->joinTableName(
87 $mappingArray['sourceEntity'],
88 $mappingArray['targetEntity'],
89 $mappingArray['fieldName'],
90 );
91 }
92
93 $mapping = parent::fromMappingArray($mappingArray);
94
95 $selfReferencingEntityWithoutJoinColumns = $mapping->sourceEntity === $mapping->targetEntity
96 && $mapping->joinTable->joinColumns === []
97 && $mapping->joinTable->inverseJoinColumns === [];
98
99 if ($mapping->joinTable->joinColumns === []) {
100 $mapping->joinTable->joinColumns = [
101 JoinColumnMapping::fromMappingArray([
102 'name' => $namingStrategy->joinKeyColumnName($mapping->sourceEntity, $selfReferencingEntityWithoutJoinColumns ? 'source' : null),
103 'referencedColumnName' => $namingStrategy->referenceColumnName(),
104 'onDelete' => 'CASCADE',
105 ]),
106 ];
107 }
108
109 if ($mapping->joinTable->inverseJoinColumns === []) {
110 $mapping->joinTable->inverseJoinColumns = [
111 JoinColumnMapping::fromMappingArray([
112 'name' => $namingStrategy->joinKeyColumnName($mapping->targetEntity, $selfReferencingEntityWithoutJoinColumns ? 'target' : null),
113 'referencedColumnName' => $namingStrategy->referenceColumnName(),
114 'onDelete' => 'CASCADE',
115 ]),
116 ];
117 }
118
119 $mapping->joinTableColumns = [];
120
121 foreach ($mapping->joinTable->joinColumns as $joinColumn) {
122 if (empty($joinColumn->referencedColumnName)) {
123 $joinColumn->referencedColumnName = $namingStrategy->referenceColumnName();
124 }
125
126 if ($joinColumn->name[0] === '`') {
127 $joinColumn->name = trim($joinColumn->name, '`');
128 $joinColumn->quoted = true;
129 }
130
131 if ($joinColumn->referencedColumnName[0] === '`') {
132 $joinColumn->referencedColumnName = trim($joinColumn->referencedColumnName, '`');
133 $joinColumn->quoted = true;
134 }
135
136 if (isset($joinColumn->onDelete) && strtolower($joinColumn->onDelete) === 'cascade') {
137 $mapping->isOnDeleteCascade = true;
138 }
139
140 $mapping->relationToSourceKeyColumns[$joinColumn->name] = $joinColumn->referencedColumnName;
141 $mapping->joinTableColumns[] = $joinColumn->name;
142 }
143
144 foreach ($mapping->joinTable->inverseJoinColumns as $inverseJoinColumn) {
145 if (empty($inverseJoinColumn->referencedColumnName)) {
146 $inverseJoinColumn->referencedColumnName = $namingStrategy->referenceColumnName();
147 }
148
149 if ($inverseJoinColumn->name[0] === '`') {
150 $inverseJoinColumn->name = trim($inverseJoinColumn->name, '`');
151 $inverseJoinColumn->quoted = true;
152 }
153
154 if ($inverseJoinColumn->referencedColumnName[0] === '`') {
155 $inverseJoinColumn->referencedColumnName = trim($inverseJoinColumn->referencedColumnName, '`');
156 $inverseJoinColumn->quoted = true;
157 }
158
159 if (isset($inverseJoinColumn->onDelete) && strtolower($inverseJoinColumn->onDelete) === 'cascade') {
160 $mapping->isOnDeleteCascade = true;
161 }
162
163 $mapping->relationToTargetKeyColumns[$inverseJoinColumn->name] = $inverseJoinColumn->referencedColumnName;
164 $mapping->joinTableColumns[] = $inverseJoinColumn->name;
165 }
166
167 return $mapping;
168 }
169
170 /** @return list<string> */
171 public function __sleep(): array
172 {
173 $serialized = parent::__sleep();
174 $serialized[] = 'joinTable';
175 $serialized[] = 'joinTableColumns';
176
177 foreach (['relationToSourceKeyColumns', 'relationToTargetKeyColumns'] as $arrayKey) {
178 if ($this->$arrayKey !== null) {
179 $serialized[] = $arrayKey;
180 }
181 }
182
183 return $serialized;
184 }
185}