Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ExternalFKSetup.php
Go to the documentation of this file.
1 <?php
7 
9 
14 {
18  protected $setup;
19 
23  protected $entityTable;
24 
28  protected $entityColumn;
29 
33  protected $externalTable;
34 
38  protected $externalColumn;
39 
43  protected $onDelete;
44 
56  public function install(
63  ) {
64  $this->setup = $setup;
65  $this->entityTable = $entityTable;
66  $this->entityColumn = $entityColumn;
67  $this->externalTable = $externalTable;
68  $this->externalColumn = $externalColumn;
69  $this->onDelete = $onDelete;
70 
71  $this->execute();
72  }
73 
79  protected function execute()
80  {
81  $entityTableInfo = $this->setup->getConnection()->describeTable(
82  $this->setup->getTable($this->entityTable)
83  );
84  if (!$entityTableInfo[$this->entityColumn]['PRIMARY']) {
85  $this->dropOldForeignKey();
86  $this->addForeignKeys();
87  } else {
88  $this->addDefaultForeignKey();
89  }
90  }
91 
102  protected function getForeignKeys(
103  $targetTable,
104  $targetColumn,
105  $refTable,
106  $refColumn
107  ) {
108  $foreignKeys = $this->setup->getConnection()->getForeignKeys(
109  $this->setup->getTable($targetTable)
110  );
111  $foreignKeys = array_filter(
112  $foreignKeys,
113  function ($key) use ($targetColumn, $refTable, $refColumn) {
114  return $key['COLUMN_NAME'] == $targetColumn
115  && $key['REF_TABLE_NAME'] == $refTable;
116  }
117  );
118  return $foreignKeys;
119  }
120 
130  protected function clearForeignKey(
131  $targetTable,
132  $targetColumn,
133  $refTable,
134  $refColumn
135  ) {
136  $foreignKeys = $this->getForeignKeys($targetTable, $targetColumn, $refTable, $refColumn);
137  foreach ($foreignKeys as $foreignKey) {
138  $this->setup->getConnection()->dropForeignKey(
139  $foreignKey['TABLE_NAME'],
140  $foreignKey['FK_NAME']
141  );
142  }
143  }
144 
150  protected function addDefaultForeignKey()
151  {
152  if (!count($this->getForeignKeys(
153  $this->externalTable,
154  $this->externalColumn,
155  $this->entityTable,
156  $this->entityColumn
157  ))) {
158  $this->setup->getConnection()->addForeignKey(
159  $this->setup->getFkName(
160  $this->externalTable,
161  $this->externalColumn,
162  $this->entityTable,
163  $this->entityColumn
164  ),
165  $this->setup->getTable($this->externalTable),
167  $this->setup->getTable($this->entityTable),
170  );
171  }
172  }
173 
179  protected function addForeignKeys()
180  {
181  $foreignKeys = $this->setup->getConnection()->getForeignKeys(
182  $this->setup->getTable($this->entityTable)
183  );
184  $foreignKeys = array_filter(
185  $foreignKeys,
186  function ($key) {
187  return $key['COLUMN_NAME'] == $this->entityColumn;
188  }
189  );
190  foreach ($foreignKeys as $foreignKeyInfo) {
191  if (!count($this->getForeignKeys(
192  $this->externalTable,
193  $this->externalColumn,
194  $this->setup->getTablePlaceholder($foreignKeyInfo['REF_TABLE_NAME']),
195  $foreignKeyInfo['REF_COLUMN_NAME']
196  ))) {
197  $this->setup->getConnection()->addForeignKey(
198  $this->setup->getFkName(
199  $this->externalTable,
200  $this->externalColumn,
201  $this->setup->getTablePlaceholder($foreignKeyInfo['REF_TABLE_NAME']),
202  $foreignKeyInfo['REF_COLUMN_NAME']
203  ),
204  $this->setup->getTable($this->externalTable),
206  $foreignKeyInfo['REF_TABLE_NAME'],
207  $foreignKeyInfo['REF_COLUMN_NAME'],
209  );
210  }
211  }
212  }
213 
219  protected function dropOldForeignKey()
220  {
221  if (count($this->getForeignKeys(
222  $this->externalTable,
223  $this->externalColumn,
224  $this->entityTable,
225  $this->entityColumn
226  ))) {
227  $this->clearForeignKey(
228  $this->externalTable,
229  $this->externalColumn,
230  $this->entityTable,
231  $this->entityColumn
232  );
233  }
234  }
235 }
install(SchemaSetupInterface $setup, $entityTable, $entityColumn, $externalTable, $externalColumn, $onDelete=AdapterInterface::FK_ACTION_CASCADE)
getForeignKeys( $targetTable, $targetColumn, $refTable, $refColumn)
clearForeignKey( $targetTable, $targetColumn, $refTable, $refColumn)