Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel DB::transaction() return value

Tags:

php

laravel

It's my first time to use DB::transaction() but how exactly does it work if a transaction fails or is successful? In the example below, do I have to manually assign a value to return true, or if it fails will the method either return false or totally exit the transaction (therefore skipping the rest of the code)? The docs aren't so helpful on this.

use Exception;
use DB;

try {
    $success = DB::transaction(function() {
        // Run some queries
    });

    print_r($success);

} catch(Exception $e) {
    echo 'Uh oh.';
}

Solution

I wrote down this solution for others who might be wondering.

Since I was more concerned about returning a boolean value depending on the success of my query, with a few modifications it now returns true/false depending on its success:

use Exception;
use DB;

try {
  $exception = DB::transaction(function() {
    // Run queries here
  });

  return is_null($exception) ? true : $exception;

} catch(Exception $e) {
    return false;
}

Take note that the variable $exception is never returned since if something goes wrong with your query, the catch is immediately triggered returning false. Thanks to @ilaijin for showing that an Exception object is thrown if something goes wrong.

like image 397
enchance Avatar asked Nov 24 '13 15:11

enchance


1 Answers

By giving a look at function transaction it does its process inside a try/catch block

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;
    }

So throws an Exception (after the rollback) if fails or returns $result, which is the result of your callback

like image 141
ilpaijin Avatar answered Oct 12 '22 04:10

ilpaijin