Laravel 4.2 按 Eloquent 关系问题排序
Laravel 4.2 Sort by Eloquent Relationship Problems
我正在处理从各种关系输出的数据table。
大部分数据来自具有 Meter
模型的 meters
table,但其中一些数据是通过关系从其他 table 中提取的。例如,我在按 calibrations
table.
排序时遇到问题
数据table 的 sortable 列工作得很好。基于其他关系排序的列具有适当的连接,因此它们可以在没有任何查询错误的情况下进行排序。
除了 last_calibration_date
之外的所有排序和连接都有效。
没有名为 last_calibration_date
的列。事实上,每个 meter
可以有多个校准。
在 Meter
模型中,我通过 calibration_date
列从 calibrations
table 中获取 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
列排序时,这非常有效,但是 return 如果您尝试在没有连接的情况下按它排序,则会出现 sql 错误。
这是我加入的尝试:
if ($sort == 'last_calibration_date')
{
$query->join('calibrations', 'calibrations.meter_id', '=', 'meters.id');
$sort = 'calibrations.calibration_date';
}
虽然这不是 return 错误,但它也不是 return 实际的 last_calibration_date
。
多一点信息,calibrations
table 是这样设置的
calibrations
- id
- calibration_date
- next_calibration_date
- meter_id
因此,如前所述,任何仪表都可以进行多次校准。
关于如何在我的连接中复制我的 Meter
方法有什么想法吗?或者另一种按 last_calibration_date
?
排序的方法
好吧,好吧,我似乎已经解决了我的问题,但不太明白为什么。
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.*');
就解决了。再次,不知道为什么。我的理解是选择特定的 table 列,而不是模型的关系。
无论如何,它现在正在工作。
我正在处理从各种关系输出的数据table。
大部分数据来自具有 Meter
模型的 meters
table,但其中一些数据是通过关系从其他 table 中提取的。例如,我在按 calibrations
table.
数据table 的 sortable 列工作得很好。基于其他关系排序的列具有适当的连接,因此它们可以在没有任何查询错误的情况下进行排序。
除了 last_calibration_date
之外的所有排序和连接都有效。
没有名为 last_calibration_date
的列。事实上,每个 meter
可以有多个校准。
在 Meter
模型中,我通过 calibration_date
列从 calibrations
table 中获取 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
列排序时,这非常有效,但是 return 如果您尝试在没有连接的情况下按它排序,则会出现 sql 错误。
这是我加入的尝试:
if ($sort == 'last_calibration_date')
{
$query->join('calibrations', 'calibrations.meter_id', '=', 'meters.id');
$sort = 'calibrations.calibration_date';
}
虽然这不是 return 错误,但它也不是 return 实际的 last_calibration_date
。
多一点信息,calibrations
table 是这样设置的
calibrations
- id
- calibration_date
- next_calibration_date
- meter_id
因此,如前所述,任何仪表都可以进行多次校准。
关于如何在我的连接中复制我的 Meter
方法有什么想法吗?或者另一种按 last_calibration_date
?
好吧,好吧,我似乎已经解决了我的问题,但不太明白为什么。
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.*');
就解决了。再次,不知道为什么。我的理解是选择特定的 table 列,而不是模型的关系。
无论如何,它现在正在工作。