Ohhhh! This is quite complicated, since your model extends Eloquent , then Eloquent uses Illuminate\Database\Query\Builder .
But I noticed that Eloquent is actually an alias in the app/config/app.php . So what you can do is follow these steps.
- Extend
Illuminate\Database\Query\Builder to MyQueryBuilder with your custom whereInSub() . - Extend
Illuminate\Database\Eloquent\Model to MyModel and make it use your MyQueryBuilder . - Set the
Eloquent alias in app/config/app.php for your new MyModel class.
Something like that:
MyQueryBuilder.php:
use Closure; use Illuminate\Support\Collection; use Illuminate\Database\ConnectionInterface; use Illuminate\Database\Query\Grammars\Grammar; use Illuminate\Database\Query\Processors\Processor; class MyQueryBuilder extends Illuminate\Database\Query\Builder { protected function whereInSub($column, Closure $callback, $boolean, $not) { $type = $not ? 'NotInSub' : 'InSub'; $query = $this->newQuery();
MyModel.php:
use DateTime; use ArrayAccess; use Carbon\Carbon; use LogicException; use Illuminate\Events\Dispatcher; use Illuminate\Database\Eloquent\Relations\Pivot; use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Support\Contracts\JsonableInterface; use Illuminate\Support\Contracts\ArrayableInterface; use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Database\Eloquent\Relations\MorphOne; use Illuminate\Database\Eloquent\Relations\MorphMany; use Illuminate\Database\Eloquent\Relations\BelongsTo; // use Illuminate\Database\Query\Builder as QueryBuilder; use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Illuminate\Database\ConnectionResolverInterface as Resolver; use MyQueryBuilder as QueryBuilder; // MyModel should now use your MyQueryBuilder instead of the default which I commented out above abstract class MyModel extends Illuminate\Database\Eloquent\Model { }
application /Config/app.php:
'aliases' => array( ... 'Eloquent' => 'MyModel', ... );
Please note that I put long use lists there because the "use" keyword does not get inherited . Also, I just did not put MyQueryBuilder and MyModel in the namespace for simplicity. My use list may also differ from yours, depending on the versions of Laravel we use, so please also check the usage.
source share