2017-05-01 11 views
2

서브 쿼리 작업 방법을 찾는 데 어려움을 겪고 있습니다.조건의 두 필드/열을 비교하는 방법은 무엇입니까?

$schools 
     ->select($this->Schools) 
     ->select([ 
      'pupilcount' => $this->Pupils 
       ->find() 
       ->select([ 
        $this->Pupils->find()->func()->count('*') 
       ]) 
       ->where([ 
        'Pupils.school_id' => 'Schools.id', 

       ]), 

의 I가 경험하고 문제를 (내 생각) Schools.id는 항상 0입니다 그래서 카운트가 나는 학생들이 참여 꺼내 수 0으로 반환됩니다이며 학생들를 보여줍니다

나는이 상상 그곳에.

는 내가 추가 내 코드를 변경 시도 :

->select(['SCID' => 'Schools.id']) 

작동하지 않는 하위 쿼리에 있지만, 그것은 항상 pupilcount 0을 반환 할 것을 참조.

내가 뭘 잘못하고 있니?

+0

확인 참조 생성 된 SQL 표현 개체가 아니라면 조건의 오른쪽은 항상 매개 변수로 바인딩됩니다. 즉 문자열 리터럴과 비교할 수 있습니다. – ndm

+0

오우 그래서 표현해야하니? 왜냐하면 그렇기 때문에 SQL에서 – Sammaye

+0

@ndm이라는 것을 볼 수 있습니다. Expression 개체의 함수를 살펴 보았지만 선택할 수있는 함수가 무엇인지 확실하지 않습니다.이 함수는 "indentifier로 처리하지 마십시오."라는 메시지를 볼 수 없습니다. – Sammaye

답변

5

쿼리 문제가 발생할 때마다 실제로 생성되는 쿼리를 확인하십시오 (예 : DebugKit). 열 이름은 식별자해야 호환성을 인용 일반적으로 적절한 자동차에 대한

Pupils.school_id = 'Schools.id' 

: 표현 객체 인하지 않는 한, 조건의 오른쪽은 항상 문자열 리터럴에 대해 비교하고, 즉, 매개 변수로 바인딩됩니다 표현. 왼손 쪽이 자동으로 올바르게 처리되지만 오른쪽은 수동으로 처리해야합니다.

->where(function (\Cake\Database\Expression\QueryExpression $exp) { 
    return $exp->equalFields('Pupils.school_id', 'Schools.id'); 
}) 

그것은 단순히 인스턴스화하여 수동으로 식별자 식을 만들 수도 있습니다 특정 경우

쉽게 정확히 당신이 일을하려고 비교하는 필드/열의, 표준 인 QueryExpression::equalFields()을 활용할 수 그들 :

->where([ 
    'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id') 
]) 

그리고 마지막으로 당신은 또한 항상 그러나이 경우 식별자가 인용 자동 식별자에 적용 대상이되지 않는다, 기본적으로 원시 SQL과 같은 쿼리에 삽입되는 단일 문자열 값을 전달할 수 :

->where([ 
    'Pupils.school_id = Schools.id' 
]) 

+0

Aha 완벽 해, 고마워.나는 아직도 가서 케이크를 배울 정도로 멍청하다. – Sammaye

+0

나는 요리 책을 보지만 나는 '평등 한 열매'를 찾을 수 없다. 어떻게이 음식을 찾았나요? – Sammaye

+2

@Sammaye 요리 책은 완전한 API를 다루지는 않지만 일반적인 개념과 가장 관련성이 높은 주제를 다룹니다. 조건 추가 방법에 대한 일반적인 개념을 알고 있다면 QueryExpression API를 검사 할 때 비틀 거립니다 (Cookbook의 예제가 IDE 완성/검사를 지원하기 위해 적절한 유형 힌팅을 사용하면 문제가되지 않을 것이라고 생각합니다) . 내가 개인적으로 어떻게 찾았는지 알고 싶으면 항상 물건을 사용하기 전에 API 문서와 소스 코드를 공부하고있다. CakePHP의 경우 나는 또한 가끔 기여자이기 때문에 집중적으로 소스를 연구했다. – ndm