14
14
namespace ApiPlatform \Bridge \Doctrine \Orm \State ;
15
15
16
16
use ApiPlatform \Core \Bridge \Doctrine \Orm \Util \QueryNameGenerator ;
17
- use ApiPlatform \Exception \RuntimeException ;
18
17
use ApiPlatform \Metadata \GraphQl \Operation as GraphQlOperation ;
19
18
use ApiPlatform \Metadata \Link ;
20
19
use Doctrine \ORM \QueryBuilder ;
@@ -33,62 +32,93 @@ private function handleLinks(QueryBuilder $queryBuilder, array $identifiers, Que
33
32
34
33
if ($ linkClass = $ context ['linkClass ' ] ?? false ) {
35
34
foreach ($ links as $ link ) {
36
- if ($ linkClass === $ link ->getFromClass ()) {
35
+ if ($ linkClass === $ link ->getTargetClass ()) {
37
36
foreach ($ identifiers as $ identifier => $ value ) {
38
37
$ this ->applyLink ($ queryBuilder , $ queryNameGenerator , $ doctrineClassMetadata , $ alias , $ link , $ identifier , $ value );
39
38
}
40
39
41
40
return ;
42
41
}
43
42
}
43
+ }
44
44
45
- $ operation = $ this ->resourceMetadataCollectionFactory ->create ($ linkClass )->getOperation ($ operationName );
46
- $ links = $ operation instanceof GraphQlOperation ? $ operation ->getLinks () : $ operation ->getUriVariables ();
47
- foreach ($ links as $ link ) {
48
- if ($ resourceClass === $ link ->getFromClass ()) {
49
- $ link = $ link ->withFromProperty ($ link ->getToProperty ())->withFromClass ($ linkClass );
50
- foreach ($ identifiers as $ identifier => $ value ) {
51
- $ this ->applyLink ($ queryBuilder , $ queryNameGenerator , $ doctrineClassMetadata , $ alias , $ link , $ identifier , $ value );
52
- }
45
+ if (null === $ links ) {
46
+ return ;
47
+ }
53
48
54
- return ;
55
- }
49
+ dd ($ links )
50
+ dump ($ operation ->getUriTemplate ());
51
+ $ aliases = [];
52
+ $ previousContext = [];
53
+ $ conditions = [];
54
+ foreach ($ links as $ parameterName => $ link ) {
55
+ $ identifier = $ link ->getIdentifiers ()[0 ];
56
+ if (!isset ($ aliases [$ link ->getTargetClass ()])) {
57
+ $ aliases [$ link ->getTargetClass ()] = $ link ->getTargetClass () === $ operation ->getClass () ? $ alias : $ queryNameGenerator ->generateJoinAlias ($ alias );
56
58
}
57
59
58
- throw new RuntimeException (sprintf ('The class "%s" cannot be retrieved from "%s". ' , $ resourceClass , $ linkClass ));
59
- }
60
+ $ currentAlias = $ aliases [$ link ->getTargetClass ()];
61
+ $ placeholder = $ queryNameGenerator ->generateParameterName ($ parameterName );
62
+ // inverse == prop de la targetClass
63
+ if (!$ link ->getInverseProperty () && !$ link ->getProperty () && !$ link ->getExpandedValue ()) {
64
+ $ conditions [] = $ aliases [$ link ->getTargetClass ()] . ". $ identifier = : $ placeholder " ;
65
+ $ previousContext = ['alias ' => $ currentAlias , 'identifier ' => $ identifier ];
66
+ continue ;
67
+ }
60
68
61
- if (!$ links ) {
62
- return ;
63
- }
64
69
65
- foreach ($ identifiers as $ identifier => $ value ) {
66
- $ link = $ links [$ identifier ] ?? $ links ['id ' ];
70
+ if ($ inverseProperty = $ link ->getInverseProperty ()) {
71
+ $ joinAlias = $ queryNameGenerator ->generateJoinAlias ($ alias );
72
+ $ inverseAlias = $ queryNameGenerator ->generateJoinAlias ($ alias );
73
+ $ conditions [] = "{$ previousContext ['alias ' ]}. {$ previousContext ['identifier ' ]} IN (SELECT $ inverseAlias. $ identifier FROM {$ link ->getTargetClass ()} $ joinAlias JOIN $ joinAlias. $ inverseProperty $ inverseAlias WHERE $ joinAlias. $ identifier = $ placeholder) " ;
74
+ $ previousContext = ['alias ' => $ currentAlias , 'identifier ' => $ identifier ];
75
+ continue ;
76
+ }
77
+
78
+ dump ($ conditions );
79
+ dd ($ link );
80
+ // dd($link);
81
+ // if ($link->getExpandedValue()) {
82
+ // dd($queryBuilder->getDQL());
83
+ // dd('test');
84
+ // continue;
85
+ // }
67
86
68
- $ this ->applyLink ($ queryBuilder , $ queryNameGenerator , $ doctrineClassMetadata , $ alias , $ link , $ identifier , $ value );
87
+ // $this->applyLink($queryBuilder, $queryNameGenerator, $doctrineClassMetadata, $alias, $link, $identifiers[$parameterName] ?? null );
69
88
}
70
89
}
71
90
72
- private function applyLink (QueryBuilder $ queryBuilder , QueryNameGenerator $ queryNameGenerator , ClassMetadata $ doctrineClassMetadata , string $ alias , Link $ link , string $ identifier , $ value )
91
+ private function applyLink (QueryBuilder $ queryBuilder , QueryNameGenerator $ queryNameGenerator , ClassMetadata $ doctrineClassMetadata , string $ alias , Link $ link , $ value = null )
73
92
{
74
- $ placeholder = ':id_ ' .$ identifier ;
75
- if ($ fromProperty = $ link ->getFromProperty ()) {
76
- $ propertyIdentifier = $ link ->getIdentifiers ()[0 ];
77
- $ joinAlias = $ queryNameGenerator ->generateJoinAlias ($ fromProperty );
78
-
79
- $ queryBuilder ->join (
80
- $ link ->getFromClass (),
81
- $ joinAlias ,
82
- 'with ' ,
83
- "$ alias. $ propertyIdentifier = $ joinAlias. $ fromProperty "
84
- );
85
-
86
- $ expression = $ queryBuilder ->expr ()->eq (
87
- "{$ joinAlias }. {$ propertyIdentifier }" ,
88
- $ placeholder
89
- );
90
- } elseif ($ property = $ link ->getToProperty ()) {
91
- $ propertyIdentifier = $ link ->getIdentifiers ()[0 ];
93
+ $ propertyIdentifier = $ link ->getIdentifiers ()[0 ];
94
+ $ placeholder = ': ' . $ queryNameGenerator ->generateParameterName ($ propertyIdentifier );
95
+ if ($ inverseProperty = $ link ->getInverseProperty ()) {
96
+ $ joinAlias = $ queryNameGenerator ->generateJoinAlias ($ alias );
97
+ $ inverseAlias = $ queryNameGenerator ->generateJoinAlias ($ alias );
98
+
99
+ // SELECT o FROM ApiPlatform\Tests\Fixtures\TestBundle\Entity\ThirdLevel o
100
+ // WHERE o.id IN (
101
+ // SELECT o_a3.id FROM
102
+ // ApiPlatform\Tests\Fixtures\TestBundle\Entity\Dummy o_a1
103
+ // JOIN o_a1.relatedDummies o_a2
104
+ // JOIN o_a2.thirdLevel o_a3
105
+ // WHERE o_a1.id = :id_id
106
+ // ) AND o.id = :id_id
107
+
108
+ // $queryBuilder->join(
109
+ // $link->getTargetClass(),
110
+ // $joinAlias,
111
+ // 'with',
112
+ // "$alias.$propertyIdentifier = $joinAlias.$inverseProperty"
113
+ // );
114
+
115
+ $ expression = "$ alias. $ propertyIdentifier IN (SELECT $ inverseAlias. $ propertyIdentifier FROM {$ link ->getTargetClass ()} $ joinAlias JOIN $ joinAlias. $ inverseProperty $ inverseAlias WHERE $ joinAlias. $ propertyIdentifier = $ placeholder) " ;
116
+
117
+ // $expression = $queryBuilder->expr()->eq(
118
+ // "{$joinAlias}.{$propertyIdentifier}",
119
+ // $placeholder
120
+ // );
121
+ } elseif ($ property = $ link ->getProperty ()) {
92
122
$ joinAlias = $ queryNameGenerator ->generateJoinAlias ($ property );
93
123
94
124
$ queryBuilder ->join (
@@ -102,10 +132,11 @@ private function applyLink(QueryBuilder $queryBuilder, QueryNameGenerator $query
102
132
);
103
133
} else {
104
134
$ expression = $ queryBuilder ->expr ()->eq (
105
- "{$ alias }. {$ identifier }" , $ placeholder
135
+ "{$ alias }. {$ propertyIdentifier }" , $ placeholder
106
136
);
107
137
}
138
+
108
139
$ queryBuilder ->andWhere ($ expression );
109
- $ queryBuilder ->setParameter ($ placeholder , $ value , $ doctrineClassMetadata ->getTypeOfField ($ identifier ));
140
+ $ queryBuilder ->setParameter ($ placeholder , $ value , $ doctrineClassMetadata ->getTypeOfField ($ propertyIdentifier ));
110
141
}
111
142
}
0 commit comments