У меня есть поле BIGINT, и для тестирования я увеличил его до максимума, а затем попытался добавить еще больше. Следующий код возвращает успешный результат без выброса \ Exception, но выдает предупреждение в запросе sql и, очевидно, не обновляет поле. Как я могу поймать предупреждение и вернуть предупреждающее сообщение о максимальном значении поля? (Как видите, я безуспешно пробовал как DB :: transaction, так и try / catch).

        try {
            DB::transaction(function () use ($data, $quantity) {
                $query = 'INSERT INTO item_user (user_id, item_id, quantity) VALUES '.substr($data,0,-2).' ON DUPLICATE KEY UPDATE quantity = GREATEST(`quantity` + '.$quantity.',0)';
                DB::statement($query);

                // subquery to delete any rows left with zero
                DB::table('item_user')->where('quantity',0)->delete();
            });

            return redirect()->route('index')
                ->with( ['flash' => ['message' =>"<i class='fa fa-check-square-o fa-1x'></i> Success! Item totals updated.", 'level' =>  "success"] ] );

        } catch (\Exception $e) {

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

Это возвращает успешный результат на странице, но захват и выполнение запроса непосредственно на SQL дает мне предупреждение и номер:

Warning Code : 1264
Out of range value for column 'quantity' at row 1

Спасибо.

2
Landjea 23 Фев 2016 в 15:49

2 ответа

Лучший ответ

Вы можете выполнить другой оператор, не перехватив исключение (предупреждение не является исключением). Синтаксис:

ПОКАЗАТЬ ПРЕДУПРЕЖДЕНИЯ [LIMIT [offset,] row_count]

ПОКАЗАТЬ СЧЕТ (*) ПРЕДУПРЕЖДЕНИЙ

После вашего запроса вставки вы можете сделать следующее:


Подсчет предупреждений

DB::statement('SHOW WARNINGS');
$warning = DB::select('SELECT @@warning_count');

Если возникает предупреждение, оно возвращается:

array(1) {
  [0]=>
  object(stdClass)#412 (1) {
    ["@@warning_count"]=>
    string(1) "1"
  }

Или

["@@warning_count"]=>
    string(1) "0"

Если не появляется предупреждение.


Предупреждающие сообщения & amp; коды

Чтобы получить предупреждающие сообщения:

$warning_messages = DB::select('SHOW WARNINGS');

Возврат:

array(1) {
  [0]=>
  object(stdClass)#412 (3) {
    ["Level"]=>
    string(7) "Warning"
    ["Code"]=>
    string(4) "1264"
    ["Message"]=>
    string(79) "Out of range value for column 'quantity' at row 1"
  }
}

См. Документацию о предупреждениях mySQL.

2
toesslab 23 Фев 2016 в 14:16

Вы можете использовать этот запрос после вашего запроса вставки SELECT @@warning_count, он вернет количество предупреждений, чтобы вы могли его проверить.

1
Gouda Elalfy 23 Фев 2016 в 13:02