/**
  * @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;
                 }
             }
         }
     }
 }
Ejemplo n.º 2
0
 /**
  * @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);
 }
Ejemplo n.º 4
0
 /**
  * @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);
     }
 }