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

ovfsdjhp  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(370)

这是这个问题的后续问题。
县模式:

...
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);

我的主要问题是我必须收集(weathers表中插入的最后一行) id_freg = X )目前的天气 Freguesia 属于某个特定的 County . where 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 |

我已经有了正确的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
             );

但是我如何才能实现这一点呢?或者有没有其他的方式通过县模式呢?

stszievb

stszievb1#

最简单的解决方案是使用有序的 HasOne 关系:

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

这项工作,但获取所有的天气为freguesias时,在急加载使用。
使用您的查询的改进版本:

public function weather() {
    return $this->hasOne(\App\Weather::class, 'id_freg')
        ->where('id', function($query) {
            $query->selectRaw('max(id)')
                ->from('weathers as w2')
                ->where('w2.id_freg', DB::raw('weathers.id_freg'));
        });
}

相关问题