首页 > 解决方案 > 在范围约束中使用相关模型

问题描述

我有一个 File 模型,它代表存储在磁盘上的文件。

磁盘上的文件充当缓存,当请求文件时,如果文件存在则从磁盘提供,否则动态生成。

这些文件属于使用多态关系的其他模型(例如,一个项目可以有多个文件)。

如果它们的父模型在生成后已更新,则这些文件会变得陈旧并且必须重新生成。

我正在使用范围来检索与模型相关的文件,这些文件仍然是最新的(不是陈旧的)。

public function scopeCurrent($query, Model $compareWith)
{
    $query->where('updated_at', '>', $compareWith->updated_at);
}

我可以按如下方式获取模型的当前记录:

$model->files()->current($model)->get()

这很好用,但是必须将父模型传递给范围才能使用它似乎很麻烦。但是,scope 方法在 File 模型的已启动实例上运行,因此它无法直接访问它。(在 scope 函数中,$this 是一个没有 ID、属性或关系的空文件模型)。

我花了一些时间浏览文档,但我不知道如何使它工作。

我觉得这篇文章可能是关键,但老实说,我正在努力解决它。

https://nullthoughts.com/development/2019/10/08/dynamic-scope-on-latest-relationship-in-laravel/

标签: laraveleloquenteloquent-relationship

解决方案


我想你的关系看起来和这个相似。

class Model {
    public function files () {
        return $this->hasMany(File::class);
    }
}

为什么不使用查询条件添加另一个关系,而不是使用范围路由?

class Model {
    ...

    public function currentFiles() {
        return $this->hasMany(File::class)->where('updated_at', '>', $this->updated_at);
    }
}

我不确定这是正确的方法,但它觉得这是一种替代解决方案。


推荐阅读