mitch2k
mitch2k

Reputation: 526

Filter based on collection or sub-attribute

My user model has a 'prevregistration' attribute

 public function prevregistration()
{
    return $this->hasMany(Prevregistration::class, 'prevregistration_userid');
}

My prevregistraton model has a 'prev' attribute

  public function prev()
{
    return $this->hasOne(Prev::class,'prev_id', 'prevregistration_previd');
}

In my controller I show prevregistrations for the current user:

mynextprevs = Auth::user()->prevregistration ;

Now I want to only show prevregistrations from which the connected prev its prev_date in the future, like this:

$mynextprevs = Auth::user()->prevregistration::whereDate('prev_date', '>=', Carbon::today()->toDateString());

But then I get:

BadMethodCallException Method Illuminate\Database\Eloquent\Collection::whereDate does not exist.

I also tried like this:

$mynextprevs = Auth::user()->prevregistration->prev::whereDate('prev_date', '>=', Carbon::today()->toDateString());

But then I get:

Property [prev] does not exist on this collection instance.

Should I/how can I filter the collection? I'm curious why Auth::user()->prevregistration->prev is not working, since that are attributes.

Thanks

Upvotes: 0

Views: 52

Answers (1)

N69S
N69S

Reputation: 17216

You need to use the condition whereHas on your prevregistration

$mynextprevs = Auth::user()->prevregistration()->whereHas('prev',function($prev) {
    $prev->whereDate('prev_date', '>=', Carbon::today()->toDateString());
})->get();

Notice we used the relation as a method prevregistration() to access it as a query builder and not as a collection hence the need for the ->get() at the end.

Upvotes: 1

Related Questions