mghoneimy/php-graphql-client

Printing raw query for debugging

MarcoCazzaro opened this issue · 7 comments

Hi! Given a populated Query or QueryBuilder object, is it possible to print the raw query that generated the request?
E.G.:

$builder = (new QueryBuilder('pokemon'))
    ->setArgument('name', 'Pikachu')
    ->selectField('id')
    ->selectField('name')
    ->selectField(
        (new QueryBuilder('attacks'))
            ->selectField(
                (new QueryBuilder('special'))
                    ->selectField('name')
                    ->selectField('type')
                    ->selectField('damage')
            )
    )
    ->selectField(
        (new QueryBuilder('evolutions'))
            ->selectField('id')
            ->selectField('name')
            ->selectField('number')
            ->selectField(
                (new QueryBuilder('attacks'))
                    ->selectField(
                        (new QueryBuilder('fast'))
                            ->selectField('name')
                            ->selectField('type')
                            ->selectField('damage')
                    )
            )
    );
try {
    $results = $client->runQuery($builder);
}
catch (QueryError $exception) {

    var_dump($builder->getRawQuery()); // <<<< THIS

    print_r($exception->getErrorDetails());
    exit;
}

This would be very useful when something goes wrong and you need the raw query to test it on a GraphQL desktop client (Altair in my case).
Thanks!

I think you can achieve this easily with this command:

$builder->__toString();

I'm afraid that command will just print the graphical representation of the PHP class, not the GraphQL code we can use in an external tool.

No i tested this. it shows the current query generated by your builder. Just give it a try.

I got this error:

PHP Fatal error:  Uncaught Error: Call to undefined method GraphQL\QueryBuilder\QueryBuilder::__toString()

I see because you are using QueryBuilder. This is an example i'm using right now:

$gql = (new Query('page'))
                ->setArguments(['where' => new RawObject('{id: "'.$id.'"}')])
                ->setSelectionSet(
                    [
                        'title',
                        'publishedAt',
                        'updatedAt',
                        (new Query('content'))->setSelectionSet(['html']),
                        (new Query('seo'))
                            ->setSelectionSet(
                                [
                                    'title',
                                    'description',
                                    'noIndex',
                                    (new Query('image'))->setSelectionSet(['url'])
                                ]
                            )
                    ]
                );
dd($gql->__toString());

Yeah I am using QueryBuilder widely in my setup, so I'd need this feature for QueryBuilder as well. Of course it's a "nice to have". ;)

You could just get the query from the query builder? Like so?

catch (QueryError $exception) {

    var_dump((string) $builder->getQuery()); // ...or __toString like suggested. I like this way though

    print_r($exception->getErrorDetails());
    exit;
}