berusjamban
berusjamban

Reputation: 363

How to chain laravel model query builder

I was extending laravel model scope query using :

public function newEloquentBuilder($query)
{
   return new FooBuilder($query);
}

public function newEloquentBuilder($query)
{
   return new BarBuilder($query);
}

class FooBuilder extends Builder
{
  public function joinBar()
  {
    return $this->leftJoin('bar', 'bar.id', '=', 'foo.id');
  }
}

class BarBuilder extends Builder
{
   public function whereActive()
   {
     return $this->where('is_active', true);
   }
}

Is it possible to chain laravel model query like this?

Foo::query()->joinBar()->Bar::query()->whereActive()->get()

Basically, I want to call a method in BarBuilder from FooBuilder, i dont want to add duplicate same method inside FooBuilder.

Upvotes: 2

Views: 830

Answers (1)

Tim Lewis
Tim Lewis

Reputation: 29258

You might be overcomplicating this TBH. Take a look at Scopes:

https://laravel.com/docs/8.x/eloquent#local-scopes.

You should simply be able to define the following on Foo.php (Model):

public function scopeJoinBar($query){
  return $query->leftJoin('bar', 'bar.id', '=', 'foo.id');
}

public function scopeBarIsActive($query){
  return $query->where('bar.is_active', true);
}

Then you simply call these scopes:

$foos = Foo::joinBar()->barIsActive()->get();

Upvotes: 2

Related Questions