@ettychel

Как сделать insert ... on duplicate key update в Lighthouse-php на Laravel?

Добрый день!
Недавно начал осваивать lighthouse и GraphQL и тут сразу возник вопрос, как сделать mutation чтобы был запрос в бд insert or update? В laravel есть чудесная функция Model::createOrUpdate($array), а как это сделать с помощью lighthouse ума не приложу.
Помогите пожалуйста
  • Вопрос задан
  • 468 просмотров
Решения вопроса 1
@ettychel Автор вопроса
Решил свой вопрос созданием класса мутатора, все шаги описаны ниже

Добавляем пакет кастомных типов данных

composer require mll-lab/graphql-php-scalars

Создаем класс мутатор

php artisan lighthouse:mutation ClassNameMutator

По пути /yourPath/appName/app/GraphQL/Mutations будет создан файл ClassNameMutator.php
Пишем в самом конце свой метод createOrUpdate

use App\Models\ModelName;

...

public function createOrUpdate($rootValue, array $args, GraphQLContext $context)
{
    $model = ModelName::find($args['id']);
    if ($model == null) {$model = new ModelName();}
    $model->fill($args)->save();
    $model = ModelName::select($args['field'])->find($args['id']);

    return $model;
}


В файле /yourPath/appName/graphql/schema.graphql прописываем следующее:

"A Json string with format normal Array"
scalar Mixed @scalar(class: "MLL\\GraphQLScalars\\Mixed")

 ...
    
type Mutation {
    uoiModel(input: uoi! @spread): Mixed @field(resolver: "ClassNameMutator@createOrUpdate")
}
input uoi{
    id: ID!         //Поле таблицы в запрос
    otherField: ID  //Поле таблицы в запрос
    field: Mixed    //Поля, которые нужны в ответ, указываются в виде простого массива ["field1","field2","fieldn"]
}


Теперь у нас есть мутация, которой можно легко пользоваться, запрос будет таким:

mutation {
    uoiModel(
        input: {
            id: 900003
            status: 49
            field: [
                "id",
                "status"
            ]
        }
    )
}


Данное решение подходит для таблиц как с инкрементным id, так и без
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы