Laravel/Octobercms 与一条记录的预加载关系

Laravel/Octobercms eager load relation with one record

我有主菜 table "devices" 每个设备都与 "devicelogs"

有一对多的关系

设备型号

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

我确实让所有设备都按降序加载了关系集合。但问题是我不想要整个设备日志,我只想要 latest/last 每个设备一个。

所以我尝试这样做:

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

这再次只获取 latest/last 个设备日志,其中只有一个设备的单个记录。休息所有设备得到空设备日志关系。

据记录,每个设备至少有 2 个或更多设备日志。 我想要的是当我 运行 急切加载时,每个设备只有一个 last/latest 设备日志到 return。

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

有一种方法可以解决这个问题,您可能会从中受益。在 Laravel 中,您只需定义一个新关系并将其设为 hasOne。

自 OctoberCMS 仍然可以使用 Laravel 样式关系方法。您可以执行以下操作;

在您的 Device.php 模型中

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

然后你就可以访问了。

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