如何使用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();