Не удается вернуть значение null для ненулевого поля- rebing/graphql

#laravel #graphql

Вопрос:

У меня проблема с приложением GraphQL(rebing-graphql)/Larvel. Приложение отлично работает, когда я запрашиваю обычный запрос GraphQL(один не вложенный), но когда я запрашиваю вложенный, я сталкиваюсь "debugMessage":"Cannot return null for non-nullable field "Make Type.name" .

Обычный запрос, который отлично работает:

{model{id,name}}

Вложенный запрос, который я хочу выполнить:

{model{id,name,make_id{id,name}}

Где я допустил ошибку?

Заранее спасибо.

Сделать Модель

 <?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
use IlluminateSupportFacadesApp;

class Make extends Model
{
    use HasFactory;
    protected $fillable = [
        'name',
        'logo',
        'website',
    ];

    public function models()
    {
        return $this->hasMany(AppModelsModel::class);
    }
}
 

Модель Модель

 <?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel as MModel;

class Model extends MModel
{
    use HasFactory;
    protected $fillable = [
        'make_id',
        'name',
        'website',
    ];

    public function make()
    {
        return $this->belongsTo(Make::class);
    }
}
 

MakeQuery (часть Graphql)

 <?php

namespace AppGraphQLQueries;

use AppModelsMake;
use GraphQLTypeDefinitionType;
use RebingGraphQLSupportFacadesGraphQL;
use RebingGraphQLSupportQuery;

class MakeQuery extends Query
{
    protected $attributes = [
        'name' => 'Make Type',
        'description' => 'Fetch Make Query'
    ];

    public function args(): array
    {
        return ["id" => ['type' => Type::int()]];
    }

    public function type(): type
    {
        return Type::listOf(GraphQL::type('make'));        
    }

    public function resolve($root, $args)
    {
        if (isset($args['id'])) {
            return Make::where("id",$args['id'])->get();
        }
        return Make::all();

    }
}
 

MakeType

 <?php

namespace AppGraphQLTypes;

use AppModelsMake;
use RebingGraphQLSupportFacadesGraphQL;
use GraphQLTypeDefinitionType;
use RebingGraphQLSupportType as GraphQLType;

class MakeType extends GraphQLType
{
    protected $attributes = [
        'name' => 'Make Type',
        'description' => 'Make API Type',
        'model' => Make::class
    ];

    public function fields(): array
    {
        return [
            "id" => [
                'type' => Type::nonNull(Type::int()),
                'description' => 'Make ID'
            ],
            "name" => [
                'type' => Type::nonNull(Type::string()),
                'description' => 'Make ID'
            ],
            "logo" => [
                'type' => Type::nonNull(Type::string()),
                'description' => 'Make ID'
            ],
            "website" => [
                'type' => Type::nonNull(Type::string()),
                'description' => 'Make ID'
            ]
        ];
    }


}
 

ModelQuery

 <?php

namespace AppGraphQLQueries;

use AppModelsModel;
use GraphQLTypeDefinitionType;
use RebingGraphQLSupportFacadesGraphQL;
use RebingGraphQLSupportQuery;

class ModelQuery extends Query
{
    protected $attributes = [
        'name' => 'Model Type',
        'description' => 'Fetch Model Query'
    ];

    public function args(): array
    {
        return [
            "id" => ['type' => Type::int()]
        ];
    }

    public function type(): type
    {
        return Type::listOf(GraphQL::type('model'));
    }

    public function resolve($root, $args)
    {
        if (isset($args['id'])) {
            return Model::where("id", $args['id'])->get();
        }
        return Model::all();

    }
}
 

Тип модели

 <?php

namespace AppGraphQLTypes;

use AppModelsMake;
use AppModelsModel;
use RebingGraphQLSupportFacadesGraphQL;
use GraphQLTypeDefinitionType;
use RebingGraphQLSupportType as GraphQLType;

class ModelType extends GraphQLType
{
    protected $attributes = [
        'name' => 'Model Type',
        'description' => 'Model API Type',
        'model' => Model::class
    ];

    public function fields(): array
    {
        return [
            "id" => [
                'type' => Type::nonNull(Type::int()),
                'description' => 'Model ID'
            ],
            "make_id" => [
                'type' => GraphQL::type('make'),
                'description' => 'Model_ID'
            ],
            "name" => [
                'type' => Type::nonNull(Type::string()),
                'description' => 'Model Name'
            ],
            "website" => [
                'type' => Type::nonNull(Type::string()),
                'description' => 'Model website'
            ]
        ];
    }
}
 

Комментарии:

1. похоже, ваш источник данных не возвращает поле имени. Попробуйте зарегистрировать/распечатать результаты, прежде чем разрешать их с помощью

2. Я не разработчик PHP. Но я бы рекомендовал переименовать make_id с makeId помощью, а затем попробовать.

3. @Sodhisaab, спасибо за ваш комментарий. Я внес изменения, о которых вы упомянули, и теперь я понимаю {"data":{"model":[{"id":20,"name":"ABC","makeId":null}]}} . Для Make не было получено никаких данных

4. Итак, ваша ошибка graphql исчезла? Убедитесь, что вы правильно сопоставляете поля, поступающие из базы данных, с типами graphql.

5. return Make::all(); Я думаю, что здесь вы можете проверить свои данные!

Ответ №1:

Есть несколько вещей, которые вам нужно сделать, чтобы ваш код работал:

Во-первых: убедитесь, что ваши таблицы заполнены и имеют действительные отношения ключей.

Второе: В ModelType изменении make_id на makeId .

Третье: Перезагрузите автозапуск композитора с composer dump-autoload помощью .

Наконец: В вашем Model Model случае лучше определить столбец, как показано ниже:

 public function makeId()
    {
        return $this->belongsTo(Make::class, 'make_id', 'id');
    }
 

Я надеюсь, что эти шаги помогут вам.

Комментарии:

1. Это решит мою проблему, спасибо