Какая модель будет возвращена при использовании отношения из расширенной модели? - PullRequest
0 голосов
/ 08 ноября 2019

Рассмотрим следующий сценарий:
Из пакета расширены две модели, отношения между этими моделями определены в пакете.
Например, врач и пациенты:

Доктор в приложении:

namespace App;

use SomePackage\Doctor as VendorDoctor

class Doctor extends VendorDoctor
{
    (...)
}

Пациент в приложении:

namespace App;

use SomePackage\Patient as VendorPatient

class Patient extends VendorPatient
{
    (...)
}

Доктор в упаковке поставщика:

namespace SomePackage;

class Doctor extends Model
{
    public function patients()
    {
        return $this->hasMany(Patient::class);
    }
}

Пациент в упаковке поставщика:

namespace SomePackage;

class Patient extends Model
{
    public function doctor()
    {
        return $this->belongsTo(Doctor::class);
    }
}

Какая модель будет возвращена при использовании отношения?
Пример:

$patient = \App\Patient::find($id);
$doctor = $patient->doctor;

Будет ли $doctor App \ Doctor с функциями, доступными для этой модели, или SomePackage \ Doctor?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

По умолчанию он вернет SomePackage\Doctor, потому что этот код в SomePackage:

public function patients()
    {
        return $this->hasMany(Patient::class);
    }

Здесь Patient::class - это специальная константа, которая содержит полный путь (с пространством имен) к классу Patient. Он содержит что-то вроде SomePackage\Patient, этот путь принадлежит самому пакету. Таким образом, вы не можете изменить его, только используя другой класс с тем же именем.

Но вы можете redefine весь метод внутри вашего App\Doctor класса.

namespace App;

use SomePackage\Doctor as VendorDoctor

class Doctor extends VendorDoctor
{
    public function patients()
    {
        return $this->hasMany(\App\Patient::class);
    }
}

Послечто App\Doctor вернет связь с App\Patient.

$doctor = \App\Doctor::find($id);
$patient = $doctor->patient;
//$patient containt Collection of App\Patient models

На самом деле вам даже не нужно определять полный \App\Patient:class путь, потому что здесь вы уже находитесь в App пространстве имен, я просто добавляюэто для лучшего понимания.

1 голос
/ 08 ноября 2019

По умолчанию это будет SomePackage\Doctor. Вы можете переопределить отношения, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...