laravel - Laravel/Octobercms 急切加载与一条记录的关系
问题描述
我有一个主表“设备”,每个设备都与“设备日志”有 oneToMany 关系
设备型号
class Device extends Model
{
public $hasMany = [
'devicelogs' => 'Myhome\Myplugin\Models\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();
有了这个,我只能得到一个设备,它的关系设备日志有一个第一条记录。
当我做 :
$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();
这再次只获取最新/最后一个设备日志,其中只有一个设备的单个记录。其余所有设备都获得空的 devicelogs 关系。
在记录中,我为每个设备至少有 2 个或更多设备日志。我想要的是在我运行急切加载时为每个设备返回一个和最后一个/最新的设备日志。
我不确定我到底在哪里做错了。
解决方案
有一种方法可以让您从中受益。在 Laravel 中,您只需定义一个新关系并将其设为 hasOne。
由于 OctoberCMS 仍然可以使用 Laravel 风格的关系方法。您可以执行以下操作;
在您的 Device.php 模型中
public function latestDeviceLog()
{
return $this->hasOne('Myhome\Myplugin\Models\Devicelog')->latest();
}
然后你可以访问。
Device::with('latestDeviceLog')->get();
推荐阅读
- azure - 通过 Ansible 创建 VM 并将应用程序部署到 Azure VM
- angularjs - 如何避免在页面加载时显示 AngularJS 指令代码
- wildcard - 删除以字母 S 开头的 4 个字符长的 dos 文件夹
- css - 如何使用 Greensock 缩放和旋转图像?
- kdb - kdb q 根据另一张表中的数据查询一张表中的数据,无需连接
- javascript - Angular 6:使用 ID 将数据添加到数据库
- c++ - 如何检查二维char数组是否有空字
- cuda - 为什么 cufftPlanMany() 会导致分段错误?
- mongodb - 保证跨微服务访问MongoDB中分片集群的数据一致性
- javascript - Req.body 返回错误类型的对象