我正在尝试从雄辩的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('AppAnimalMood', 'animal_id')->select(DB::raw('
mood,
animal_id,
MAX(date) as max_date,
'))
->groupBy('stock_id');
但是,当涉及到最高日期时...我出去了...
我已经看过如何在SQL中返回第二条最新记录? 对于一些答案,但无法将其放在关系中 塞纳里奥 也没有将其翻译成雄辩。
理想情况下,我想从我的控制器运行Animal::with('moodPrevious')->get()
和Animal::find(1)->moodPrevious
......
当您查询关系时,我会更改关系并将所有相关模型抓取到您的Animal
模型中。
return $this->hasMany('AppAnimalMood', 'animal_id');
下面返回预先排序的情绪的动物。
$animals = Animal::with(['mood' => function($q){
$q->orderByDesc('date');
}])->get();
Laravel提供了许多与相关模型配合良好的收集方法。我会使用你可以提供给first()
的回调,以便在模型上获得你想要的情绪。您可能已经拥有了所需的特定模型,无论是通过上述集合还是类似的东西。该关系将是一个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。
我认为这会起作用
return $this->hasMany('AppAnimalMood', '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');