微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用Eloquent从考虑父表的子表中获取最后一个值?

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。