#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();