繁体   English   中英

Laravel Spatie 自定义过滤器按关系最后一个元素

[英]Laravel Spatie Custom Filter by Relation Last Element

我有一只动物 Model。 动物关系检查和疾病模型。 我需要过滤出生病的动物。

检查 model 有 disease_id。 如果上次检查 object disease_id 不等于 null,则此动物生病。 我正在尝试用 spatie 过滤器过滤它。

这是我的自定义过滤器代码:

这必须按上次检查数据过滤。 而是按所有检查数据过滤。

<?php

use Spatie\QueryBuilder\Filters\Filter;
use Illuminate\Database\Eloquent\Builder;

class SickAnimalsFilter implements Filter
{
    public function __invoke(Builder $query, $value, string $property)
    {
            $query->whereHas('examinations', function($q) {
                $q->orderBy('created_at', 'DESC')->limit(1)->where('disease_id', '!=', null);
            });
    }
}

示例数据:

这应该包含在过滤器中。 这只动物现在病了。

"examinations": [
            {
                "id": 1,
                "animal_id": 1,
                "disease_id": 1
                "created_at": "2022-01-28T09:24:46.000000Z",
                "updated_at": "2022-01-28T09:24:46.000000Z",
            }
        ]

这不应该包含在过滤器中。 这种动物以前生病了,但现在它很健康。

"examinations": [
            {
                "id": 1,
                "animal_id": 1,
                "disease_id": 1
                "created_at": "2022-01-28T09:24:46.000000Z",
                "updated_at": "2022-01-28T09:24:46.000000Z",
            },
            {
                "id": 2,
                "animal_id": 1,
                "disease_id": null
                "created_at": "2022-01-30T15:29:00.000000Z",
                "updated_at": "2022-01-30T15:29:00.000000Z",
            }
        ]

我解决了这个问题:

<?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);
    }
}

我得到了每只动物的最后一次考试 ID 并写信给$examinationIds

并使用$examinationIds过滤考试。 过滤后使用pluck('animal_id')获取动物 ID。

然后使用$animalIds过滤$query

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM