Laravel - Синтаксическая ошибка или нарушение доступа: 1066 Не уникальная таблица / псевдоним: - PullRequest
0 голосов
/ 10 октября 2018

Я получил это сообщение об ошибке при попытке объединить несколько таблиц

Illuminate \ Database \ QueryException (42000)
SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'users' (SQL: select * from `prescriptions` inner join `doctors` on `prescriptions`.`doctor_id` = `doctors`.`id` inner join `users` on `doctors`.`user_id` = `users`.`id` inner join `patients` on `prescriptions`.`patient_id` = `patients`.`id` inner join `users` on `patients`.`user_id` = `users`.`id` inner join `pharmacies` on `prescriptions`.`patient_id` = `pharmacies`.`id` inner join `users` on `pharmacies`.`user_id` = `users`.`id` where `prescriptions`.`pharmacy_id` = 1)

Мой код такой

$prescriptions = DB::table('prescriptions') 
        ->join('doctors', 'prescriptions.doctor_id', '=', 'doctors.id')
        ->join('users', 'doctors.user_id', '=', 'users.id')
        ->join('patients', 'prescriptions.patient_id', '=', 'patients.id')
        ->join('users', 'patients.user_id', '=', 'users.id')
        ->join('pharmacies', 'prescriptions.patient_id', '=', 'pharmacies.id')
        ->join('users', 'pharmacies.user_id', '=', 'users.id')
        ->where('prescriptions.pharmacy_id',$pharmacy->id)
        ->get();

Моя диаграмма ERD

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Как правильно отметили другие, проблема в том, что вы присоединились к таблице 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;
}

Это, конечно, предполагает, что у вас есть ваши отношениявсе правильно настроено.

0 голосов
/ 10 октября 2018

это потому, что вы используете один и тот же псевдоним для 3 объединений .. это будет делать:

$prescriptions = DB::table('prescriptions') 
    ->leftJoin('doctors', function($join){
        $join->join('users as a', 'doctors.user_id', '=', 'a.id');
    })
    ->leftJoin('patients', function($join){
        $join->join('users as b', 'patients.user_id', '=', 'b.id');
    })
    ->join('pharmacies', function($join){
        $join->join('users as c', 'pharmacies.user_id', '=', 'c.id');
    })
    ->where('prescriptions.pharmacy_id',$pharmacy->id)
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...