【问题标题】:Laravel - Syntax error or access violation: 1066 Not unique table/alias:Laravel - 语法错误或访问冲突:1066 不是唯一的表/别名:
【发布时间】:2019-03-15 02:48:15
【问题描述】:

我在尝试加入多个表时收到此错误消息

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 图

【问题讨论】:

  • 您在连接中使用了 3 次“用户”表。所以他们的别名应该是唯一的。您可以将用户用作首次加入。用户作为 b 用于第二次加入,用户作为 c 用于第三次加入。简而言之,为每个连接使用唯一别名。
  • 您将加入表 users 三次:->join('users', 'doctors.user_id', '=', 'users.id')->join('users', 'patients.user_id', '=', 'users.id'),因此它不是唯一别名。
  • 您是否尝试指定要选择的内容?
  • 药店应该与患者联系在一起,而不是与用户联系在一起。

标签: php laravel


【解决方案1】:

正如其他人正确指出的那样,问题是您已加入 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;
}

这当然假设您已正确设置您的关系。

【讨论】:

  • 我先试试。但是如何选择医生姓名、患者姓名和描述?
  • 我已经试过了。没有输出出现。只是空的,没有错误消息。
  • 查看我的更新答案(第一块代码)。如果可以的话,我强烈建议您使用 Eloquent 路线。
【解决方案2】:

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

【讨论】:

  • 但是如何选择医生姓名、患者姓名和描述?
猜你喜欢
  • 2018-12-07
  • 2015-04-01
  • 2016-02-06
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多