/** * Unfortunately, SQLite does not support composite pks where one is AUTOINCREMENT, * so we have to flag both as NOT NULL and create a UNIQUE constraint. * * @param Table $table */ public function checkTable(Table $table) { if ($table->hasForeignKeys()) { foreach ($table->getForeignKeys() as $fk) { if (!$fk->getForeignTable()->isUnique($fk->getForeignColumnObjects())) { $unique = new Unique(); $unique->setColumns($fk->getForeignColumnObjects()); $fk->getForeignTable()->addUnique($unique); } } } if (count($pks = $table->getPrimaryKey()) > 1 && $table->hasAutoIncrementPrimaryKey()) { foreach ($pks as $pk) { //no pk can be NULL, as usual $pk->setNotNull(true); //in SQLite the column with the AUTOINCREMENT MUST be a primary key, too. if (!$pk->isAutoIncrement()) { //for all other sub keys we remove it, since we create a UNIQUE constraint over all primary keys. $pk->setPrimaryKey(false); } } //search if there is already a UNIQUE constraint over the primary keys $pkUniqueExist = false; foreach ($table->getUnices() as $unique) { $allPk = false; foreach ($unique->getColumns() as $columnName) { $allPk &= $table->getColumn($columnName)->isPrimaryKey(); } if ($allPk) { //there's already a unique constraint with the composite pk $pkUniqueExist = true; break; } } //there is none, let's create it if (!$pkUniqueExist) { $unique = new Unique(); foreach ($pks as $pk) { $unique->addColumn($pk); } $table->addUnique($unique); } } }
/** * Normalizes a table for the current platform. Very important for the TableComparator to not * generate useless diffs. * Useful for checking needed definitions/structures. E.g. Unique Indexes for ForeignKey columns, * which the most Platforms requires but which is not always explicitly defined in the table model. * * @param Table $table The table object which gets modified. */ public function normalizeTable(Table $table) { if ($table->hasForeignKeys()) { foreach ($table->getForeignKeys() as $fk) { if ($fk->getForeignTable() && !$fk->getForeignTable()->isUnique($fk->getForeignColumnObjects())) { $unique = new Unique(); $unique->setColumns($fk->getForeignColumnObjects()); $fk->getForeignTable()->addUnique($unique); } } } if (!$this->supportsIndexSize() && $table->getIndices()) { // when the plafform does not support index sizes we reset it foreach ($table->getIndices() as $index) { $index->resetColumnsSize(); } } foreach ($table->getColumns() as $column) { if ($column->getSize() && ($defaultSize = $this->getDefaultTypeSize($column->getType()))) { if (null === $column->getScale() && intval($column->getSize()) === $defaultSize) { $column->setSize(null); } } } }
/** * Normalizes a table for the current platform. Very important for the TableComparator to not * generate useless diffs. * Useful for checking needed definitions/structures. E.g. Unique Indexes for ForeignKey columns, * which the most Platforms requires but which is not always explicitly defined in the table model. * * @param Table $table The table object which gets modified. */ public function normalizeTable(Table $table) { if ($table->hasForeignKeys()) { foreach ($table->getForeignKeys() as $fk) { if (!$fk->getForeignTable()->isUnique($fk->getForeignColumnObjects())) { $unique = new Unique(); $unique->setColumns($fk->getForeignColumnObjects()); $fk->getForeignTable()->addUnique($unique); } } } }
$fkPostTag->setPhpName('Post'); $fkPostTag->setDefaultJoin('Criteria::LEFT_JOIN'); $fkPostTag->setOnDelete('CASCADE'); $fkTagPost = new ForeignKey('fk_tag_has_posts'); $fkTagPost->addReference('tag_id', 'id'); $fkTagPost->setForeignTableCommonName('blog_tag'); $fkTagPost->setPhpName('Tag'); $fkTagPost->setDefaultJoin('Criteria::LEFT_JOIN'); $fkTagPost->setOnDelete('CASCADE'); /* Regular Indexes */ $pageContentFulltextIdx = new Index('page_content_fulltext_idx'); $pageContentFulltextIdx->setColumns([['name' => 'content']]); $pageContentFulltextIdx->addVendorInfo(new VendorInfo('mysql', ['Index_type' => 'FULLTEXT'])); /* Unique Indexes */ $authorUsernameUnique = new Unique('author_password_unique_idx'); $authorUsernameUnique->setColumns([['name' => 'username', 'size' => '8']]); /* Behaviors */ $timestampableBehavior = new TimestampableBehavior(); $timestampableBehavior->setName('timestampable'); $sluggableBehavior = new SluggableBehavior(); $sluggableBehavior->setName('sluggable'); /* Tables */ $table1 = new Table('blog_post'); $table1->setDescription('The list of posts'); $table1->setNamespace('Blog'); $table1->setPackage('Acme.Blog'); $table1->addColumns([$column11, $column12, $column13, $column14, $column15, $column16, $column17]); $table1->addForeignKeys([$fkAuthorPost, $fkCategoryPost]); $table1->addBehavior($timestampableBehavior); $table1->addBehavior($sluggableBehavior); $table2 = new Table('blog_author');
/** * {@inheritDoc} */ public function getAddForeignKeysDDL(Table $table) { $ret = ''; foreach ($table->getForeignKeys() as $fk) { //PostgreSQL requires the keys of the foreignTable of a foreignKeys to be unique. //check if there is already a unique constraint with exactly //the keys of the FK, if not define it. if ($fk->getForeignTable() && !$fk->getForeignTable()->isUnique($fk->getForeignColumnObjects())) { $unique = new Unique(); $unique->setTable($fk->getForeignTable()); $unique->setColumns($fk->getForeignColumnObjects()); $ret .= $this->getAddIndexDDL($unique); } $ret .= $this->getAddForeignKeyDDL($fk); } return $ret; }