从相关表中获取第二高的日期

时间:2019-12-13 13:34:28

标签: mysql laravel date eloquent

我正在尝试从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 ...

2 个答案:

答案 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');