我有一张表(weathers
)有几千行,90000 + - 目前,每一行都属于一个位置。
这个表可以有多个属于一个位置的行,但我仍然只想要一个,这是给定位置的最后一个。
我的模型Location
将此关系定义为:
...
public function last_weather() {
return $this->hasOne(\App\Weather::class, 'id_location')->orderBy('weathers.id', 'DESC');
}
...
在我的控制器上,我正在检索last_weather
,如:
...
Location::with(['last_weather'])->findOrfail(1);
...
奇怪的是,这一直有效,直到我在weather
表中有45000 + - 行,我有3200个位置,并且返回的每个位置的最后记录都是40000 + - 行(在id之间) weathers
表中的40000和43000 + -
我检查了我的数据库,并且我在80000上更新了每个位置,但关系是从40000返回数据。这甚至不是每个地点的第一个或最后一个天气。
答案 0 :(得分:3)
您可以在位置模型中执行此操作
public function weathers()
{
return $this->hasMany(\App\Weather::class, 'id_location');
}
public function lastWeather()
{
return $this->weathers()->latest()->first();
}
然后在您的控制器中
$location = Location::findOrfail(1);
然后你可以像这样访问最后的天气
$location->lastWeather();
<强>更新强>
或者您可以调整您急切加载天气的方式
$location = Location::with([
'weathers' => function($query) {
$query->orderBy('id', 'DESC')->first();
},
])
->findOrfail(1);
答案 1 :(得分:1)
Order by将返回所有行,仅为每个匹配条件返回一行,您需要使用Group by
我从未使用过Laravel,但看着你的代码,我猜你的查询应该是这样的:
return $this->hasOne(\App\Weather::class, 'id_location')->groupBy('weathers.id', 'DESC');