laravel5.8 GraphQL crear/actualizar eliminar un registro mutation

Mutation sirven para realizar alguna accion sobre una instancia del modelo

creamos la mutation

php artisan make:graphql:mutation CreateCityMutation

editamos el archivo que CreateCityMutation.php que se genera:

public function type()
    {
        return GraphQL::type('city');
    }

    public function args()
    {
        return [
            'name' => [
                'name' => 'name',
                'type' =>  Type::nonNull(Type::string()),
                'rules' => ['required', 'min:3', 'max:50','unique:cities,name']
            ],
        ];
    }

   

    public function resolve($root, $args)
    {
        $city = new City();
        $city->fill($args);
        $city->save();

        return $city;
    }

en este caso el -unico parametro y obligatorio que le enviamos a la funcion es el name de la city
por que en el modelo este campo debe estar como parte de la lista de campos que se pueden asignar de modo masivo:

en City.php

protected $fillable = [
        'name'
    ];


notar que por simplicidad pusimos las validaciones dentro de la funcion de args, esto tambien se
 puede hacer en una funcion separada, en nuestro caso hubiese quedado asi:

public function rules(array $args = [])
    {
        return [
            'name' => [
                'required', 'min:3', 'max:50','unique:cities,name'
            ],
        ];
    }

ahora registramos la mutation en grapql.php dentro de la seccion de Schemas:

'schemas' => [
        'default' => [
            'query' => [
               ..
            ],
            'mutation' => [
                 'createCity' => App\GraphQL\Mutation\CreateCityMutation::class,
            ],
        ],
    ],

ahora ya podemos probar la query de creacion

mutation createCity {
  createCity(name : "barcelona"){
    id,name
  }
}

en donde id, name serian los campos que queremos que nos muestre el resultado de la operacion (es necesario indicarlos)

lo que nos resultaria en algo como:

{
  "data": {
    "createCity": {
      "id": 6,
      "name": "barcelona"
    }
  }
}


para actualizar seria :

en UpdateCityMutation.php

public function rules(array $args = [])
    {
        return [
            'id' => [
                'required', 'numeric', 'min:1', 'exists:cities,id'
            ]
        ];
    }
    public function args()
    {
        return [
            'id' => [
                'name' => 'id',
                'type' =>  Type::nonNull(Type::int()),
            ],
            'name' => [
                'name' => 'name',
                'type' =>  Type::nonNull(Type::string()),
                'rules' => ['required', 'min:3', 'max:50','unique:cities,name']
            ],
        ];
    }

    public function resolve($root, $args)
    {
        $city = City::findOrFail($args['id']);

       $city->fill($args);
        $city->save();

        return $city;
    }

y al igual que con el create, la llamada seria de esta manera:

mutation updateCity {
  updateCity(id:6,name: "ciudad de barcelona"){
    id,name
  }
}

para eliminar un registro:

DeleteCityMutation.php

public function rules(array $args = [])
    {
        return [
            'id' => [
                'required', 'numeric', 'min:1', 'exists:cities,id'
            ]
        ];
    }
   
    public function type()
    {
        return  Type::boolean();
    }

    public function args()
    {
        return [
            'id' => [
                'name' => 'id',
                'type' => Type::int()
            ]
        ];
    }

    public function resolve($root, $args)
    {
       $city = City::findOrFail($args['id']);
       $city->delete() ? true : false;
    }



mutation deleteCity {
  deleteCity(id:5)
}

resultando:

{
  "data": {
    "deleteCity": null
  }
}


No hay comentarios:

Publicar un comentario

linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable