Laravel DB:: transaction() возвращаемое значение
Это мой первый раз использовать DB::transaction()
, но как именно он работает, если транзакция терпит неудачу или будет успешной? В приведенном ниже примере мне нужно вручную присвоить значение для возврата true
, или если он завершится с ошибкой, метод вернет false
или полностью выйдет из транзакции (поэтому пропуская остальную часть кода)? Документы не так полезны.
use Exception;
use DB;
try {
$success = DB::transaction(function() {
// Run some queries
});
print_r($success);
} catch(Exception $e) {
echo 'Uh oh.';
}
Решение
Я записал это решение для других, которым может быть интересно.
Поскольку я больше беспокоился о возврате логического значения в зависимости от успеха моего запроса, с несколькими изменениями он теперь возвращает true/false
в зависимости от его успеха:
use Exception;
use DB;
try {
$exception = DB::transaction(function() {
// Run queries here
});
return is_null($exception) ? true : $exception;
} catch(Exception $e) {
return false;
}
Обратите внимание, что переменная $exception
никогда не возвращается, так как если что-то пойдет не так с вашим запросом, catch
немедленно запускается, возвращая false
. Спасибо @ilaijin за то, что объект Exception
вызывается, если что-то пойдет не так.
Ответы
Ответ 1
Просматривая function transaction
, он выполняет свой процесс внутри блока try/catch
public function transaction(Closure $callback)
{
$this->beginTransaction();
// We'll simply execute the given callback within a try / catch block
// and if we catch any exception we can rollback the transaction
// so that none of the changes are persisted to the database.
try
{
$result = $callback($this);
$this->commit();
}
// If we catch an exception, we will roll back so nothing gets messed
// up in the database. Then we'll re-throw the exception so it can
// be handled how the developer sees fit for their applications.
catch (\Exception $e)
{
$this->rollBack();
throw $e;
}
Таким образом, выдает исключение (после отката), если он не работает или возвращает $result
, что является результатом вашего обратного вызова
Ответ 2
Вы также можете использовать следующие
DB::rollback();