Laravel присоединяется к последнему входу - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть 3 разные таблицы MySQL со следующими атрибутами:

матрас: id, healthSystemName, здание, этаж, комната, кровать, idUSer

Patient: ID, idMattress, имя, фамилия

Карта давления: ID, idMattress, PressureData, присутствие, creation_at, updated_at

Я хочу получить списоквсе матрасы, существующие со следующей информацией, чтобы показать его на панели инструментов моего приложения, разработанного в Laravel (PHP):

  • Он должен быть соединен с таблицей пациентов (mattress.id = Patient.idMattress).
  • Он должен быть объединен с таблицей давления (displaymap.idMattress = mattress.id)
  • Мне нужна только информация о последней карте давления (упорядочено по потомку Pressure.created_at, предел 1)
  • Возможно, матрас не имеет назначенного пациента и / или карты давления.В этом случае должна быть строка со значениями, относящимися к пациенту, и карта давления, равная нулю
  • В SELECT должно быть: mattress.id, имя-пациента, имя-пациента, имя-пациента, preassuremap.presence, preassuremap.created_at

Прямо сейчас мне удалось получить информацию о матрасе, объединенном с пациентами, с помощью следующей функции, но мне нужно добавить информацию о карте давления:

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]);
    }

Как получитьэти данные?

Я добавляю изображение того, как эта информация должна отображаться для лучшего понимания, где у меня уже есть зеленые данные, и мне нужно добавить желтые: enter image description here

ОБНОВЛЕНИЕ: После того, как я немного покопался, я нашел способ добавить самую последнюю карту давления на матрас, но теперь я не получаю пустой матрас.Также я должен упомянуть, что в файле 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]);

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Наконец я нашел путь:

$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]);
0 голосов
/ 05 декабря 2018

Попробуйте этот код:

$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]);
}

Я не включил Patient.medicalRecordNumber и Patient.visitRecordNumber в выбор, так как вы не сказали, что эти столбцы существуют в таблице пациента.Если они существуют, вы можете легко изменить запрос.

...