From 0455438ebe93a6744c446c3446fd845e106a5aef Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Sun, 18 Mar 2012 22:39:04 -0500 Subject: [PATCH] Added transaction method to database connection and eloquent model. --- laravel/database/connection.php | 27 +++++++++++++++++++++ laravel/database/eloquent/model.php | 37 ++++++++++++++++++----------- laravel/database/eloquent/query.php | 2 +- 3 files changed, 51 insertions(+), 15 deletions(-) diff --git a/laravel/database/connection.php b/laravel/database/connection.php index f38f9873..5b2ec0e9 100644 --- a/laravel/database/connection.php +++ b/laravel/database/connection.php @@ -84,6 +84,33 @@ protected function grammar() } } + /** + * Execute a callback wrapped in a database transaction. + * + * @param Closure $callback + * @return void + */ + public function transaction($callback) + { + $this->pdo->beginTransaction(); + + // After beginning the database transaction, we will call the Closure + // so that it can do its database work. If an exception occurs we'll + // rollback the transaction and re-throw back to the developer. + try + { + call_user_func($callback); + } + catch (\Exception $e) + { + $this->pdo->rollBack(); + + throw $e; + } + + $this->pdo->commit(); + } + /** * Execute a SQL query against the connection and return a single column result. * diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index f1b7d74b..494a5064 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -103,17 +103,6 @@ public function __construct($attributes = array(), $exists = false) $this->fill($attributes); } - /** - * Set the accessible attributes for the given model. - * - * @param array $attributes - * @return void - */ - public static function accessible($attributes) - { - static::$accessible = $attributes; - } - /** * Hydrate the model with an array of attributes. * @@ -157,6 +146,28 @@ public function fill($attributes) return $this; } + /** + * Set the accessible attributes for the given model. + * + * @param array $attributes + * @return void + */ + public static function accessible($attributes) + { + static::$accessible = $attributes; + } + + /** + * Execute a callback wrapped in a database transaction. + * + * @param Closure $callback + * @return void + */ + public static function transaction($callback) + { + with(new static)->query()->connection()->transaction($callback); + } + /** * Create a new model and store it in the database. * @@ -211,9 +222,7 @@ public static function find($id, $columns = array('*')) */ public static function all() { - $model = new static; - - return $model->query()->get(); + return with(new static)->query()->get(); } /** diff --git a/laravel/database/eloquent/query.php b/laravel/database/eloquent/query.php index 1894fe5f..36cfaf6b 100644 --- a/laravel/database/eloquent/query.php +++ b/laravel/database/eloquent/query.php @@ -243,7 +243,7 @@ protected function query() * * @return Connection */ - protected function connection() + public function connection() { return Database::connection($this->model->connection()); }