Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ReCreateTable.php
Go to the documentation of this file.
1 <?php
8 
16 
22 {
26  const OPERATION_NAME = 'recreate_table';
27 
31  private $createTable;
32 
36  private $dropTable;
37 
41  private $migrateDataBetweenShards;
42 
46  private $elementHistoryFactory;
47 
51  private $elementFactory;
52 
62  public function __construct(
63  CreateTable $createTable,
64  DropTable $dropTable,
65  MigrateDataBetweenShards $migrateDataBetweenShards,
66  ElementHistoryFactory $elementHistoryFactory,
67  ElementFactory $elementFactory
68  ) {
69  $this->createTable = $createTable;
70  $this->dropTable = $dropTable;
71  $this->migrateDataBetweenShards = $migrateDataBetweenShards;
72  $this->elementHistoryFactory = $elementHistoryFactory;
73  $this->elementFactory = $elementFactory;
74  }
75 
79  public function isOperationDestructive()
80  {
81  return true;
82  }
83 
87  public function getOperationName()
88  {
89  return self::OPERATION_NAME;
90  }
91 
100  private function getRecreatedTable(ElementHistory $elementHistory) : Table
101  {
103  $newTable = $elementHistory->getNew();
105  $oldTable = $elementHistory->getOld();
107  $recreationTable = $this->elementFactory->create(
108  'table',
109  [
110  'name' => $newTable->getName(),
111  'type' => 'table',
112  'nameWithoutPrefix' => $newTable->getNameWithoutPrefix(),
113  'resource' => $newTable->getResource(),
114  'engine' => $newTable->getEngine(),
115  'charset' => $newTable->getCharset(),
116  'collation' => $newTable->getCollation(),
117  'onCreate' => $newTable->getOnCreate(),
118  'comment' => $newTable->getOnCreate(),
119  'columns' => $oldTable->getColumns(),
120  'indexes' => $oldTable->getIndexes(),
121  'constraints' => array_merge($oldTable->getInternalConstraints(), $newTable->getReferenceConstraints())
122  ]
123  );
124 
125  return $recreationTable;
126  }
127 
131  public function doOperation(ElementHistory $elementHistory)
132  {
133  $recreatedTable = $this->getRecreatedTable($elementHistory);
134  $recreatedElementHistory = $this->elementHistoryFactory->create(
135  [
136  'old' => $elementHistory->getOld(),
137  'new' => $recreatedTable
138  ]
139  );
140  $statements = $this->createTable->doOperation($recreatedElementHistory);
142  foreach ($statements as $statement) {
143  if ($this->migrateDataBetweenShards->isApplicable((string) $recreatedTable->getOnCreate())) {
144  $statement->addTrigger($this->migrateDataBetweenShards->getCallback($recreatedElementHistory));
145  }
146  }
147 
148  return array_merge($statements, $this->dropTable->doOperation($recreatedElementHistory));
149  }
150 }
__construct(CreateTable $createTable, DropTable $dropTable, MigrateDataBetweenShards $migrateDataBetweenShards, ElementHistoryFactory $elementHistoryFactory, ElementFactory $elementFactory)