Laravel 4.2按隐性关系问题分类



我正在处理一个从各种关系输出的数据表。

大多数数据来自具有Meter模型的meters表,但其中一些数据是通过关系从其他表中提取的。例如,我在按calibrations表排序时遇到问题。

数据表中有一些可排序的列,它们运行得很好。基于其他关系排序的列具有适当的联接,因此它们排序时不会出现任何查询错误。

除了一个last_calibration_date之外,所有的排序和联接都起作用。

没有名为last_calibration_date的列。事实上,每个meter可以有多个校准。

Meter模型中,我通过calibration_date列从calibrations表中获取last_calibration_date,方法如下:

public function getLastCalibrationDateAttribute()
{
    if (isset($this->relations['calibrations']) && $this->relations['calibrations']->count())
        return $this->relations['calibrations']->sortBy('calibration_date', SORT_REGULAR, true)->first()->calibration_date->format('Y-m-d');
}

当我不按last_calibration_date列排序时,这种方法非常有效,但如果您尝试在没有联接的情况下按它排序,则会返回一个sql错误。

以下是我的加入尝试:

if ($sort == 'last_calibration_date')
{
    $query->join('calibrations', 'calibrations.meter_id', '=', 'meters.id');
    $sort = 'calibrations.calibration_date';
}

虽然这不会返回错误,但也不会返回实际的last_calibration_date

只要多一点信息,calibrations表的设置就像一样

calibrations
- id
- calibration_date
- next_calibration_date
- meter_id

因此,正如前面所说,任何仪表都可能有多次校准。

关于如何在我的加入中复制我的Meter方法,有什么想法吗?或者可能是last_calibration_date的另一种排序方式?

Alrighty,好吧,我似乎已经解决了我的问题,但不太明白为什么。

if ($sort == 'last_calibration_date')
{
     $query->select('meters.*');
     $query->join('calibrations as calibration', 'calibration.meter_id', '=', 'meters.id');
     $sort = 'calibration.calibration_date';
}

加上$query->select('meters.*');已经解决了这个问题。再次,不确定为什么。我的理解是,选择特定表的列,而不是模型的关系。

不管怎样,它现在起作用了。

最新更新