MIOLO20
Carregando...
Procurando...
Nenhuma entrada encontrada
Table.php
Ir para a documentação deste ficheiro.
1<?php
2/*
3 * $Id$
4 *
5 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
6 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
11 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
13 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
14 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
15 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
16 *
17 * This software consists of voluntary contributions made by many individuals
18 * and is licensed under the LGPL. For more information, see
19 * <http://www.doctrine-project.org>.
20 */
21
22namespace Doctrine\DBAL\Schema;
23
27
37class Table extends AbstractAsset
38{
42 protected $_name = null;
43
47 protected $_columns = array();
48
52 protected $_indexes = array();
53
57 protected $_primaryKeyName = false;
58
62 protected $_fkConstraints = array();
63
67 protected $_options = array();
68
72 protected $_schemaConfig = null;
73
83 public function __construct($tableName, array $columns=array(), array $indexes=array(), array $fkConstraints=array(), $idGeneratorType = 0, array $options=array())
84 {
85 if (strlen($tableName) == 0) {
86 throw DBALException::invalidTableName($tableName);
87 }
88
89 $this->_setName($tableName);
90 $this->_idGeneratorType = $idGeneratorType;
91
92 foreach ($columns AS $column) {
93 $this->_addColumn($column);
94 }
95
96 foreach ($indexes AS $idx) {
97 $this->_addIndex($idx);
98 }
99
100 foreach ($fkConstraints AS $constraint) {
101 $this->_addForeignKeyConstraint($constraint);
102 }
103
104 $this->_options = $options;
105 }
106
110 public function setSchemaConfig(SchemaConfig $schemaConfig)
111 {
112 $this->_schemaConfig = $schemaConfig;
113 }
114
118 protected function _getMaxIdentifierLength()
119 {
120 if ($this->_schemaConfig instanceof SchemaConfig) {
121 return $this->_schemaConfig->getMaxIdentifierLength();
122 } else {
123 return 63;
124 }
125 }
126
134 public function setPrimaryKey(array $columns, $indexName = false)
135 {
136 $primaryKey = $this->_createIndex($columns, $indexName ?: "primary", true, true);
137
138 foreach ($columns AS $columnName) {
139 $column = $this->getColumn($columnName);
140 $column->setNotnull(true);
141 }
142
143 return $primaryKey;
144 }
145
151 public function addIndex(array $columnNames, $indexName = null)
152 {
153 if($indexName == null) {
154 $indexName = $this->_generateIdentifierName(
155 array_merge(array($this->getName()), $columnNames), "idx", $this->_getMaxIdentifierLength()
156 );
157 }
158
159 return $this->_createIndex($columnNames, $indexName, false, false);
160 }
161
168 public function addUniqueIndex(array $columnNames, $indexName = null)
169 {
170 if ($indexName == null) {
171 $indexName = $this->_generateIdentifierName(
172 array_merge(array($this->getName()), $columnNames), "uniq", $this->_getMaxIdentifierLength()
173 );
174 }
175
176 return $this->_createIndex($columnNames, $indexName, true, false);
177 }
178
185 public function columnsAreIndexed(array $columnsNames)
186 {
187 foreach ($this->getIndexes() AS $index) {
188 /* @var $index Index */
189 if ($index->spansColumns($columnsNames)) {
190 return true;
191 }
192 }
193 return false;
194 }
195
204 private function _createIndex(array $columnNames, $indexName, $isUnique, $isPrimary)
205 {
206 if (preg_match('(([^a-zA-Z0-9_]+))', $indexName)) {
207 throw SchemaException::indexNameInvalid($indexName);
208 }
209
210 foreach ($columnNames AS $columnName => $indexColOptions) {
211 if (is_numeric($columnName) && is_string($indexColOptions)) {
212 $columnName = $indexColOptions;
213 }
214
215 if ( ! $this->hasColumn($columnName)) {
216 throw SchemaException::columnDoesNotExist($columnName, $this->_name);
217 }
218 }
219 $this->_addIndex(new Index($indexName, $columnNames, $isUnique, $isPrimary));
220 return $this;
221 }
222
229 public function addColumn($columnName, $typeName, array $options=array())
230 {
231 $column = new Column($columnName, Type::getType($typeName), $options);
232
233 $this->_addColumn($column);
234 return $column;
235 }
236
244 public function renameColumn($oldColumnName, $newColumnName)
245 {
246 $column = $this->getColumn($oldColumnName);
247 $this->dropColumn($oldColumnName);
248
249 $column->_setName($newColumnName);
250 return $this;
251 }
252
260 public function changeColumn($columnName, array $options)
261 {
262 $column = $this->getColumn($columnName);
263 $column->setOptions($options);
264 return $this;
265 }
266
273 public function dropColumn($columnName)
274 {
275 $columnName = strtolower($columnName);
276 $column = $this->getColumn($columnName);
277 unset($this->_columns[$columnName]);
278 return $this;
279 }
280
281
293 public function addForeignKeyConstraint($foreignTable, array $localColumnNames, array $foreignColumnNames, array $options=array())
294 {
295 $name = $this->_generateIdentifierName(array_merge((array)$this->getName(), $localColumnNames), "fk", $this->_getMaxIdentifierLength());
296 return $this->addNamedForeignKeyConstraint($name, $foreignTable, $localColumnNames, $foreignColumnNames, $options);
297 }
298
310 public function addUnnamedForeignKeyConstraint($foreignTable, array $localColumnNames, array $foreignColumnNames, array $options=array())
311 {
312 return $this->addNamedForeignKeyConstraint(null, $foreignTable, $localColumnNames, $foreignColumnNames, $options);
313 }
314
325 public function addNamedForeignKeyConstraint($name, $foreignTable, array $localColumnNames, array $foreignColumnNames, array $options=array())
326 {
327 if ($foreignTable instanceof Table) {
328 $foreignTableName = $foreignTable->getName();
329
330 foreach ($foreignColumnNames AS $columnName) {
331 if ( ! $foreignTable->hasColumn($columnName)) {
332 throw SchemaException::columnDoesNotExist($columnName, $foreignTable->getName());
333 }
334 }
335 } else {
336 $foreignTableName = $foreignTable;
337 }
338
339 foreach ($localColumnNames AS $columnName) {
340 if ( ! $this->hasColumn($columnName)) {
341 throw SchemaException::columnDoesNotExist($columnName, $this->_name);
342 }
343 }
344
345 $constraint = new ForeignKeyConstraint(
346 $localColumnNames, $foreignTableName, $foreignColumnNames, $name, $options
347 );
348 $this->_addForeignKeyConstraint($constraint);
349
350 return $this;
351 }
352
358 public function addOption($name, $value)
359 {
360 $this->_options[$name] = $value;
361 return $this;
362 }
363
367 protected function _addColumn(Column $column)
368 {
369 $columnName = $column->getName();
370 $columnName = strtolower($columnName);
371
372 if (isset($this->_columns[$columnName])) {
373 throw SchemaException::columnAlreadyExists($this->getName(), $columnName);
374 }
375
376 $this->_columns[$columnName] = $column;
377 }
378
385 protected function _addIndex(Index $indexCandidate)
386 {
387 // check for duplicates
388 foreach ($this->_indexes AS $existingIndex) {
389 if ($indexCandidate->isFullfilledBy($existingIndex)) {
390 return $this;
391 }
392 }
393
394 $indexName = $indexCandidate->getName();
395 $indexName = strtolower($indexName);
396
397 if (isset($this->_indexes[$indexName]) || ($this->_primaryKeyName != false && $indexCandidate->isPrimary())) {
398 throw SchemaException::indexAlreadyExists($indexName, $this->_name);
399 }
400
401 // remove overruled indexes
402 foreach ($this->_indexes AS $idxKey => $existingIndex) {
403 if ($indexCandidate->overrules($existingIndex)) {
404 unset($this->_indexes[$idxKey]);
405 }
406 }
407
408 if ($indexCandidate->isPrimary()) {
409 $this->_primaryKeyName = $indexName;
410 }
411
412 $this->_indexes[$indexName] = $indexCandidate;
413 return $this;
414 }
415
419 protected function _addForeignKeyConstraint(ForeignKeyConstraint $constraint)
420 {
421 $constraint->setLocalTable($this);
422
423 if(strlen($constraint->getName())) {
424 $name = $constraint->getName();
425 } else {
426 $name = $this->_generateIdentifierName(
427 array_merge((array)$this->getName(), $constraint->getLocalColumns()), "fk", $this->_getMaxIdentifierLength()
428 );
429 }
430 $name = strtolower($name);
431
432 $this->_fkConstraints[$name] = $constraint;
433 // add an explicit index on the foreign key columns. If there is already an index that fullfils this requirements drop the request.
434 // In the case of __construct calling this method during hydration from schema-details all the explicitly added indexes
435 // lead to duplicates. This creates compuation overhead in this case, however no duplicate indexes are ever added (based on columns).
436 $this->addIndex($constraint->getColumns());
437 }
438
445 public function hasForeignKey($constraintName)
446 {
447 $constraintName = strtolower($constraintName);
448 return isset($this->_fkConstraints[$constraintName]);
449 }
450
455 public function getForeignKey($constraintName)
456 {
457 $constraintName = strtolower($constraintName);
458 if(!$this->hasForeignKey($constraintName)) {
459 throw SchemaException::foreignKeyDoesNotExist($constraintName, $this->_name);
460 }
461
462 return $this->_fkConstraints[$constraintName];
463 }
464
468 public function getColumns()
469 {
470 $columns = $this->_columns;
471
472 $pkCols = array();
473 $fkCols = array();
474
475 if ($this->hasIndex($this->_primaryKeyName)) {
476 $pkCols = $this->getPrimaryKey()->getColumns();
477 }
478 foreach ($this->getForeignKeys() AS $fk) {
479 /* @var $fk ForeignKeyConstraint */
480 $fkCols = array_merge($fkCols, $fk->getColumns());
481 }
482 $colNames = array_unique(array_merge($pkCols, $fkCols, array_keys($columns)));
483
484 uksort($columns, function($a, $b) use($colNames) {
485 return (array_search($a, $colNames) >= array_search($b, $colNames));
486 });
487 return $columns;
488 }
489
490
497 public function hasColumn($columnName)
498 {
499 $columnName = strtolower($columnName);
500 return isset($this->_columns[$columnName]);
501 }
502
509 public function getColumn($columnName)
510 {
511 $columnName = strtolower($columnName);
512 if (!$this->hasColumn($columnName)) {
513 throw SchemaException::columnDoesNotExist($columnName, $this->_name);
514 }
515
516 return $this->_columns[$columnName];
517 }
518
522 public function getPrimaryKey()
523 {
524 return $this->getIndex($this->_primaryKeyName);
525 }
526
531 public function hasIndex($indexName)
532 {
533 $indexName = strtolower($indexName);
534 return (isset($this->_indexes[$indexName]));
535 }
536
541 public function getIndex($indexName)
542 {
543 $indexName = strtolower($indexName);
544 if (!$this->hasIndex($indexName)) {
545 throw SchemaException::indexDoesNotExist($indexName, $this->_name);
546 }
547 return $this->_indexes[$indexName];
548 }
549
553 public function getIndexes()
554 {
555 return $this->_indexes;
556 }
557
563 public function getForeignKeys()
564 {
566 }
567
568 public function hasOption($name)
569 {
570 return isset($this->_options[$name]);
571 }
572
573 public function getOption($name)
574 {
575 return $this->_options[$name];
576 }
577
578 public function getOptions()
579 {
580 return $this->_options;
581 }
582
586 public function visit(Visitor $visitor)
587 {
588 $visitor->acceptTable($this);
589
590 foreach ($this->getColumns() AS $column) {
591 $visitor->acceptColumn($this, $column);
592 }
593
594 foreach ($this->getIndexes() AS $index) {
595 $visitor->acceptIndex($this, $index);
596 }
597
598 foreach ($this->getForeignKeys() AS $constraint) {
599 $visitor->acceptForeignKey($this, $constraint);
600 }
601 }
602
606 public function __clone()
607 {
608 foreach ($this->_columns AS $k => $column) {
609 $this->_columns[$k] = clone $column;
610 }
611 foreach ($this->_indexes AS $k => $index) {
612 $this->_indexes[$k] = clone $index;
613 }
614 foreach ($this->_fkConstraints AS $k => $fk) {
615 $this->_fkConstraints[$k] = clone $fk;
616 $this->_fkConstraints[$k]->setLocalTable($this);
617 }
618 }
619}
static invalidTableName($tableName)
_generateIdentifierName($columnNames, $postfix='', $maxSize=30)
overrules(Index $other)
Definição Index.php:165
isFullfilledBy(Index $other)
Definição Index.php:131
static indexAlreadyExists($indexName, $table)
static columnAlreadyExists($tableName, $columnName)
static columnDoesNotExist($columnName, $table)
static indexDoesNotExist($indexName, $table)
static foreignKeyDoesNotExist($fkName, $table)
__construct($tableName, array $columns=array(), array $indexes=array(), array $fkConstraints=array(), $idGeneratorType=0, array $options=array())
Definição Table.php:83
getIndex($indexName)
Definição Table.php:541
hasIndex($indexName)
Definição Table.php:531
addColumn($columnName, $typeName, array $options=array())
Definição Table.php:229
getForeignKey($constraintName)
Definição Table.php:455
addForeignKeyConstraint($foreignTable, array $localColumnNames, array $foreignColumnNames, array $options=array())
Definição Table.php:293
changeColumn($columnName, array $options)
Definição Table.php:260
_addForeignKeyConstraint(ForeignKeyConstraint $constraint)
Definição Table.php:419
setPrimaryKey(array $columns, $indexName=false)
Definição Table.php:134
columnsAreIndexed(array $columnsNames)
Definição Table.php:185
visit(Visitor $visitor)
Definição Table.php:586
addIndex(array $columnNames, $indexName=null)
Definição Table.php:151
dropColumn($columnName)
Definição Table.php:273
_addIndex(Index $indexCandidate)
Definição Table.php:385
addUnnamedForeignKeyConstraint($foreignTable, array $localColumnNames, array $foreignColumnNames, array $options=array())
Definição Table.php:310
hasForeignKey($constraintName)
Definição Table.php:445
addOption($name, $value)
Definição Table.php:358
setSchemaConfig(SchemaConfig $schemaConfig)
Definição Table.php:110
hasColumn($columnName)
Definição Table.php:497
addNamedForeignKeyConstraint($name, $foreignTable, array $localColumnNames, array $foreignColumnNames, array $options=array())
Definição Table.php:325
getColumn($columnName)
Definição Table.php:509
renameColumn($oldColumnName, $newColumnName)
Definição Table.php:244
addUniqueIndex(array $columnNames, $indexName=null)
Definição Table.php:168
_addColumn(Column $column)
Definição Table.php:367
acceptIndex(Table $table, Index $index)
acceptColumn(Table $table, Column $column)
acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint)