我如何在左连接中使用子查询作为 table

How do i use subqueries in a left join as a table

Cakephp 通知我找不到 table 或无法识别别名我应该使用什么?

你好,我是 cake php ORM 的新手,谁能告诉我如何在子查询上执行左连接我真的很想知道如何在工作连接中使用 这是子查询和左连接到目前为止请忽略任何语法错误

$scl = TableRegistry::get('School');
$subquery = $scl->find();

$subquery->select([
    'UID',
    'SID',
    'Total' => $subquery->func()->sum('numberOfStudents')
])->group(['UID, SID']);


$q->select([
    'TeacherID',
    'ClassID',
    'StudentTotal' => 'sq.Total'
])->join([
    'table' => $subquery,
    'alias' => 'sq',
    'type' => 'LEFT',
    'conditions' => ['sq.UID = TeacherID', 'sq.SID = ClassID']
]);

这里是错误:

[PDOException] SQLSTATE[42S22]: Column not found: 1054 Unknown column 'sq.UID' in 'on clause'

问题是基于 ORM 的查询会自动为所选字段设置别名,因此您无法获得

SELECT UID, SID ...

但是

SELECT UID as School__UID, SID as School__SID

因此引用 sq.UID 将失败,因为没有选择这样的字段名称。

为避免此问题,您可以使用与原始字段名称匹配的别名:

->select([
    'UID' => 'UID',
    'SID' => 'SID',
    // ...
])

使用不会自动创建别名的低级别数据库查询:

$subquery = $scl
    ->getConnection() // connection() in older CakePHP versions
    ->newQuery()
    ->from($scl->getTable()); // table() in older CakePHP versions

或参考主查询中的别名字段:

'conditions' => [
    'sq.' . $scl->getAlias() . '__UID = TeacherID', // alias() in older CakePHP versions
    'sq.' . $scl->getAlias() . '__SID = ClassID',
]