лучший способ определить ошибки SQL при создании, обновлении или удалении записи в Laravel - PullRequest
0 голосов
/ 06 мая 2018

У меня есть этот вариант использования, когда я сохраняю запись после ее создания и хочу проверить на наличие ошибок и проинформировать моего пользователя о том, что произошло на стороне сервера sql, не показывая ему фактическое сообщение об ошибке (если таковое возникает).

Вот то, что я придумал на данный момент:

<?php
    namespace App\Http\Controllers;

    use Illuminate\Http\Request;
    use App\Book;
    use App\Http\Requests\BookRequest;
    use Illuminate\Database\QueryException;

    class BookController extends Controller {
        /* ... */

        public function store(BookRequest $request) {
            $book = new Book;

            $book->name = $request->input('name');
            $book->author = $request->input('author');
            $book->published_at = $request->input('publishDate');

            try {
                $book->save();
            }
            catch( QueryException $exception ) {
                $message = '';

                if( $exception->code == 23000 )  { // 23000: MySQL error code for "Duplicate entry"
                    $message = 'This book already exists.';
                }
                else {
                    $message = 'Could not store this book.';
                }

                return redirect()
                    ->back()
                    ->withInput()
                    ->withErrors($message);
            }

            return redirect()->route('book.index');
        }
    }
?>

Часть, в которой я жестко кодирую код ошибки MySQL, вызывает у меня ошибки, и он, безусловно, не переносим.

Вопрос

Как мы должны идентифицировать ошибки базы данных при сохранении / обновлении / удалении записи?

Можем ли мы сделать эту проверку универсальным способом (независимо от базы данных)?

1 Ответ

0 голосов
/ 06 мая 2018

Один из вариантов - использовать проверку перед ее сохранением. Самый простой способ достичь этого, вероятно, будет использовать Laravel-Model-Validation . Вы можете сделать что-то вроде этого:

class Book extends Model {
    protected static $rules = [
        'name' => 'required|unique:books',
        'published_at' => 'required|date'
    ];

    //Use this for custom messages
    protected static $messages = [
        'name.unique' => 'A book with this name already exists.'
    ];
}

Это можно легко свернуть вручную, прослушав saving. См. Код Джеффри Вей :

/**
 * Listen for save event
 */
protected static function boot()
{
    parent::boot();
    static::saving(function($model)
    {
        return $model->validate();
    });
}
...