I want to replace the Laravels builder class with my own that's extending from it. I thought it would be as simple as matter of App::bind
but it seems that does not work. Where should I place the binding and what is the proper way to do that in Laravel?
This is what I have tried:
my Builder:
use Illuminate\Database\Eloquent\Builder as BaseBuilder;
class Builder extends BaseBuilder
{
/**
* Find a model by its primary key.
*
* @param mixed $id
* @param array $columns
* @return \Illuminate\Database\Eloquent\Model|static|null
*/
public function find($id, $columns = array('*'))
{
Event::fire('before.find', array($this));
$result = parent::find($id, $columns);
Event::fire('after.find', array($this));
return $result;
}
}
And next I tried to register the binding in bootstrap/start.php file like this :
$app->bind('Illuminate\\Database\\Eloquent\\Builder', 'MyNameSpace\\Database\\Eloquent\\Builder');
return $app;
Both of the answers are correct in some way. You have to decide what your goal is.
Change Eloquent Builder
For example, if you want to add a new method only for eloquent models (eg. something like scopes, but maybe a little more advanced so it’s not possible in a scope)
Create a new Class extending the Eloquent Builder, for Example CustomEloquentBuilder.
Create a Custom Model and overwrite the method newEloquentBuilder
Change Database Query Builder
For example to modify the where-clause for all database accesses
Create a new Class extending the Database Builder, for Example CustomQueryBuilder.
Create a Custom Model and overwrite the method newBaseQueryBuilder
Laravel Version: 5.5 / this code is untestet
The answer above doesn't exactly work for laravel > 5 so I done some digging and I found this!
https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Model.php#L1868
use this instead!
Illuminate\Database\Eloquent\Builder
class is an internal class and as such it is not dependency injected into theIlluminate\Database\Eloquent\Model
class, but kind of hard coded there.To do what you want to do, I would extend the
Illuminate\Database\Eloquent\Model
toMyNamespace\Database\Eloquent\Model
class and overridenewEloquentBuilder
function.Then alias
MyNamespace\Database\Eloquent\Model
toEloquent
at thealiases
inapp/config/app.php