【问题标题】:Using related model in scope constraint在范围约束中使用相关模型
【发布时间】:2021-03-22 21:47:18
【问题描述】:

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

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

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

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

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

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

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

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

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

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

我觉得这篇文章可能是关键,但老实说,我很难理解它。

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

【问题讨论】:

    标签: laravel eloquent eloquent-relationship


    【解决方案1】:

    我想你的关系看起来像这样。

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

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

    【讨论】:

    • 关系使用morphMany,但我认为这是一个微不足道的细节。是的,我期望单独的关系会很好。我最近才开始使用范围,我认为这将是保持关系清洁的好方法。我想这并没有太大的不同。感谢您的输入。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 2014-05-21
    相关资源
    最近更新 更多