/** * Adds many-to-many relation * * @param Schema $schema * @param Table|string $table A Table object or table name * @param string $associationName The name of a relation field * @param Table|string $targetTable A Table object or table name * @param string[] $targetTitleColumnNames Column names are used to show a title of related entity * @param string[] $targetDetailedColumnNames Column names are used to show detailed info about related entity * @param string[] $targetGridColumnNames Column names are used to show related entity in a grid * @param array $options * @param string $fieldType The field type. By default the field type is manyToMany, * but you can specify another type if it is based on manyToMany. * In this case this type should be registered * in entity_extend.yml under underlying_types section */ public function addManyToManyRelation(Schema $schema, $table, $associationName, $targetTable, array $targetTitleColumnNames, array $targetDetailedColumnNames, array $targetGridColumnNames, array $options = [], $fieldType = RelationType::MANY_TO_MANY) { $this->ensureExtendFieldSet($options); $selfTableName = $this->getTableName($table); $selfTable = $this->getTable($table, $schema); $targetTableName = $this->getTableName($targetTable); $targetTable = $this->getTable($targetTable, $schema); $this->checkColumnsExist($targetTable, $targetTitleColumnNames); $this->checkColumnsExist($targetTable, $targetDetailedColumnNames); $this->checkColumnsExist($targetTable, $targetGridColumnNames); if (!isset($options['extend']['without_default']) || !$options['extend']['without_default']) { $this->addDefaultRelation($selfTable, $associationName, $targetTable); } $selfClassName = $this->getEntityClassByTableName($selfTableName); $targetClassName = $this->getEntityClassByTableName($targetTableName); $joinTableName = $this->nameGenerator->generateManyToManyJoinTableName($selfClassName, $associationName, $targetClassName); $joinTable = $schema->createTable($joinTableName); $selfJoinTableColumnName = $this->nameGenerator->generateManyToManyJoinTableColumnName($selfClassName); $targetJoinTableColumnName = $this->nameGenerator->generateManyToManyJoinTableColumnName($targetClassName); $this->addRelation($joinTable, $selfJoinTableColumnName, $selfTable, [], ['onDelete' => 'CASCADE']); $this->addRelation($joinTable, $targetJoinTableColumnName, $targetTable, [], ['onDelete' => 'CASCADE']); $joinTable->setPrimaryKey([$selfJoinTableColumnName, $targetJoinTableColumnName]); $options[ExtendOptionsManager::TARGET_OPTION] = ['table_name' => $targetTableName, 'columns' => ['title' => $targetTitleColumnNames, 'detailed' => $targetDetailedColumnNames, 'grid' => $targetGridColumnNames]]; $options[ExtendOptionsManager::TYPE_OPTION] = $fieldType; $this->extendOptionsManager->setColumnOptions($selfTableName, $associationName, $options); }