【问题标题】:How to use max in laravel local scope?如何在 laravel 本地范围内使用 max?
【发布时间】:2021-11-21 23:49:52
【问题描述】:

我有 2 个模型 TemperatureTemperatureReading

Temperature 列:

name
id
threshold

TemperatureReading 列:

name
id
temperature_id
reading

使用Temperature 中的范围,我如何返回与以下查询匹配的Temperature 集合:

select *
from temperatures
where temperatures.threshold < 
(
   select max(reading) 
   from temperature_readings
   where temperature_readings.temperature_id = temperatures.id
)

谢谢!

【问题讨论】:

    标签: php laravel scope nested-queries


    【解决方案1】:

    如果我理解正确,您基本上想要检索存在读数超过阈值的所有温度对象。这实际上并不需要使用 max 函数。

    我希望您已经从您的 Temperature 模型与您的 TemperatureReading 模型建立了关系?如果没有,这将是一个很好的起点:

    public function readings() {
        return $this->hasMany(TemperatureReading::class);
    }
    

    您现在可以使用此关系在您的 Temperature 模型中创建范围:

    public function scopeExceededTreshold($query) 
    {
        return $query->whereHas('readings', function($builder){
            $builder->whereRaw('temperatures.treshold < temperature_readings.reading');
        });
    }
    

    这将基本上查询任何超过阈值的读数的关系,并仅返回满足该条件的温度。您可能需要根据实际的表名和列名调整 where 子句中的这些名称。

    现在,您可以简单地使用控制器(或任何地方)中的范围来仅获取这些温度:

    Temperature::exceededTreshold()->get()
    

    仅供参考,这是生成的 SQL(应该提供正确的结果):

    select
        *
    from
        temperatures
    where
        exists (
            select
                *
            from
                temperature_readings
            where
                temperatures.id = temperature_readings.temperature_id
                and temperatures.treshold < temperature_readings.reading
        )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多