Laravel: performing some task on every insert/update when using Query Builder or Eloquent ORM
eloquent, laravel, laravel-4, php, query-builder
Solution
Adding to the above answers. You could do something like this.
Create a class in app/models called BaseModel.php extending \Eloquent
class BaseModel extends \Eloquent{
public static function boot()
{
parent::boot();
static::creating(function($model)
{
//change to Auth::user() if you are using the default auth provider
$user = Confide::user();
$model->created_by = $user->id;
$model->updated_by = $user->id;
});
static::updating(function($model)
{
//change to Auth::user() if you are using the default auth provider
$user = Confide::user();
$model->updated_by = $user->id;
});
}
}
Then in your individual model classes you need to extent the BaseModel instead of \Eloquent
class Product extends BaseModel {
protected $table = 'product';
//Booting the base model to add created_by and updated_by to all tables
public static function boot()
{
parent::boot();
}
}
Now any time you save or update a model, the created_by and updated_by fields would be updated automatically.
Note: This would only work when save or update is done through Eloquent. For query builder, you could have a common method to fetch and append the created_by and update_by column updates.
Problem
The Problem I would like to automatically add `created_by` and `modified_by` fields to every insert/update to a database table in Laravel 4, regardless of whether I am using Eloquent or Query Builder. However, not all my tables have these fields so any solution will have to check these columns exist before adding. Attempted Solution I have extended the `Illuminate\Database\Eloquent\Model` class and written an overwrite method `save()` in order to add some additional meta data fields for every record that is saved. This is fine except that if I perform an insert using the Query Builder then this is bypassed. Looking at the `Model` class it appears that the database operations are actually done using the query builder. I have had a look at the `Illuminate\Database\Query\Builder` model and it looks like I could probably write overwrite methods for `insert()` and `update()`. Is this a sensible way to go about performing some task for every insert/update or will I run into trouble later down the line?