Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Retornar erro quando um ID não for encontrado

Estou trabalhando em uma API que preciso validar um campo caso não seja encontrado o ID específico

Esse campo se chama camera_id e se trata de uma FK com a tabela de câmeras

Além disso estou utilizando um controller com o método store para gravar no banco

Porém não estou conseguindo pensar em uma forma de validar se o registro existe

Digamos que exista apenas os ID's 1, 2 e 3.. se eu mandar um POST com ID 4 para tentar salvar, precisa retornar um JSON com uma mensagem personalizada do tipo "Câmera não existe"

Alguém pode me ajudar?

5 respostas

Você pode buscar esse recurso no banco. Caso não exista você retorna essa falha. Ou configurar a constraint corretamente no banco para essa FK.

Você também poderia adicionar uma rule para verificação da FK.

$rules = array(
    'camera_id' => 'required|exists:camera,id',
)

Pode incluir todas as chaves que são obrigatórias nessa regra. Observação: As rules precisam estender o FormRequest.

solução!

Obrigado pelas respostas Vinícius e Wagner, acabei fazendo da maneira abaixo

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Vehicle;
use App\Models\Camera;
use Exception;

class VehicleApiController extends Controller
{
    public function storeVehicle(Request $request)
    {
        $records = $request->all();
        $camError = [];

        try {
            foreach ($records as $record) {
                $cameraId = $record['camera_id'];

                if (Camera::find($cameraId) == null) {
                    array_push($camError, $record['image_filename']);
                } else {
                    Vehicle::create($record);
                }
            }

            if (!empty($camError)) {
                return response()->json([
                    'Falha' => '1 ou mais registros não foram gravados por conter camera_id inexistente',
                    'Registros' => $camError
                ], 404);
            } else {
                return response()->json(['success' => 'Todos os veículos foram gravados com sucesso'], 200);
            }
        } catch (Exception $e) {
            return response()->json(['error' => 'Não foi possível salvar os registros'], 500);
        }
    }
}

Alef,

Não sei em que ponto você em seus estudos, mas vou colocar aqui algumas sugestões de melhoria apenas.

Todas essas regras e tratativas, você poderia colá-las dentro do serviço, dessa forma, o controller ficaria responsável apenas por receber a requisição e chamar o service que irá aplicar as regras de negócio que você precisa. As únicas regras que você manteria no controller, são as relacionadas a requisição.

Dessa forma, você também evitaria a utilização do Model já no controller, mantendo ele mais protegido.

A persistência dos dados, você poderia colocar no repository, ficando um fluxo similar a esse:

Routes -> Controllers -> Services -> Repositories -> Model -> BD

Mas são apenas sugestões. Não sei se você já está a vontade nos seus estudos para implementá-las.

Abraço!

Wagner,

Na verdade eu precisei fazer isso pois se trata de um projeto real que eu trabalho, e na empresa eles não usam dessa maneira, então eu preciso seguir o padrão deles

Com certeza a forma que você sugeriu é bem melhor, e utilizei esse tópico do curso de API pois estou estudando ele para aplicar em minhas tarefas do trabalho

De qualquer forma, muito obrigado pelas informações :D