Skip to content

Commit f8b749e

Browse files
committed
Update
1 parent 326b6ab commit f8b749e

File tree

4 files changed

+51
-53
lines changed

4 files changed

+51
-53
lines changed

src/Pagination/PaginateDirective.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,13 @@ function ($root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo)
105105
);
106106

107107
if (config('lighthouse.optimized_selects')) {
108-
$fieldSelection = array_keys($resolveInfo->getFieldSelection(2)['data']);
109-
$selectColumns = SelectHelper::getSelectColumns($this->definitionNode, $fieldSelection, $this->getModelClass());
110-
$query = $query->select($selectColumns);
108+
$fieldSelection = $resolveInfo->getFieldSelection(4);
109+
110+
if (in_array('data', $fieldSelection) || in_array('edges', $fieldSelection)) {
111+
$fieldSelection = array_keys(in_array($fieldSelection, 'data') ? $fieldSelection['data'] : $fieldSelection['edges']['node']);
112+
$selectColumns = SelectHelper::getSelectColumns($this->definitionNode, $fieldSelection, $this->getModelClass());
113+
$query = $query->select($selectColumns);
114+
}
111115
}
112116

113117
return PaginationArgs

src/Schema/Directives/RelationDirective.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Nuwave\Lighthouse\Select\SelectHelper;
2020
use Nuwave\Lighthouse\Support\Contracts\FieldResolver;
2121
use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;
22+
use Illuminate\Support\Facades\DB;
2223

2324
abstract class RelationDirective extends BaseDirective implements FieldResolver
2425
{
@@ -81,17 +82,19 @@ protected function makeBuilderDecorator(ResolveInfo $resolveInfo, Model $parent,
8182
$this->directiveArgValue('scopes', [])
8283
);
8384

84-
if (config('lighthouse.optimized_selects')) {
85+
$builderDecorator->select(['*', DB::raw('"abc"')]);
86+
87+
/*if (config('lighthouse.optimized_selects')) {
8588
$fieldSelection = array_keys($resolveInfo->getFieldSelection(1));
86-
$selectColumns = SelectHelper::getSelectColumns($this->definitionNode, $fieldSelection, $this->getModelClass());
89+
$selectColumns = SelectHelper::getSelectColumns($this->definitionNode, $fieldSelection, get_class($builderDecorator->getRelated()));
8790
$foreignKeyName = $parent->{$relationName}()->getForeignKeyName();
8891
8992
if (! in_array($foreignKeyName, $selectColumns)) {
9093
array_push($selectColumns, $foreignKeyName);
9194
}
9295
9396
$builderDecorator->select($selectColumns);
94-
}
97+
}*/
9598
};
9699
}
97100

src/Select/SelectHelper.php

Lines changed: 31 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Nuwave\Lighthouse\Select;
44

55
use GraphQL\Language\AST\Node;
6+
use GraphQL\Language\AST\UnionTypeDefinitionNode;
67
use Illuminate\Database\Eloquent\Model;
78
use Nuwave\Lighthouse\Schema\AST\ASTBuilder;
89
use 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
}

tests/DBTestCase.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Tests;
44

55
use Illuminate\Support\Facades\DB;
6+
use Illuminate\Support\Facades\Event;
67

78
abstract class DBTestCase extends TestCase
89
{
@@ -39,13 +40,17 @@ protected function getEnvironmentSetUp($app): void
3940
{
4041
parent::getEnvironmentSetUp($app);
4142

43+
Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
44+
error_log($query->sql . ' - ' . serialize($query->bindings));
45+
});
46+
4247
$app['config']->set('database.default', 'mysql');
4348
$app['config']->set('database.connections.mysql', [
4449
'driver' => 'mysql',
4550
'database' => env('LIGHTHOUSE_TEST_DB_DATABASE', 'test'),
46-
'host' => env('LIGHTHOUSE_TEST_DB_HOST', 'mysql'),
51+
'host' => env('LIGHTHOUSE_TEST_DB_HOST', 'localhost'),
4752
'username' => env('LIGHTHOUSE_TEST_DB_USERNAME', 'root'),
48-
'password' => env('LIGHTHOUSE_TEST_DB_PASSWORD', ''),
53+
'password' => env('LIGHTHOUSE_TEST_DB_PASSWORD', 'U1eky8aXNdI68DoB'),
4954
]);
5055
}
5156
}

0 commit comments

Comments
 (0)