将sql raw查询转换为雄辩的关系

时间:2018-04-19 16:05:11

标签: mysql sql laravel laravel-5 eloquent

这是来自this one的后续问题。

县模式:

...
public function freguesias() {
    return $this->hasMany(\App\Freguesia::class, 'id_county');
}
...

现在基本上我的Freguesia模型了:

...
public function county() {
    return $this->belongsTo(\App\County::class, 'id_county');
}

public function weathers() {
    return $this->hasMany(\App\Weather::class, 'id_freg');
}
...

我渴望从县加载这种关系,例如:

$item = County::with(['freguesias' => function($q) {
    $q->with(['weathers']);
}])->select(['id'])->findOrfail(request()->id);

我的主要问题是我必须收集(天气表中最后插入的行id_freg = X)当前天气为属于特定Freguesia的每个Countywhere weathers.id_freg IN (X, Y, Z) ordered by id DESC

我的天气表看起来像:

+--------+-------+---------+
| id     | temp  | id_freg |
+--------+-------+---------+
|    337 | 12.36 |       1 |
|   3556 | 11.46 |       2 |
|   6775 |  9.30 |       3 |
|  10210 |  8.55 |       1 |
|  13429 |  9.69 |       2 |

have already正确的SQL:

select w.* 
from weathers w
where w.id_freg in (X, Y, ...) and
      w.id = (select max(w2.id) 
              from weathers w2 
              where w2.id_freg = w.id_freg
             );

但是如何在急切的加载中实现这一点呢?或者是否还有通过县模型的其他方式?

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是使用有序的session.defaultSession.webRequest.onBeforeRequest关系:

HasOne

这可以正常工作,但在用于预先加载的时候会为freguesias提取所有天气。

使用您的查询的改进版本:

public function weather() {
    return $this->hasOne(\App\Weather::class, 'id_freg')->orderByDesc('id');
}