Я знаю, что тема немного запутанная. Позволь мне объяснить.
Для медицинского программного обеспечения, которое я сейчас разрабатываю, у меня есть структура данных, как показано ниже:
У пациентов есть протоколы. Протоколы содержат экзамены, предписания или отчеты, все полиморфные.
В некоторых случаях мне необходимо получить прямой доступ к обследованиям пациентов. Однако, поскольку это включает полиморфную связь между Исследованием и Протоколом, я не могу напрямую настроить метод связи в моей модели Пациент.
В качестве обходного пути я могу установить пользовательский getExaminationsAttribute
и добавить к нему $appends
в модели Patient. Но это вызывает целую загрузку выборки данных, когда я пытаюсь получить, например, только name
Patient.
Любая помощь приветствуется.
Модель Пациент:
class Patient extends Model{
protected $table = 'patients';
public function protocols(){
return $this->hasMany('App\Protocol', 'patients_id', 'id');
}
protected $appends = ['examinations'];
public function getExaminationsAttribute()
{
$examinations = array();
$this->protocols->each(function($protocol) use (&$examinations){
$protocol->examinations->each(function($examination) use (&$examinations){
$examinations[] = $examination->toArray();
});
});
return $examinations;
}
Модель протокола:
class Protocol extends Model{
protected $table = 'protocols';
public function patient(){
return $this->belongsTo('App\Patient', 'patients_id', 'id');
}
public function examinations()
{
return $this->morphedByMany('App\Examination', 'protocolable');
}
Модель экзамена:
class Examination extends Model{
protected $table = 'examinations';
public function protocols()
{
return $this->morphToMany('App\Protocol', 'protocolable');
}