php-graphql-client icon indicating copy to clipboard operation
php-graphql-client copied to clipboard

Printing raw query for debugging

Open MarcoCazzaro opened this issue 2 years ago • 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!

MarcoCazzaro avatar Mar 29 '22 07:03 MarcoCazzaro

I think you can achieve this easily with this command:

$builder->__toString();

omarherri avatar Apr 12 '22 01:04 omarherri

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.

MarcoCazzaro avatar Apr 12 '22 06:04 MarcoCazzaro

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

omarherri avatar Apr 12 '22 13:04 omarherri

I got this error:

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

MarcoCazzaro avatar Apr 12 '22 15:04 MarcoCazzaro

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());

omarherri avatar Apr 13 '22 01:04 omarherri

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". ;)

MarcoCazzaro avatar Apr 15 '22 08:04 MarcoCazzaro

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;
}

eiriksm avatar Nov 05 '23 20:11 eiriksm