public function test_defaults_will_be_remembered_for_many_to_many() { $manyToMany = $this->builder->createManyToMany('otherManyToMany', StubEntity::class); $manyToMany->setJoinTable('default_join_table'); $manyToMany->build(); $this->assertEquals('default_join_table', $this->builder->getClassMetadata()->getAssociationMapping('otherManyToMany')['joinTable']['name']); $override = $this->override('otherManyToMany', function (ManyToMany $relation) { return $relation; }); $override->build(); $this->assertEquals('default_join_table', $this->builder->getClassMetadata()->getAssociationMapping('otherManyToMany')['joinTable']['name']); }
/** * @param ClassMetadataBuilder $metadataBuilder * @param FieldConfigId $fieldId * @param string $targetEntity * @param FieldConfigId|null $targetFieldId * @param string[] $cascade */ protected function buildManyToManyOwningSideRelation(ClassMetadataBuilder $metadataBuilder, FieldConfigId $fieldId, $targetEntity, FieldConfigId $targetFieldId = null, array $cascade = []) { $builder = $metadataBuilder->createManyToMany($fieldId->getFieldName(), $targetEntity); if ($targetFieldId) { $builder->inversedBy($targetFieldId->getFieldName()); } $builder->setJoinTable($this->nameGenerator->generateManyToManyJoinTableName($fieldId->getClassName(), $fieldId->getFieldName(), $targetEntity)); foreach ($cascade as $cascadeType) { $builder->{'cascade' . ucfirst($cascadeType)}(); } $builder->build(); $extendFieldConfig = $this->extendConfigProvider->getConfigById($fieldId); if (!$extendFieldConfig->is('without_default')) { $this->buildDefaultRelation($metadataBuilder, $fieldId, $targetEntity); } }
public function testCreateManyToMany() { $this->assertIsFluent($this->builder->createManyToMany('groups', 'Doctrine\\Tests\\Models\\CMS\\CmsGroup')->setJoinTable('groups_users')->addJoinColumn('group_id', 'id', true, false, 'CASCADE')->addInverseJoinColumn('user_id', 'id')->cascadeAll()->fetchExtraLazy()->build()); $this->assertEquals(array('groups' => array('fieldName' => 'groups', 'targetEntity' => 'Doctrine\\Tests\\Models\\CMS\\CmsGroup', 'cascade' => array(0 => 'remove', 1 => 'persist', 2 => 'refresh', 3 => 'merge', 4 => 'detach'), 'fetch' => 4, 'joinTable' => array('joinColumns' => array(0 => array('name' => 'group_id', 'referencedColumnName' => 'id', 'nullable' => true, 'unique' => false, 'onDelete' => 'CASCADE', 'columnDefinition' => NULL)), 'inverseJoinColumns' => array(0 => array('name' => 'user_id', 'referencedColumnName' => 'id', 'nullable' => true, 'unique' => false, 'onDelete' => NULL, 'columnDefinition' => NULL)), 'name' => 'groups_users'), 'type' => 8, 'mappedBy' => NULL, 'inversedBy' => NULL, 'isOwningSide' => true, 'sourceEntity' => 'Doctrine\\Tests\\Models\\CMS\\CmsUser', 'isCascadeRemove' => true, 'isCascadePersist' => true, 'isCascadeRefresh' => true, 'isCascadeMerge' => true, 'isCascadeDetach' => true, 'isOnDeleteCascade' => true, 'relationToSourceKeyColumns' => array('group_id' => 'id'), 'joinTableColumns' => array(0 => 'group_id', 1 => 'user_id'), 'relationToTargetKeyColumns' => array('user_id' => 'id'), 'orphanRemoval' => false)), $this->cm->associationMappings); }
/** * @param ConfigInterface $config * @param ClassMetadataBuilder $cmBuilder */ protected function prepareRelations(ConfigInterface $config, ClassMetadataBuilder $cmBuilder) { if ($config->is('relation')) { foreach ($config->get('relation') as $relation) { /** @var FieldConfigId $fieldId */ if ($relation['assign'] && ($fieldId = $relation['field_id'])) { /** @var FieldConfigId $targetFieldId */ $targetFieldId = $relation['target_field_id']; $targetFieldName = $targetFieldId ? ExtendConfigDumper::FIELD_PREFIX . $targetFieldId->getFieldName() : null; $fieldName = ExtendConfigDumper::FIELD_PREFIX . $fieldId->getFieldName(); $defaultName = ExtendConfigDumper::DEFAULT_PREFIX . $fieldId->getFieldName(); switch ($fieldId->getFieldType()) { case 'manyToOne': $builder = $cmBuilder->createManyToOne($fieldName, $relation['target_entity']); if ($targetFieldName) { $builder->inversedBy($targetFieldName); } $builder->addJoinColumn($fieldName . '_id', 'id', true, false, 'SET NULL'); $builder->cascadeDetach(); $builder->build(); break; case 'oneToMany': /** create 1:* */ $builder = $cmBuilder->createOneToMany($fieldName, $relation['target_entity']); $builder->mappedBy($targetFieldName); $builder->cascadeDetach(); $builder->build(); /** create 1:1 default */ $builder = $cmBuilder->createOneToOne($defaultName, $relation['target_entity']); $builder->addJoinColumn($defaultName . '_id', 'id', true, false, 'SET NULL'); $builder->build(); break; case 'manyToMany': if ($relation['owner']) { $builder = $cmBuilder->createManyToMany($fieldName, $relation['target_entity']); if ($targetFieldName) { $builder->inversedBy($targetFieldName); } $builder->setJoinTable(ExtendHelper::generateManyToManyJoinTableName($fieldId, $relation['target_entity'])); $builder->build(); $builder = $cmBuilder->createOneToOne($defaultName, $relation['target_entity']); $builder->addJoinColumn($defaultName . '_id', 'id', true, false, 'SET NULL'); $builder->build(); } else { $cmBuilder->addInverseManyToMany($fieldName, $relation['target_entity'], $targetFieldName); } break; } } } } }
/** * @param ClassMetadataBuilder $metadataBuilder * @param FieldConfigId $fieldId * @param array $relation */ protected function buildManyToManyOwningSideRelation(ClassMetadataBuilder $metadataBuilder, FieldConfigId $fieldId, array $relation) { $targetEntity = $relation['target_entity']; $cascade = !empty($relation['cascade']) ? $relation['cascade'] : []; $builder = $metadataBuilder->createManyToMany($fieldId->getFieldName(), $targetEntity); if (!empty($relation['target_field_id'])) { $builder->inversedBy($relation['target_field_id']->getFieldName()); } $builder->setJoinTable($this->nameGenerator->generateManyToManyJoinTableName($fieldId->getClassName(), $fieldId->getFieldName(), $targetEntity)); foreach ($cascade as $cascadeType) { $builder->{'cascade' . ucfirst($cascadeType)}(); } $builder->build(); }