php - Laravel Spatie Custom Filter by Relation Last Element

one text

Solution:

I solved the problem this:

<?php

use App\Models\Examination;
use Spatie\QueryBuilder\Filters\Filter;
use Illuminate\Database\Eloquent\Builder;

class SickAnimalsFilter implements Filter
{
    public function __invoke(Builder $query, $value, string $property)
    {
        $examinationIds = $query->withMax('examinations', 'id')->get()->pluck('examinations_max_id');
        $animalIds = Examination::query()->groupBy('animal_id', 'id')->get()->whereIn('id', $examinationIds)->where('disease_id', '!=', null)->pluck('animal_id');
        $query->whereIn('id', $animalIds);
    }
}

I got each animals last examination ids and write to $examinationIds.

And filter Examinations with $examinationIds. After filtering get animal ids with pluck('animal_id').

And then filter the $query with $animalIds.

Source