Как правильно отметили другие, проблема в том, что вы присоединились к таблице users
три раза, но, поскольку они не имеют псевдонимов, ваша база данных не может определить, какую таблицу вы имеете в виду, когда пытаетесь ее использовать.в любом случае.Решением будет псевдоним каждой таблицы users
, когда вы присоединитесь к ним.Например:
$prescriptions = DB::table('prescriptions')
->join('doctors', 'prescriptions.doctor_id', '=', 'doctors.id')
->join('users as du', 'doctors.user_id', '=', 'du.id')
->join('patients', 'prescriptions.patient_id', '=', 'patients.id')
->join('users as pu', 'patients.user_id', '=', 'pu.id')
...
->get([
'du.name as doctor_name',
'pu.name as patient_name',
'prescriptions.description as description'
]);
Чтобы получить имя доктора, например:
foreach ($prescriptions as $prescription) {
echo $prescription->doctor_name;
}
Однако я бы предложил сделать это с Eloquent вместо этого:
$prescriptions = Prescription::where('pharmacy_id', $pharmacyId)
->with('patient', 'patient.user', 'doctor', 'doctor.user');
Thisэффективно выполнит один запрос, чтобы выбрать все рецепты по данному pharmacy_id
, а затем выполнит последующие запросы для активной загрузки связанных пациентов (и их ассоциированных пользователей) и тех врачей (и связанных с ними пользователей).
Если вам не нужно загружать название аптеки или любую другую информацию о аптеке или ее ассоциированном пользователе, вам не нужно загружать их. Если вы это сделаете, это просто, как следовать приведенному выше формату и добавить их в->with()
, который приведет к тому, что они будут загружены.
После выполнения вышеизложенного вы можете получить доступ к имени пациента, например так:
foreach ($prescriptions as $prescription) {
echo $prescription->patient->user->name;
}
Это, конечно, предполагает, что у вас есть ваши отношениявсе правильно настроено.