1

我正在使用从各种关系输出的数据表。

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

数据表具有可以正常工作的可排序列。基于其他关系排序的列具有适当的连接,以便它们在没有任何查询错误的情况下进行排序。

除了一个,所有排序和连接都有效last_calibration_date

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

Meter模型中,我以这种方式通过列last_calibration_datecalibrations表中获取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

4

1 回答 1

1

好吧,好吧,我似乎已经解决了我的问题,但并没有完全理解为什么。

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.*');已经解决了它。再次,不知道为什么。我的理解是选择特定表的列,而不是模型的关系。

无论如何,它现在正在工作。

于 2016-04-08T16:53:09.280 回答