Laravel Модель «Много ко многим» и «Один ко многим» и контроллер - PullRequest
1 голос
/ 18 мая 2019

Может ли кто-нибудь помочь мне понять это. Для начала это не дубликат из CRUD и отношение между тремя таблицами / моделями в Laravel .

Есть 2 таблицы Medication_Patient Pivot Table и Med_Time

Сводная таблица Medication_Patient

id       medication_id          patient_id
1         1 (MED X)             1 (Patient X)
2         2 (MED y)             1 (Patient X)
3         2 (MED y)             2 (Patient Y)

И MEdTime, в котором хранится время и где было дано лекарство или нет

  id        med_patient_id(foreign key)    Day      time      given
   1              1                       Yesterday  0900        1
   2              1                       Today      0900        0
   3              1                       Today      2000        0
   4              2                       Today      0600        1 

На моделях, которые у меня есть

class Medication extends Model {
    protected $guarded = [];
    public function patient()
    {
        return $this->belongsToMany('App\Patient');
    } }


class Patient extends Model
{
public function medication()
    {
        return $this->belongsToMany('App\Medication');
    }
}

Чтобы назначить лекарство пациенту

 $assignedMeds = $patient->medication()->get();

но он не дает мне идентификатор сводной таблицы, который мне нужен, чтобы найти время для лекарств, поэтому я использовал (ПОЖАЛУЙСТА, ДАЙТЕ МНЕ ЗНАЮ, ЕСЛИ ЭТО ЛУЧШИЙ СПОСОБ ДЕЛАТЬ ЭТО)

//get the id from medication_patient pivot Table 



 $medPatient = DB::table('medication_patient')->select('id')
                ->Where([
                    ['patient_id','=', $patient->id],
                    ['medication_id' ,'=', $medication->id]
                ])->get()->first;
            $medPatientId = $medPatient->id->id;

  //Using Medication_patient_id to find MedTime       
            $assignedMedTimes = MedTime::where('med_patient_id' ,'=' , $medPatientId)->get();

//Filtering the Med Time according to the day 
            $yesterdayMedTimes = $assignedMedTimes->where('day', '=', 'yesterday')->all();
            $todayMedTimes = $assignedMedTimes->where('day', '=', 'today')->all();
            $tomorrowMedTimes = $assignedMedTimes->where('day', '=', 'tomorrow')->all();


            return view('medicationPatient.medTime', compact('patient','medication'),[
                'assignedMedTimes' => $assignedMedTimes,
                'yesterdayMedTimes' => $yesterdayMedTimes,
                'todayMedTimes' => $todayMedTimes,
                'tomorrowMedTimes' => $tomorrowMedTimes,
            ]);
        }

Но это работает только тогда, когда я получаю Время на 1 лекарство (время Med X, назначенное для пациента X), как мне настроить цикл или отношение в запросе или красноречивом, чтобы получить меня все время лекарства (MED X, время Y для пациента X) и передать его в лезвие.

Извините за длинный пост. Буду признателен, если вы могли бы показать мне код.

Спасибо

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Возможно, вам будет немного сложнее самим переходить к таблице в этом запросе. Если бы это был я, я мог бы немного подумать о рефакторинге базы данных, чтобы упростить это и легко воспользоваться преимуществами отношений и опор Laravel.

Я не уверен, что вам нужно хранить данные в двух отдельных таблицах. Я хотел бы максимально нормализовать и свести это к одной таблице. Вам не нужно повторять себя в таблице Med_Time - таблица med_patient добавляет несколько таблеток, поэтому она служит той же цели, что и таблица med_time (я думаю). Я предлагаю просто таблицу medication_patient с осями:

id       medication_id          patient_id         Day      time      given
1         1 (MED X)             1 (Patient X)    Yesterday  0900        1
2         2 (MED y)             1 (Patient X)    Today      0900        0

Ваши отношения будут такими же, как и у вас, но вы можете нарисовать стержни прямо из модели. Это из Модель пациента , но ваши отношения хороши для обоих в вашем вопросе

public function medication()
    {
        return $this->belongsToMany('App\Medication')->withPivot('Day', 'time', 'given');
    }

Тогда, когда вам нужно получить доступ к данным, просто потяните ось. Пример:

$patient->pivot->Day... or $patient->pivot->time
0 голосов
/ 18 мая 2019

Вы пробовали что-то вроде?

public function patient()
{
  return $this->belongsToMany('App\Patient')->withPivot(['id']);
}
...