Laravel 加入最新的 pressureMap 入口

Laravel join with latest pressureMap entrance

我有 3 个不同的 MySQL table 具有以下属性:

mattress: id, healthSystemName, building, floor, room, bed, idUSer

患者: id, idMattress, name, surname

pressuremap: id, idMattress, pressureData, presence, created_at, updated_at

我想获取包含以下信息的所有现有床垫的列表,以便将其显示在我在 Laravel (PHP) 中开发的应用程序的仪表板中:

现在,我通过以下功能成功获取了与患者连接的床垫信息,但我需要添加压力图信息:

public function index(){
        $id = Auth::id();

        $mattress = DB::table("mattress")
            ->leftJoin("patient","mattress.id","=","patient.idMattress")
            ->select("patient.id", "patient.name", "patient.surname", "patient.medicalRecordNumber", "patient.visitRecordNumber", "mattress.id", "mattress.healthSystemName","mattress.building","mattress.floor","mattress.room", "mattress.bed")
            ->where('mattress.idUser', '=', $id)
            ->get();

        return view('dashboard',['mattress' => $mattress]);
    }

如何获取这些数据?

我添加了一张图片,说明应该如何显示这些信息以便更好地理解,我已经有了绿色数据,我需要添加黄色数据:

更新: 经过一番挖掘后,我找到了将最新的 pressureMap 添加到床垫的方法,但现在我没有得到空的床垫。 另外我必须提到,您需要在文件 config/database.php 中将 mysql 属性 'strict' 设置为 false。

$latestPressureMap = DB::table('pressuremap')
        ->select('idMattress', DB::raw('MAX(created_at) as last_pressureMap_created_at'), 'presence', 'maxPressure')
        ->groupBy('idMattress');

    $mattress = DB::table('mattress')
        ->joinSub($latestPressureMap, 'latest_pressureMap', function ($join) {
            $join->on('mattress.id', '=', 'latest_pressureMap.idMattress');
        })
        ->leftJoin("patient","mattress.id","=","patient.idMattress")
        ->select("patient.id", "patient.name", "patient.surname", "patient.medicalRecordNumber", "patient.visitRecordNumber", "mattress.id", "mattress.healthSystemName","mattress.building","mattress.floor","mattress.room", "mattress.bed", "patient.gender", "latest_pressureMap.presence", "latest_pressureMap.last_pressureMap_created_at","latest_pressureMap.maxPressure")
        ->where('mattress.idUser', '=', $id)
        ->get();

    return view('dashboard',['mattress' => $mattress]);

试试这个代码:

$mattress = DB::table('mattress')->join('patient', 'mattress.id','=', 'patient.idMattress')
        ->where(['mattress.idUser' => $id])
        ->leftJoin('pressuremap', 'pressuremap.idMattress', '=', 'mattress.id')
        ->select("patient.id", "patient.name", "patient.surname", "mattress.id",
            "mattress.healthSystemName","mattress.building","mattress.floor","mattress.room",
            "mattress.bed", "pressuremap.pressureData", "pressuremap.presence",
            "pressuremap.created_at", "pressuremap.updated_at")
        ->orderBy('created_at', 'DESC')->first();


    return view('dashboard',['mattress' => $mattress]);
}

我没有在 select 中包含 patient.medicalRecordNumber 和 patient.visitRecordNumber,因为您没有说这些列存在于患者 table 中。如果它们确实存在,您可以轻松更改查询。

终于找到方法了:

$latestPressureMap = DB::table('pressuremap')
        ->select('idMattress', DB::raw('MAX(created_at) as last_pressureMap_created_at'), 'presence', 'maxPressure')
        ->groupBy('idMattress');

    $mattress = DB::table('mattress')
        ->leftJoinSub($latestPressureMap, 'latest_pressureMap', function ($join) {
            $join->on('mattress.id', '=', 'latest_pressureMap.idMattress');
        })
        ->leftJoin("patient","mattress.id","=","patient.idMattress")
        ->select("patient.id", "patient.name", "patient.surname", "patient.medicalRecordNumber", "patient.visitRecordNumber", "mattress.id", "mattress.healthSystemName","mattress.building","mattress.floor","mattress.room", "mattress.bed", "patient.gender", "latest_pressureMap.presence", "latest_pressureMap.last_pressureMap_created_at","latest_pressureMap.maxPressure")
        ->where('mattress.idUser', '=', $id)
        ->get();

    return view('dashboard',['mattress' => $mattress]);