orderOy中的orderOne关系并不起作用

时间:2017-12-11 19:06:49

标签: php laravel eloquent laravel-5.5

我有一张表(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返回数据。这甚至不是每个地点的第一个或最后一个天气。

2 个答案:

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