Skip to content

Commit 9c40677

Browse files
committed
Better relation and null handling
1 parent 42698d1 commit 9c40677

File tree

7 files changed

+38
-10
lines changed

7 files changed

+38
-10
lines changed

src/SchemaOrgModel/AnnotationGenerator/ConstraintAnnotationGenerator.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public function generateFieldAnnotations($className, $fieldName)
6161
}
6262
}
6363

64-
if (CardinalitiesExtractor::CARDINALITY_1_1 === $field['cardinality'] || CardinalitiesExtractor::CARDINALITY_1_N === $field['cardinality']) {
64+
if (!$field['isNullable']) {
6565
$asserts[] = '@Assert\NotNull';
6666
}
6767

src/SchemaOrgModel/AnnotationGenerator/DoctrineOrmAnnotationGenerator.php

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,14 +129,28 @@ public function generateFieldAnnotations($className, $fieldName)
129129

130130
case CardinalitiesExtractor::CARDINALITY_UNKNOWN:
131131
// No break
132-
case CardinalitiesExtractor::CARDINALITY_0_N:
132+
case CardinalitiesExtractor::CARDINALITY_N_0:
133133
$annotations[] = sprintf('@ORM\ManyToOne(targetEntity="%s")', $this->getRelationName($field['range']));
134134
break;
135135

136-
case CardinalitiesExtractor::CARDINALITY_1_N:
136+
case CardinalitiesExtractor::CARDINALITY_N_1:
137137
$annotations[] = sprintf('@ORM\ManyToOne(targetEntity="%s")', $this->getRelationName($field['range']));
138138
$annotations[] = '@ORM\JoinColumn(nullable=false)';
139139
break;
140+
141+
case CardinalitiesExtractor::CARDINALITY_0_N:
142+
$annotations[] = sprintf('@ORM\ManyToMany(targetEntity="%s")', $this->getRelationName($field['range']));
143+
$annotations[] = '@ORM\JoinTable(inverseJoinColumns={@ORM\JoinColumn(unique=true)})';
144+
break;
145+
146+
case CardinalitiesExtractor::CARDINALITY_1_N:
147+
$annotations[] = sprintf('@ORM\ManyToMany(targetEntity="%s")', $this->getRelationName($field['range']));
148+
$annotations[] = '@ORM\JoinTable(inverseJoinColumns={@ORM\JoinColumn(nullable=false, unique=true)})';
149+
break;
150+
151+
case CardinalitiesExtractor::CARDINALITY_N_N:
152+
$annotations[] = sprintf('@ORM\ManyToMany(targetEntity="%s")', $this->getRelationName($field['range']));
153+
break;
140154
}
141155
}
142156

src/SchemaOrgModel/AnnotationGenerator/PhpDocAnnotationGenerator.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public function generateSetterAnnotations($className, $fieldName)
9494
$this->toPhpType($this->classes[$className]['fields'][$fieldName]),
9595
$fieldName
9696
),
97+
'',
9798
'@return $this',
9899
];
99100
}
@@ -111,6 +112,7 @@ public function generateAdderAnnotations($className, $fieldName)
111112
$this->toPhpType($this->classes[$className]['fields'][$fieldName], true),
112113
$fieldName
113114
),
115+
'',
114116
'@return $this',
115117
];
116118
}
@@ -128,6 +130,7 @@ public function generateRemoverAnnotations($className, $fieldName)
128130
$this->toPhpType($this->classes[$className]['fields'][$fieldName], true),
129131
$fieldName
130132
),
133+
'',
131134
'@return $this',
132135
];
133136
}

src/SchemaOrgModel/CardinalitiesExtractor.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ class CardinalitiesExtractor
2020
const CARDINALITY_0_N = '(0..*)';
2121
const CARDINALITY_1_1 = '(1..1)';
2222
const CARDINALITY_1_N = '(1..*)';
23+
const CARDINALITY_N_0 = '(*..0)';
24+
const CARDINALITY_N_1 = '(*..1)';
25+
const CARDINALITY_N_N = '(*..*)';
2326
const CARDINALITY_UNKNOWN = 'unknown';
2427

2528
/**

src/SchemaOrgModel/TypesGenerator.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -246,13 +246,12 @@ public function generate($config)
246246
}
247247

248248
$isArray = in_array($cardinality, [
249-
CardinalitiesExtractor::CARDINALITY_0_N,
250249
CardinalitiesExtractor::CARDINALITY_1_N,
250+
CardinalitiesExtractor::CARDINALITY_N_N,
251251
]);
252-
$isNullable = in_array($cardinality, [
253-
CardinalitiesExtractor::CARDINALITY_0_1,
254-
CardinalitiesExtractor::CARDINALITY_0_N,
255-
CardinalitiesExtractor::CARDINALITY_UNKNOWN,
252+
$isNullable = !in_array($cardinality, [
253+
CardinalitiesExtractor::CARDINALITY_1_1,
254+
CardinalitiesExtractor::CARDINALITY_1_N,
256255
]);
257256

258257
$class['fields'][$property->localName()] = [

src/SchemaOrgModel/TypesGeneratorConfiguration.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,16 @@ public function getConfigTreeBuilder()
9797
->addDefaultsIfNotSet()
9898
->children()
9999
->scalarNode('range')->defaultNull()->info('The property range')->example('Offer')->end()
100-
->enumNode('cardinality')->defaultValue(CardinalitiesExtractor::CARDINALITY_UNKNOWN)->values([CardinalitiesExtractor::CARDINALITY_0_1, CardinalitiesExtractor::CARDINALITY_0_N, CardinalitiesExtractor::CARDINALITY_1_1, CardinalitiesExtractor::CARDINALITY_1_N, CardinalitiesExtractor::CARDINALITY_UNKNOWN])->end()
100+
->enumNode('cardinality')->defaultValue(CardinalitiesExtractor::CARDINALITY_UNKNOWN)->values([
101+
CardinalitiesExtractor::CARDINALITY_0_1,
102+
CardinalitiesExtractor::CARDINALITY_0_N,
103+
CardinalitiesExtractor::CARDINALITY_1_1,
104+
CardinalitiesExtractor::CARDINALITY_1_N,
105+
CardinalitiesExtractor::CARDINALITY_N_0,
106+
CardinalitiesExtractor::CARDINALITY_N_1,
107+
CardinalitiesExtractor::CARDINALITY_N_N,
108+
CardinalitiesExtractor::CARDINALITY_UNKNOWN
109+
])->end()
101110
->end()
102111
->end()
103112
->end()

templates/class.php.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ use {{ use }};
8989
* {{ annotation }}
9090
{% endfor %}
9191
*/
92-
public function set{{ field.name|ucfirst }}({% if field.typeHint %}{{ field.typeHint }} {% endif %}${{ field.name }})
92+
public function set{{ field.name|ucfirst }}({% if field.typeHint %}{{ field.typeHint }} {% endif %}${{ field.name }}{% if field.typeHint and field.isNullable %} = null{% endif %})
9393
{
9494
$this->{{ field.name }} = ${{ field.name }};
9595

0 commit comments

Comments
 (0)