Laravel-语法错误或访问冲突:1066不是唯一的表/别名:

时间:2018-10-10 08:39:29

标签: php laravel

尝试连接多个表时收到此错误消息

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 :(得分:3)

正如其他人正确指出的那样,问题是您已经在users表中加入了3次,但是由于它们没有被别名,因此数据库无法区分您尝试使用的表。以任何方式使用它。解决方案是在加入每个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');

这将有效地运行一个查询以选择给定pharmacy_id的所有处方,然后运行后续查询以热切地加载相关患者(及其相关用户)和那些医生(及其相关用户)

如果您不需要加载药房名称或有关该药房或其关联用户的任何其他信息,则无需费心加载它们。如果这样做,只需遵循上述格式并添加即可将它们加载到->with()上,这将导致它们渴望加载。

完成上述操作后,您可以像这样访问患者的姓名:

foreach ($prescriptions as $prescription) {
    echo $prescription->patient->user->name;
}

这当然是假设您的所有关系都正确建立。

答案 1 :(得分:-1)

这是因为您对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();