考虑到父 table 使用 Eloquent,如何从子 table 获取最后一个值?

How to get the last value from a child table considering the parent table using Eloquent?

我有两张桌子

传感器

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\Measurement;


class Sensor extends Model
{
    use HasFactory;
    protected $table = 'sensors';

    public function measurements(){
        return $this->hasMany(Measurement::class);
    }

}

和测量

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\Sensor;


class Measurement extends Model
{
    use HasFactory;
    protected $table = 'measurements';

    public function sensor() {
        return $this->belongsTo(Sensor::class);
    }


}

一个传感器可进行多项测量。 我想要做的是检索为每个传感器完成的最后测量 如果我有 3 个传感器,我想要传感器 1 的最后一次测量,然后是传感器 2 的最后一次测量,依此类推...

我试过这样做:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Measurement;
use App\Models\Sensor;
use Inertia;


class SensorsController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $sensors = Sensor::with( ['measurements' => function ($query) {
            $query->latest('created_at')->first();
        } ] )->get();
        
        return Inertia\Inertia::render('Sensor', compact('sensors'));
    }

在索引函数中,我实现的是对数据库中的每个传感器进行绝对的最后一次测量,而不是最后一次测量。 我怎样才能达到这个目的?

您可以使用 'hasOne' 关系只获取 Senser 的一条记录 ...

和 latest() 按 created_at 列排序

class Sensor extends Model
{
  
    public function lastMeasurement(){
        return $this->hasOne(Measurement::class)->latest();
    }

}

在你的控制器中你可以正常加载它

  $sensors = Sensor::with( ['lastMeasurement' ] )->get();