2
respostas

Como Tratar Uma QueryException no Laravel?

Gostaria de fazer um tratamento de erro, redirecionando para alguma página ou exibindo um alert mas não sei bem por onde começar, estou postando aqui e vou ler a documentação mas se alguém tiver alguma dica agradeço desde já!

lluminate \ Database \ QueryException (23000)
SQLSTATE[23000]: Integrity constraint violation: 19 UNIQUE constraint failed:

Essa mensagem aparece quando o e-mail é duplicado, sei que no PHP raíz era só usar o try/catch/finally, mas e no Laravel?

2 respostas

Essa foi a solução que consegui:

try {
            $user = User::create($data);
        } catch (\Illuminate\Database\QueryException $e) {
            return redirect()->back()->withErrors(($e->getCode() === '23000') ? 'E-mail já existe.' : 'teste');
        }

Mas tem um problema, está retornando 'teste' ao invés de 'E-mail já existe.'.

Tem algum problema com o ternário pois de fato o código é 23000. edit: resolvido, o código vem em formato de string e com os 3 sinais de igual estava validando também o tipo, como passei sem as aspas ele só validava true se fosse inteiro.

Tem uma parada com o php artisan make:exception que gostaria de aprender, parece ser um método diferente de tratar as excessões...

Guilherme, beleza? Estou postando abaixo uma tratativa que faço em um sistema. Ele verifica se o telefone que esta sendo cadastrado é repetido. Se ocorrer um erro ele vai dar um return com um flash de erro. É uma forma que neste momento me atende neste sistema. Existem outras formas de tratar.

Acho que vale a pena dar uma olhada na documentação do Laravel: https://laravel.com/docs/5.8/errors

E um exemplo, uma forma.

public function store(CriarTelefoneFormRequest $request, int $territorioId) {

        try {
            $criarTelefone = new CriarTelefone;
            $telefone = $criarTelefone->criarTel(
                $territorioId,
                $request->selectUnidade,
                $request->inputNumero,
                $request->inputTel,
                $request->Radio
            );
        }
        catch (QueryException $exception) {
            $request->session()
            ->flash(
                'repetido',
                "Telefone {$request->inputTel} repetido - Não cadastrado!"
            );

            return redirect()->route('form_listar_telefones', [$territorioId]);
        }

        $request->session()
        ->flash(
            'mensagem',
            "Telefone {$telefone->telefone} adicionado com sucesso!"
        );

        return redirect()->route('form_listar_telefones', [$territorioId]);
    }