Как использовать значение основного запроса в качестве фильтра в подзапросе в торт php - PullRequest
0 голосов
/ 08 октября 2019

Как мне перевести это в 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']); 

1 Ответ

0 голосов
/ 08 октября 2019

При использовании синтаксиса 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()).

См. Также

...