123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Framework\Setup;
- use Magento\Framework\DB\Adapter\AdapterInterface;
- /**
- * @codeCoverageIgnore
- */
- class ExternalFKSetup
- {
- /**
- * @var SchemaSetupInterface
- */
- protected $setup;
- /**
- * @var string
- */
- protected $entityTable;
- /**
- * @var string
- */
- protected $entityColumn;
- /**
- * @var string
- */
- protected $externalTable;
- /**
- * @var string
- */
- protected $externalColumn;
- /**
- * @var string
- */
- protected $onDelete;
- /**
- * Install external foreign key
- *
- * @param SchemaSetupInterface $setup
- * @param string $entityTable
- * @param string $entityColumn
- * @param string $externalTable
- * @param string $externalColumn
- * @param string $onDelete
- * @return void
- */
- public function install(
- SchemaSetupInterface $setup,
- $entityTable,
- $entityColumn,
- $externalTable,
- $externalColumn,
- $onDelete = AdapterInterface::FK_ACTION_CASCADE
- ) {
- $this->setup = $setup;
- $this->entityTable = $entityTable;
- $this->entityColumn = $entityColumn;
- $this->externalTable = $externalTable;
- $this->externalColumn = $externalColumn;
- $this->onDelete = $onDelete;
- $this->execute();
- }
- /**
- * Set external foreign key
- *
- * @return void
- */
- protected function execute()
- {
- $entityTableInfo = $this->setup->getConnection()->describeTable(
- $this->setup->getTable($this->entityTable)
- );
- if (!$entityTableInfo[$this->entityColumn]['PRIMARY']) {
- $this->dropOldForeignKey();
- $this->addForeignKeys();
- } else {
- $this->addDefaultForeignKey();
- }
- }
- /**
- * Get foreign keys for tables and columns
- *
- * @param string $refTable
- * @param string $refColumn
- * @param string $targetTable
- * @param string $targetColumn
- * @return array
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- */
- protected function getForeignKeys(
- $targetTable,
- $targetColumn,
- $refTable,
- $refColumn
- ) {
- $foreignKeys = $this->setup->getConnection()->getForeignKeys(
- $this->setup->getTable($targetTable)
- );
- $foreignKeys = array_filter(
- $foreignKeys,
- function ($key) use ($targetColumn, $refTable, $refColumn) {
- return $key['COLUMN_NAME'] == $targetColumn
- && $key['REF_TABLE_NAME'] == $refTable;
- }
- );
- return $foreignKeys;
- }
- /**
- * Remove foreign key if exists
- *
- * @param string $targetTable
- * @param string $targetColumn
- * @param string $refTable
- * @param string $refColumn
- * @return void
- */
- protected function clearForeignKey(
- $targetTable,
- $targetColumn,
- $refTable,
- $refColumn
- ) {
- $foreignKeys = $this->getForeignKeys($targetTable, $targetColumn, $refTable, $refColumn);
- foreach ($foreignKeys as $foreignKey) {
- $this->setup->getConnection()->dropForeignKey(
- $foreignKey['TABLE_NAME'],
- $foreignKey['FK_NAME']
- );
- }
- }
- /**
- * Add default foreign key
- *
- * @return void
- */
- protected function addDefaultForeignKey()
- {
- if (!count($this->getForeignKeys(
- $this->externalTable,
- $this->externalColumn,
- $this->entityTable,
- $this->entityColumn
- ))) {
- $this->setup->getConnection()->addForeignKey(
- $this->setup->getFkName(
- $this->externalTable,
- $this->externalColumn,
- $this->entityTable,
- $this->entityColumn
- ),
- $this->setup->getTable($this->externalTable),
- $this->externalColumn,
- $this->setup->getTable($this->entityTable),
- $this->entityColumn,
- $this->onDelete
- );
- }
- }
- /**
- * Add foreign keys to entity table
- *
- * @return void
- */
- protected function addForeignKeys()
- {
- $foreignKeys = $this->setup->getConnection()->getForeignKeys(
- $this->setup->getTable($this->entityTable)
- );
- $foreignKeys = array_filter(
- $foreignKeys,
- function ($key) {
- return $key['COLUMN_NAME'] == $this->entityColumn;
- }
- );
- foreach ($foreignKeys as $foreignKeyInfo) {
- if (!count($this->getForeignKeys(
- $this->externalTable,
- $this->externalColumn,
- $this->setup->getTablePlaceholder($foreignKeyInfo['REF_TABLE_NAME']),
- $foreignKeyInfo['REF_COLUMN_NAME']
- ))) {
- $this->setup->getConnection()->addForeignKey(
- $this->setup->getFkName(
- $this->externalTable,
- $this->externalColumn,
- $this->setup->getTablePlaceholder($foreignKeyInfo['REF_TABLE_NAME']),
- $foreignKeyInfo['REF_COLUMN_NAME']
- ),
- $this->setup->getTable($this->externalTable),
- $this->externalColumn,
- $foreignKeyInfo['REF_TABLE_NAME'],
- $foreignKeyInfo['REF_COLUMN_NAME'],
- $this->onDelete
- );
- }
- }
- }
- /**
- * Drop old foreign key
- *
- * @return void
- */
- protected function dropOldForeignKey()
- {
- if (count($this->getForeignKeys(
- $this->externalTable,
- $this->externalColumn,
- $this->entityTable,
- $this->entityColumn
- ))) {
- $this->clearForeignKey(
- $this->externalTable,
- $this->externalColumn,
- $this->entityTable,
- $this->entityColumn
- );
- }
- }
- }
|