2016-04-04 40 views
1

私は様々な関係から出力しているデータテーブルを使って作業しています。Laravel 4.2並べ替えの関係による並べ替え

ほとんどのデータはmetersテーブルから得られますが、テーブルはMeterですが、一部はリレーションシップによって他のテーブルから引き出されます。たとえば、calibrationsテーブルによるソートに関する問題があります。

データテーブルには、正常に動作するソート可能な列があります。他のリレーションシップに基づいてソートする列には、結合エラーがなくソートされるように結合があります。

並べ替えと結合はすべて、last_calibration_dateを除いてすべて動作します。

last_calibration_dateという列はありません。実際、各meterは複数のキャリブレーションを持つことができます。

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エラーを返します:私はcalibration_date塔を介してcalibrationsテーブルからこの方法をlast_calibration_dateをつかむMeterモデルで

あなたはそれをソートしないでソートしようとします。ここで

参加で私の試みです:

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で並べ替える別の方法ですか?

+0

5.2にアップグレードすると、過去の状態になります。 –

+0

でも同じ問題があります。 – cookavich

+0

TBH:これはDB :: rawを使用することで頭痛が軽減されます。 –

答えて

1

まあ、まあ、私はなぜ、どうしてその理由を理解することなく、私の問題を解決したようです。

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

これを加えて解決しました。繰り返しますが、理由はわかりません。私の理解は、モデルの関係ではなく、特定のテーブルの列を選択することです。

とにかく、うまくいきます。

関連する問題