33namespace Nuwave \Lighthouse \Select ;
44
55use GraphQL \Language \AST \Node ;
6+ use GraphQL \Language \AST \UnionTypeDefinitionNode ;
67use Illuminate \Database \Eloquent \Model ;
78use Nuwave \Lighthouse \Schema \AST \ASTBuilder ;
89use Nuwave \Lighthouse \Schema \AST \ASTHelper ;
@@ -25,6 +26,10 @@ public static function getSelectColumns(Node $definitionNode, array $fieldSelect
2526
2627 $ type = $ documentAST ->types [$ returnTypeName ];
2728
29+ /*if ($type instanceof UnionTypeDefinitionNode) {
30+ $type = $documentAST->types[ASTHelper::getUnderlyingTypeName($type->types[0])];
31+ }*/
32+
2833 /** @var iterable<\GraphQL\Language\AST\FieldDefinitionNode> $fieldDefinitions */
2934 $ fieldDefinitions = $ type ->fields ;
3035
@@ -36,7 +41,31 @@ public static function getSelectColumns(Node $definitionNode, array $fieldSelect
3641 $ fieldDefinition = ASTHelper::firstByName ($ fieldDefinitions , $ field );
3742
3843 if ($ fieldDefinition ) {
39- $ name = $ fieldDefinition ->name ->value ;
44+ $ directivesRequiringLocalKey = ['hasOne ' , 'hasMany ' , 'count ' , 'morphOne ' , 'morphMany ' ];
45+ $ directivesRequiringForeignKey = ['belongsTo ' , 'belongsToMany ' , 'morphOne ' , 'morphMany ' , 'morphTo ' ];
46+ $ directivesRequiringKeys = array_merge ($ directivesRequiringLocalKey , $ directivesRequiringForeignKey );
47+
48+ foreach ($ directivesRequiringKeys as $ directiveType ) {
49+ if (ASTHelper::hasDirective ($ fieldDefinition , $ directiveType )) {
50+ $ directive = ASTHelper::directiveDefinition ($ fieldDefinition , $ directiveType );
51+
52+ if (in_array ($ directiveType , $ directivesRequiringLocalKey )) {
53+ $ relationName = ASTHelper::directiveArgValue ($ directive , 'relation ' , $ field );
54+ array_push ($ selectColumns , $ model ->{$ relationName }()->getLocalKeyName ());
55+ }
56+
57+ if (in_array ($ directiveType , $ directivesRequiringForeignKey )) {
58+ $ relationName = ASTHelper::directiveArgValue ($ directive , 'relation ' , $ field );
59+ array_push ($ selectColumns , $ model ->{$ relationName }()->getForeignKeyName ());
60+ }
61+
62+ if ($ directiveType === 'morphTo ' ) {
63+ array_push ($ selectColumns , $ model ->{$ relationName }()->getMorphType ());
64+ }
65+
66+ continue 2 ;
67+ }
68+ }
4069
4170 if (ASTHelper::hasDirective ($ fieldDefinition , 'select ' )) {
4271 // append selected columns in select directive to seletion
@@ -54,52 +83,9 @@ public static function getSelectColumns(Node $definitionNode, array $fieldSelect
5483 $ renamedAttribute = ASTHelper::directiveArgValue ($ directive , 'attribute ' );
5584 array_push ($ selectColumns , $ renamedAttribute );
5685 }
57- } elseif (ASTHelper::hasDirective ($ fieldDefinition , 'count ' )) {
58- // append relationship local key
59- $ directive = ASTHelper::directiveDefinition ($ fieldDefinition , 'count ' );
60-
61- if ($ directive ) {
62- $ relationName = ASTHelper::directiveArgValue ($ directive , 'relation ' , $ name );
63-
64- if ($ relationName ) {
65- array_push ($ selectColumns , $ model ->{$ relationName }()->getLocalKeyName ());
66- }
67- }
68- } elseif (ASTHelper::hasDirective ($ fieldDefinition , 'hasOne ' )) {
69- // append relationship local key
70- $ directive = ASTHelper::directiveDefinition ($ fieldDefinition , 'hasOne ' );
71-
72- if ($ directive ) {
73- $ relationName = ASTHelper::directiveArgValue ($ directive , 'relation ' , $ name );
74- array_push ($ selectColumns , $ model ->{$ relationName }()->getLocalKeyName ());
75- }
76- } elseif (ASTHelper::hasDirective ($ fieldDefinition , 'hasMany ' )) {
77- // append relationship local key
78- $ directive = ASTHelper::directiveDefinition ($ fieldDefinition , 'hasMany ' );
79-
80- if ($ directive ) {
81- $ relationName = ASTHelper::directiveArgValue ($ directive , 'relation ' , $ name );
82- array_push ($ selectColumns , $ model ->{$ relationName }()->getLocalKeyName ());
83- }
84- } elseif (ASTHelper::hasDirective ($ fieldDefinition , 'belongsTo ' )) {
85- // append relationship foreign key
86- $ directive = ASTHelper::directiveDefinition ($ fieldDefinition , 'belongsTo ' );
87-
88- if ($ directive ) {
89- $ relationName = ASTHelper::directiveArgValue ($ directive , 'relation ' , $ name );
90- array_push ($ selectColumns , $ model ->{$ relationName }()->getForeignKeyName ());
91- }
92- } elseif (ASTHelper::hasDirective ($ fieldDefinition , 'belongsToMany ' )) {
93- // append relationship foreign key
94- $ directive = ASTHelper::directiveDefinition ($ fieldDefinition , 'belongsToMany ' );
95-
96- if ($ directive ) {
97- $ relationName = ASTHelper::directiveArgValue ($ directive , 'relation ' , $ name );
98- array_push ($ selectColumns , $ model ->{$ relationName }()->getForeignKeyName ());
99- }
10086 } else {
10187 // fallback to selecting the field name
102- array_push ($ selectColumns , $ name );
88+ array_push ($ selectColumns , $ field );
10389 }
10490 }
10591 }
0 commit comments