0

我在用 Lighthouse 处理嵌套突变时遇到了一些问题。

我有两个相关的模型:Ams\AccounthasMany 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))"

我已经尝试了一些来自网络的修复和建议,据我所知,我的架构遵循文档中定义的格式,但我无法理解为什么它不起作用。

我还确认该帐户的简单突变可以正常工作。当我尝试与联系人同时创建新帐户时,我也会收到类似的错误消息。

我的倾向是它与不同模型的名称空间有关,但我无法想象我是第一个有这个要求的人,我也找不到任何关于如何克服这个问题的参考资料。

任何和所有的帮助将不胜感激。

4

1 回答 1

2

所以我的命名空间问题实际上并没有离目标一百万英里。

问题在于模型文件,特别是这里:

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;

这适用于其他关系类型。

这是文档所述的内容,但是如此微妙以至于它没有点击。

实时调频。

感谢所有看过的人,希望这对未来的其他人有所帮助。

于 2020-04-12T17:45:53.050 回答