【问题标题】:How do I use a main query value as a filter in a Subquery in cake php如何在cake php的子查询中使用主查询值作为过滤器
【发布时间】:2020-02-05 23:05:08
【问题描述】:

如何将其转换为在子查询中使用主查询值的 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 时显示为空白,但如果我手动设置这样的值,它会返回结果

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

【问题讨论】:

    标签: sql cakephp orm cakephp-3.0


    【解决方案1】:

    当使用key => value 语法时,右侧的值将始终受到绑定/转义,除非它是一个表达式对象。因此,您的条件会将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() 示例)。

    另见

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 2012-03-20
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多