提问者:小点点

具有一条记录的Laravel/Octobercms负荷关系


我有一个主表“设备”每个设备都与“设备日志”有一对一的关系

设备模型

class Device extends Model
{
    public $hasMany = [
        'devicelogs' => 'Myhome\Myplugin\Models\Devicelog'
    ];
}

DeviceLog模型:

class Devicelog extends Model
{
    public $belongsTo = [
        'device' => 'Myhome\Myplugin\Models\Device'
    ];
}

我想急切地加载设备关系,只有一个记录,以响应该关系的最新日志。

我试过做:

$d = Device::with([
    'devicelogs' => function ($query) {
        $query->latest('created_at')->limit(1)->get();
    }
])->get();

有了这个,我只得到一台设备,它的关系设备日志有一个最新记录。我希望所有设备都有一个设备日志。

我尝试了以下几点:

$d = Device::with([
    'devicelogs' => function ($query) {
        $query->first();
    }
])->get();

有了这个,我只得到一个设备,它的关系devicelogs有一条第一条记录。

当我这样做时:

$d = Device::with([
    'devicelogs' => function ($query) {
        $query->orderBy('created_at','desc');
    }
])->get();

我确实得到了所有设备加载的关系收集在desc顺序。但问题是我不想要整个设备,我只想要每个设备的最新/最后一个。

所以我试着做:

$d = Device::with([
    'devicelogs' => function ($query) {
        $query->orderBy('created_at','desc')->limit(1);
    }
])->get();

这同样只获取最新/最后一个设备日志,其中只有一个设备记录。rest所有设备获取空设备日志关系。

在记录中,每个设备至少有2个或更多devicelog。我想要的是,当我运行即时加载时,为每个设备返回一个和最后一个/最新的devicelog。

我不确定我到底哪里做错了。


共1个答案

匿名用户

有一种方法可以让你从中受益。在Laravel中,您只需定义一个新的关系并使其成为hasOne。

因为OctoberCMS仍然可以使用Laravel风格的关系方法。您可以执行以下操作:;

在您的设备中。php模型

public function latestDeviceLog()
{
    return $this->hasOne('Myhome\Myplugin\Models\Devicelog')->latest();
}

然后你可以访问与。

Device::with('latestDeviceLog')->get();