Laravel graphql Директива Upsert не работает должным образом - PullRequest
1 голос
/ 01 мая 2020

Пожалуйста, исправьте меня, если я ошибаюсь.

У меня есть две модели "Пользователи" и "Профили"

Сценарий 1:

В модель «Профили» Я определил «user_id» как первичный ключ и внешний ключ для «users.id»

class Profile extends Model
{


    /**
     * primary key
     */
    protected $primaryKey = 'user_id';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'user_id', 'country'
    ];

в schema.graphql

type Mutation {
    upsertProfile(user_id: ID, country: String): Profile @upsert
}

type Profile {
    user_id: ID!
    country: String
    user: User @belongsTo
}

Предположим, что есть id 28 в таблице пользователей. Когда я пытаюсь запустить мутацию:

mutation {
    upsertProfile(user_id: 28, country: "India") {
    country
  }
}

Он отлично работает и обновляет страну, но если не существует user_id 28 существует, по определению он должен создать его.

Как он определяет столбец user_id не является столбцом с автоинкрементом

Я сделал еще один тест

Сценарий 2 :

Я удалил 'user_id' в качестве первичного ключа и добавил столбец id в качестве первичного ключа и автоинкремент . Предположим, что id 1 существует, а затем после запуска мутации:

mutation {
    upsertProfile(id: 1, country: "India") {
    country
  }
}

Я получил ожидаемый результат. Но когда я пытаюсь запустить мутацию

mutation {
    upsertProfile(user_id: 28, country: "India") {
    country
  }
}

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

Мой вопрос,

  1. Как использовать upsert, если user_id существует, затем обновить строку, в противном случае создать строку.

  2. Как laravel Прототип функции createOrUpdate содержит проверку нескольких столбцов для обновить строку, есть ли способ сделать то же самое в директиве upsert.

Кстати, при сценарий 1 Я отладил запрос и обнаружил, что запрос вставки выполняется но я получаю исключение на результат grpahql-детской площадки

{
  "errors": [
    {
      "debugMessage": "No query results for model [App\\Models\\Profile] 0",
      "message": "Internal server error",
      "extensions": {
        "category": "internal"
      },
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "upsertProfile"
      ],
      ....
   ]

1 Ответ

0 голосов
/ 02 мая 2020

Убедитесь, что атрибут ID является заполняемым / неохраняемым.

...