Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
AddColumn.php
Go to the documentation of this file.
1 <?php
8 
20 
25 class AddColumn implements OperationInterface
26 {
30  const OPERATION_NAME = 'add_column';
31 
35  const TEMPORARY_KEY = 'AUTO_INCREMENT_TEMPORARY_KEY';
36 
40  private $definitionAggregator;
41 
45  private $dbSchemaWriter;
46 
50  private $elementFactory;
51 
55  private $elementHistoryFactory;
56 
60  private $addComplexElement;
61 
65  private $dropElement;
66 
70  private $triggers;
71 
83  public function __construct(
84  DefinitionAggregator $definitionAggregator,
85  DbSchemaWriterInterface $dbSchemaWriter,
86  ElementFactory $elementFactory,
87  ElementHistoryFactory $elementHistoryFactory,
88  AddComplexElement $addComplexElement,
89  DropElement $dropElement,
90  array $triggers = []
91  ) {
92  $this->definitionAggregator = $definitionAggregator;
93  $this->dbSchemaWriter = $dbSchemaWriter;
94  $this->elementFactory = $elementFactory;
95  $this->elementHistoryFactory = $elementHistoryFactory;
96  $this->addComplexElement = $addComplexElement;
97  $this->dropElement = $dropElement;
98  $this->triggers = $triggers;
99  }
100 
107  private function getTemporaryIndexHistory(Column $column)
108  {
109  $index = $this->elementFactory->create(
110  Index::TYPE,
111  [
112  'name' => self::TEMPORARY_KEY,
113  'column' => [$column->getName()],
114  'columns' => [$column],
115  'table' => $column->getTable()
116  ]
117  );
118  return $this->elementHistoryFactory->create(['new' => $index]);
119  }
120 
124  public function getOperationName()
125  {
126  return self::OPERATION_NAME;
127  }
128 
132  public function isOperationDestructive()
133  {
134  return false;
135  }
136 
143  private function columnIsAutoIncrement(Column $column)
144  {
145  return $column instanceof Integer && $column->isIdentity();
146  }
147 
155  private function setupTriggersIfExists(Statement $statement, ElementHistory $elementHistory)
156  {
158  $column = $elementHistory->getNew();
159  //Add triggers to column
160  foreach ($this->triggers as $ddlTrigger) {
161  if ($ddlTrigger->isApplicable((string) $column->getOnCreate())) {
162  $statement->addTrigger($ddlTrigger->getCallback($elementHistory));
163  }
164  }
165  $statements = [$statement];
171  if ($this->columnIsAutoIncrement($column) && !empty($statement->getTriggers())) {
179  $indexHistory = $this->getTemporaryIndexHistory($column);
181  $statements = array_merge($this->addComplexElement->doOperation($indexHistory), $statements);
183  $statements = array_merge($statements, $this->dropElement->doOperation($indexHistory));
184  }
185 
186  return $statements;
187  }
188 
192  public function doOperation(ElementHistory $elementHistory)
193  {
197  $element = $elementHistory->getNew();
198  $definition = $this->definitionAggregator->toDefinition($element);
199 
200  $statement = $this->dbSchemaWriter->addElement(
201  $element->getName(),
202  $element->getTable()->getResource(),
203  $element->getTable()->getName(),
204  $definition,
206  );
207  $statements = $this->setupTriggersIfExists($statement, $elementHistory);
208 
209  if ($this->columnIsAutoIncrement($element)) {
211  $statements[] = $this->dbSchemaWriter->resetAutoIncrement(
212  $element->getTable()->getName(),
213  $element->getTable()->getResource()
214  );
215  }
216 
217  return $statements;
218  }
219 }
__construct(DefinitionAggregator $definitionAggregator, DbSchemaWriterInterface $dbSchemaWriter, ElementFactory $elementFactory, ElementHistoryFactory $elementHistoryFactory, AddComplexElement $addComplexElement, DropElement $dropElement, array $triggers=[])
Definition: AddColumn.php:83
$index
Definition: list.phtml:44
$element
Definition: element.phtml:12