laravel - 在范围约束中使用相关模型
问题描述
我有一个 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/
解决方案
我想你的关系看起来和这个相似。
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);
}
}
我不确定这是正确的方法,但它觉得这是一种替代解决方案。
推荐阅读
- sage - SageMath - 预先组合一个向量值函数
- javascript - 在剧作家测试中切换标签
- amazon-web-services - API 网关中的缓存配置
- javascript - 如何在javascript中仅旋转画布的一部分?
- ios - TestFlight 外部测试中的“ITMS-90853:无效字体”
- jquery - 我们如何使用这个关键字在 div 中选择输入元素
- opengl - 网格颜色混乱可能是由于顶点法线计算错误
- android - BLE的用户级别是否需要数据验证检查?
- java - 来自 application.properties 的整数
- javascript - 如何确认对话框以在 TestCafe 中打开另一个应用程序