【问题标题】:Laravel Left Join QueryLaravel 左连接查询
【发布时间】:2016-11-18 17:26:11
【问题描述】:

我使用的是 laravel 5.3,我有一些左连接查询,在 laravel 查询方法中有错误。 这是我的正常查询

 SELECT bran.branchName,sch.schoolName From m_schoolbranch bran
LEFT JOIN m_students stu ON stu.schoolNo=bran.schoolNo AND stu.branchNo=bran.branchNo  
LEFT JOIN m_school sch ON sch.schoolNo=stu.schoolNo where stu.userNo='0000000001';

这是我的新 laravel 查询

DB::table('m_schoolbranch')
            ->join('m_students', 'm_schoolbranch.schoolNo', '=', 'm_students.schoolNo')
            ->join('m_students', 'm_schoolbranch.branchNo', '=', 'm_students.branchNo')
            ->join('m_school', 'm_schoolbranch.schoolNo', '=', 'm_school.schoolNo')
            ->select('m_school.schoolName', 'm_schoolbranch.branchName')
            ->where('m_students.userNo',$userNo)
            ->get();

在这些查询中,我需要匹配表 m_students 中的两列,所以我这样写

->join('m_students', 'm_schoolbranch.branchNo', '=', 'm_students.branchNo')

但我显示错误...

【问题讨论】:

  • 错误说明了什么?
  • Connection.php 第 729 行中的 QueryException:SQLSTATE[42000]:语法错误或访问冲突:1066 不是唯一的表/别名:'m_students'(SQL:选择 m_school.schoolName,@ 987654326@.branchName 来自m_schoolbranch 内连接m_studentsm_schoolbranch.schoolNo = m_students.schoolNo 内连接@9876543@34@ 上@987654336.=@987654336.=@9876 987654338@ 内部连接 ​​m_school m_schoolbranch.schoolNo = m_school.schoolNo 其中m_students.userNo = 0000000001)

标签: laravel-5


【解决方案1】:

查询中的表需要有唯一的名称,否则数据库无法知道在评估m_schoolbranch.schoolNo 时应该使用哪个m_schoolbranch

您可以在联接语句中使用唯一的表别名,但我建议在联接中使用多个条件。就像您在原始 SQL 查询中使用的一样。见这里:https://*.com/a/20732468/4437888

【讨论】:

    【解决方案2】:
    DB::table('m_schoolbranch')
                ->join('m_students', function($join)
                    {
                        $join->on('m_schoolbranch.schoolNo', '=', 'm_students.schoolNo');
                        $join->on('m_schoolbranch.branchNo', '=', 'm_students.branchNo');
                    })
                ->join('m_school', 'm_schoolbranch.schoolNo', '=', 'm_school.schoolNo')
                ->select('m_school.schoolName', 'm_schoolbranch.branchName')
                ->where('m_students.userNo',$userNo)
                ->get();
    

    【讨论】: