#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. Это решит мою проблему, спасибо