/** * @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 string $targetEntity * @param FieldConfigId|null $targetFieldId * @param string[] $cascade */ protected function buildOneToManyRelation(ClassMetadataBuilder $metadataBuilder, FieldConfigId $fieldId, $targetEntity, FieldConfigId $targetFieldId = null, array $cascade = []) { $builder = $metadataBuilder->createOneToMany($fieldId->getFieldName(), $targetEntity); if ($targetFieldId) { $builder->mappedBy($targetFieldId->getFieldName()); } 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 testCreateOneToMany() { $this->assertIsFluent($this->builder->createOneToMany('groups', 'Doctrine\\Tests\\Models\\CMS\\CmsGroup')->mappedBy('test')->setOrderBy(array('test'))->setIndexBy('test')->build()); $this->assertEquals(array('groups' => array('fieldName' => 'groups', 'targetEntity' => 'Doctrine\\Tests\\Models\\CMS\\CmsGroup', 'mappedBy' => 'test', 'orderBy' => array(0 => 'test'), 'indexBy' => 'test', 'type' => 4, 'inversedBy' => NULL, 'isOwningSide' => false, 'sourceEntity' => 'Doctrine\\Tests\\Models\\CMS\\CmsUser', 'fetch' => 2, 'cascade' => array(), 'isCascadeRemove' => false, 'isCascadePersist' => false, 'isCascadeRefresh' => false, 'isCascadeMerge' => false, 'isCascadeDetach' => false, 'orphanRemoval' => false)), $this->cm->associationMappings); }
/** * @param ClassMetadataBuilder $metadataBuilder * @param FieldConfigId $fieldId * @param array $relation * @param string $relationKey */ protected function buildOneToManyRelation(ClassMetadataBuilder $metadataBuilder, FieldConfigId $fieldId, array $relation, $relationKey) { $targetEntity = $relation['target_entity']; $cascade = !empty($relation['cascade']) ? $relation['cascade'] : []; $cascade[] = 'detach'; $builder = $metadataBuilder->createOneToMany($fieldId->getFieldName(), $targetEntity); if (!empty($relation['target_field_id'])) { $builder->mappedBy($relation['target_field_id']->getFieldName()); } foreach ($cascade as $cascadeType) { $builder->{'cascade' . ucfirst($cascadeType)}(); } $builder->build(); if (!$relation['owner'] && RelationType::ONE_TO_MANY === ExtendHelper::getRelationType($relationKey) && $this->isDefaultRelationRequired($fieldId)) { $this->buildDefaultRelation($metadataBuilder, $fieldId, $targetEntity); } }