如何在 cake php 的子查询中使用主查询值作为过滤器

How do I use a main query value as a filter in a Subquery in cake php

如何将其转换为在子查询中使用主查询中的值的 orm 这是我的 sql 子查询

(select ups.username from users as ups where ups.id=student_id) as StudentName

我的主要查询从内部联接获取 student_id 这是我的 Orm 子查询

    ->select([
        'StudentName'=>'Users.username'])
    ->where(['Users.id'=>'students.studentid']); 

当我 运行 时,查询 StudentName 显示为空白,但如果我像这样手动设置值,它 returns 结果

    ->select([
        'StudentName'=>'Users.username'])
    ->where(['Users.id'=>'55']); 

使用 key => value 语法时,右侧的值将始终受 binding/escaping 的约束,除非它是表达式对象。因此,您的条件会将 Students.student_id 绑定为文字字符串,或者可能绑定为整数,即您最终会得到 SQL,例如:

WHERE Users.id = 'Students.student_id'

WHERE Users.id = 0

要么传递一个 \Cake\Database\Expression\IdentifierExpression 对象,例如:

->where(['Users.id' => $mainQuery->identifier('Students.student_id')])

或者在旧的 CakePHP 版本中:

->where(['Users.id' => new \Cake\Database\Expression\IdentifierExpression('Students.student_id')])

或者使用支持比较字段的表达式构建器:

->where(function(\Cake\Database\Expression\QueryExpression $exp) {
    return $exp->equalFields('Users.id', 'Students.student_id');
})

高级条件文档中有一个适用于您的用例的示例(请参阅 exists() 示例)。

另见