Laravel中的one()->ofMany()用于“下一个或最后一个”项?

cqoc49vn  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(160)

我有一个项目的出版日期模型时间表,例如电影:电影可以被调度0次或更多次。
我想知道:1)下一个时间表是什么时候,或者如果没有下一个时间表2)最后一次安排电影是什么时候?
对于电影,我有这样的关系:

public function lastScheduleEvent(): HasOne
    {
        return $this->scheduleEvents()->one()->ofMany('starts_at','max');
    }

    public function nextScheduleEvent(): HasOne
    {
        return $this->scheduleEvents()->one()->ofMany([
            'starts_at' => 'max'
        ], function (Builder $query) {
            $query->where('starts_at','>',now());
        }
        );
    }

和一个属性来获取上一个或下一个计划:

protected function nextOrLastScheduleEvent(): Attribute
    {
        return Attribute::make(
            get: fn ($value) => $this->nextScheduleEvent ?? $this->lastScheduleEvent
        );
    }

我可以创建one()->ofMany(...)关系(而不是属性)来获取nextOrLastScheduleEvent吗?
即,是否存在可以与最小/最大聚合器一起使用以获得下一个或最后一个调度事件的查询?

63lcw9qa

63lcw9qa1#

可以,您可以创建一个关系来获取下一个或最后一个计划事件。您可以使用自定义SQL表达式和one()-〉ofMany(...)关系。

public function nextOrLastScheduleEvent(): HasOne
{
    return $this->hasOne(ScheduleEvent::class)
        ->ofMany([
            'priority' => 'min',
        ], function (Builder $query) {
            $query->selectRaw('CASE WHEN starts_at > NOW() THEN 1 ELSE 2 END as priority')
                ->orderBy('starts_at', 'DESC');
        });
}

此代码将首先检查事件是在未来还是在过去。它将优先考虑未来事件。如果没有未来事件,则将选择最近的过去事件。这样,您可以在一个关系中获得下一个或最后一个计划事件。

相关问题