Маяк Nested Mutations FK Поле не заполняется - PullRequest
0 голосов
/ 12 апреля 2020

У меня возникли некоторые проблемы, связанные с вложением мутаций в Lighthouse.

У меня есть две связанные модели: Ams\Account hasMany Ams\Contact. Это модель Ams\Contact:

namespace App\Models\Ams;

use Eloquent as Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Contact extends Model
{
    use SoftDeletes;

    public $table = 'ams_contacts';

    protected $dates = ['deleted_at'];

    public $fillable = [
        'ams_account_id',
        'forename',
        'surname',
        'active',
        'email'
    ];

    protected $casts = [
        'forename' => 'string',
        'surname' => 'string',
        'active' => 'boolean',
        'email' => 'string'
    ];

    public static $rules = [
        'ams_account_id' => 'required',
        'forename' => 'required',
        'surname' => 'required',
        'email' => 'required|email'
    ];

    public function amsAccount(): BelongsTo
    {
        return $this->belongsTo(\App\Models\Ams\Account::class, 'ams_account_id', 'id');
    }

}

Мой файл схемы GraphQL выглядит следующим образом:

"A datetime string with format `Y-m-d H:i:s`, e.g. `2018-01-01 13:00:00`."
scalar DateTime @scalar(class: "Nuwave\\Lighthouse\\Schema\\Types\\Scalars\\DateTime")

"A date string with format `Y-m-d`, e.g. `2011-05-23`."
scalar Date @scalar(class: "Nuwave\\Lighthouse\\Schema\\Types\\Scalars\\Date")

type Query {
    amsAccounts: [AmsAccount!]! @paginate(defaultCount: 10 model: "App\\Models\\Ams\\Account")
    amsAccount(id: ID @globalId): AmsAccount @find(model: "App\\Models\\Ams\\Account")

    amsContacts: [AmsContact!]! @paginate(defaultCount: 10 model: "App\\Models\\Ams\\Contact")
    amsContact(id: ID @globalId): AmsContact @find(model: "App\\Models\\Ams\\Contact")
}

type Mutation {
    createAmsAccount(
        input: CreateAmsAccountInput! @spread
    ): AmsAccount @create(model: "App\\Models\\Ams\\Account")

    updateAmsAccount(
        input: UpdateAmsAccountInput! @spread
    ): AmsAccount @update(model: "App\\Models\\Ams\\Account")

    deleteAmsAccount(
        id: ID! @rules(apply: ["required"])
    ): AmsAccount @delete(model: "App\\Models\\Ams\\Account")

    createAmsContact(
        input: CreateAmsContactInput! @spread
    ): AmsContact @create(model: "App\\Models\\Ams\\Contact")

    updateAmsContact(
        input: UpdateAmsContactInput! @spread
    ): AmsContact @update(model: "App\\Models\\Ams\\Contact")

    deleteAmsContact(
        id: ID! @rules(apply: ["required"])
    ): AmsContact @delete(model: "App\\Models\\Ams\\Contact")
}

type AmsAccount @node(namespace: "App\\Models\\Ams\\Account") {
    id: ID! @globalId
    name: String!
    url: String
    telephone: String!
    created_at: DateTime!
    updated_at: DateTime!
}

input CreateAmsAccountInput {
    name: String!
    url: String
    telephone: String!
}

input UpdateAmsAccountInput {
    id: ID!
    name: String!
    url: String
    telephone: String!
}

input UpsertAmsAccountInput {
    id: ID!
    name: String!
    url: String
    telephone: String!
}

type AmsContact @node(namespace: "App\\Models\\Ams\\Contact") {
    id: ID! @globalId
    forename: String!
    surname: String!
    active: Boolean
    email: String!
    amsAccount: AmsAccount! @belongsTo
    created_at: DateTime!
    updated_at: DateTime!
}

input CreateAmsContactInput {
    forename: String!
    surname: String!
    active: Boolean
    email: String!
    amsAccount: CreateAmsAccountBelongsTo
}

input UpdateAmsContactInput {
    id: ID!
    forename: String!
    surname: String!
    active: Boolean
    email: String!
    amsAccount: UpdateAmsAccountBelongsTo
}

input UpsertAmsContactInput {
    id: ID!
    forename: String!
    surname: String!
    active: Boolean
    email: String!
    amsAccount: UpsertAmsAccountBelongsTo
}

input CreateAmsAccountBelongsTo {
    connect: ID
    create: CreateAmsAccountInput
    update: UpdateAmsAccountInput
    upsert: UpsertAmsAccountInput
}

input UpdateAmsAccountBelongsTo {
    connect: ID
    create: CreateAmsAccountInput
    update: UpdateAmsAccountInput
    upsert: UpsertAmsAccountInput
    disconnect: Boolean
    delete: Boolean
}

input UpsertAmsAccountBelongsTo {
    connect: ID
    create: CreateAmsAccountInput
    update: UpdateAmsAccountInput
    upsert: UpsertAmsAccountInput
    disconnect: Boolean
    delete: Boolean
}

Когда я пытаюсь запустить следующую мутацию на игровой площадке:

mutation {
  createAmsContact(
    input: {
      forename: "Jane"
      surname: "Doe"
      active: true
      email: "jd@example.com"
      amsAccount: {
        connect: 1
      }
    }
  ) {
    id
    forename
    surname
    amsAccount: id
  }
}

Я получаю сообщение об ошибке, содержащее следующее сообщение об ошибке:

"debugMessage": "SQLSTATE[HY000]: General error: 1364 Field 'ams_account_id' doesn't have a default value (SQL: insert into `ams_contacts` (`forename`, `surname`, `active`, `email`, `updated_at`, `created_at`) values (Jane, Doe, 1, jd@example.com, 2020-04-12 15:31:52, 2020-04-12 15:31:52))"

Я попробовал несколько исправлений и предложений со всего Интернета, и, насколько я вижу, моя схема соответствует определенный формат из документации, но я не могу понять, почему он не работает.

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

Я склоняюсь к тому, что это связано с пространствами имен разных моделей, но я не могу себе представить, Я первый предъявляю это требование, и при этом я не могу найти никаких ссылок на то, как преодолеть это.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 12 апреля 2020

Так что на самом деле я не был в миллионе миль от отметки с моей проблемой пространства имен.

Проблема заключается в файле модели, в частности, здесь:

public function amsAccount(): BelongsTo
    {
        return $this->belongsTo(\App\Models\Ams\Account::class, 'ams_account_id', 'id');
    }

Проблема в том, что BelongsTo не был указан в предложениях use в начале класса модели. Таким образом, тип возвращаемого класса не может быть определен должным образом.

В связи с этим необходимо добавить следующее в предложения use в верхней части файла:

use Illuminate\Database\Eloquent\Relations\BelongsTo;

This применяется к другим типам отношений.

Это то, что говорится в Документации , но настолько тонко, что не щелкнуло.

RTFM.

Спасибо всем, кто посмотрел и надеюсь, что это поможет кому-то еще в будущем.

...