首页 > 解决方案 > 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 个或更多设备日志。我想要的是在我运行急切加载时为每个设备返回一个和最后一个/最新的设备日志。

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

标签: laraveloctobercms

解决方案


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

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

在您的 Device.php 模型中

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

然后你可以访问。

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

推荐阅读