如何在 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()
示例)。
另见
如何将其转换为在子查询中使用主查询中的值的 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()
示例)。
另见