Пожалуйста, исправьте меня, если я ошибаюсь.
У меня есть две модели "Пользователи" и "Профили"
Сценарий 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
}
}
я получаю дубликаты результатов с новым идентификатором каждый раз (автоинкремент) всякий раз, когда я запускаю эту мутацию.
Мой вопрос,
Как использовать upsert, если user_id существует, затем обновить строку, в противном случае создать строку.
Как 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"
],
....
]