问题描述
我有两个桌子
传感器
<?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();