我正在尝试从Eloquent Laravel 6的关系表中获取第二高的日期。
MoodTable
id animal_id date mood
1 1 2019-12-14 happy
2 1 2019-12-11 drunk
3 1 2019-12-13 sad
AnimalTable
id name
1 Dog
因此,例如,我希望能够查询:“今天的狗很高兴。首先是他喝醉了。
要获取我使用的最高价:
return $this->hasMany('App\AnimalMood', 'animal_id')->select(DB::raw('
mood,
animal_id,
MAX(date) as max_date,
'))
->groupBy('stock_id');
但是,当涉及到第二个最高日期时...我不在了...
我看过How to return second newest record in SQL? 以获得一些答案,但无法将其放入恋爱关系中,也无法将其翻译为雄辩。
理想情况下,我想从控制器运行Animal::with('moodPrevious')->get()
和Animal::find(1)->moodPrevious
...
答案 0 :(得分:1)
我会更改关系,并在您查询Animal
模型时获取所有相关模型。
return $this->hasMany('App\AnimalMood', 'animal_id');
以下返回的动物具有预先排序的情绪。
$animals = Animal::with(['mood' => function($q){
$q->orderByDesc('date');
}])->get();
Laravel提供了许多与相关模型配合使用的收集方法。我将使用您可以提供给first()
的回调,以获取所需的模型情绪。通过讲授以上集合或类似内容,您可能已经有了所需的特定模型。该关系将是一个collection
实例,因此我们使用collection方法来获取所需的mood
。
$previousMood = $animal->mood->first(function($value, $key){
return $key == 1 // You can use whatever here, this will return the second item on the relation, or the previous mood.
});
有关参考,请参见https://laravel.com/docs/5.8/collections#method-first。
答案 1 :(得分:0)
我认为这会起作用
return $this->hasMany('App\AnimalMood', 'animal_id')
->select(
DB::raw('
mood,
animal_id,
MAX(date) as max_date,
')
)
->where(
DB::raw("
date = (
SELECT
MAX(date)
FROM animal_moods
WHERE date < (
SELECT
MAX(date)
FROM
animal_moods
)
)
")
)
->groupBy('stock_id');