Как получить последнее значение из дочерней таблицы, учитывая родительскую таблицу, используя Eloquent?

#php #laravel #eloquent #element

#php #laravel #eloquent #элемент

Вопрос:

У меня есть две таблицы

Датчики

 <?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
use AppModelsMeasurement;


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

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

}
  

и измерения

 <?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
use AppModelsSensor;


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

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


}
  

Существует один датчик для многих измерений.
То, что я хочу сделать, это получить последние измерения, выполненные для каждого из датчиков
Если у меня есть 3 датчика, я хочу получить последние измерения датчика 1, затем последнее измерение датчика 2 и так далее…

Я пытался сделать это:

 <?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use AppModelsMeasurement;
use AppModelsSensor;
use Inertia;


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

В индексной функции я добился того, что сделал последние измерения в абсолютном выражении, но не последнее измерение для каждого из датчиков, которые у меня есть в базе данных.
Как я могу достичь этой цели?

Ответ №1:

вы можете использовать отношение ‘hasOne’, чтобы получить только одну запись для Senser…

и latest() для сортировки по столбцу created_at

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

}
  

в вашем контроллере вы можете загрузить его нормально

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