2017-10-24 1 views
1

테이블 : 서비스CakePHP의 3 - 쿼리 빌더가 제대로 hasMany의 협회 작동하지

+-----+--------------+ 
| id | title  | 
+-----+--------------+ 
| 1 | Service 1 | 
+-----+--------------+ 
| 2 | Service 2 | 
+-----+--------------+ 

테이블 : 워크샵 {hasMany의 WorkshopServices}

+-----+---------------+ 
| id | title  | 
+-----+---------------+ 
| 1 | Workshop 1 | 
+-----+---------------+ 
| 2 | Workshop 2 | 
+-----+---------------+ 

테이블 : WorkshopServices

+-----+--------------+-------------+ 
| id | workshop_id | service_id | 
+-----+--------------+-------------+ 
| 1 | 1   | 1   | 
+-----+--------------+-------------+ 
| 2 | 1   | 2   | 
+-----+--------------+-------------+ 
내가 service_id

내 쿼리에 의해 Workshops를 찾으려면

$this->Workshops->find() 
    ->contain([ 
     'WorkshopServices' 
    ]) 
    ->where([ 
     'WorkshopServices.service_id IN'=>[1,2,3] 
    ]); 
,515,

쿼리 결과하면

Unknown column `WorkshopServices.service_id` in 'where clause' 

사실 WorkshopsWorkshopServices 테이블 임의 JOIN 생성되지 않는다.

Query Builder에서 올바른 결과를 얻으려면 어떻게 쿼리를 작성할 수 있습니까?

답변

2

나는 GabrielFerreira의 쿼리 @ 업데이트 WorkshopServices.workshop_id에 의해 행을 그룹화하면,이 솔루션은 내 문제

$array = [1,2,3]; 

$this->Workshops->find() 
    ->select([ 
      'title'=>'Workshops.title', 
      'id'=>'Workshops.id', 
    ]) 
    ->matching('WorkshopServices', function ($q) use($array) { 
     return $q->where(['WorkshopServices.service_id IN' => $array]); 
    }) 
    ->group(['WorkshopServices.workshop_id']); 
2

사용 매칭 :

$array = [1,2,3]; 

$this->Workshops->find() 
    ->matching('WorkshopServices', function ($q) use($array) { 
     return $q->where(['WorkshopServices.service_id IN' => $array]) 
    }); 
+0

을 충족하지만 가끔은'중복을 반환 워크샵되어 배열 결과 '(여러 서비스를 선택할 때) :(귀하의 질의를 업데이트하십시오 ... –

+0

일치하기 전에 별명을 사용하십시오 –

+0

@GabrielFerreira, Workshop을 제공하는 WorkshopService는 하나만 반환합니까? 이 질문에서 완전히 명확하지는 않지만, OP는 모든 서비스가 워크숍과 관련되기를 바랄 것입니다. 한 가지 해결책은 표시된 기능을 사용하는 것일 수도 있지만 일치하는 대신 봉쇄에 넣은 다음 결과를 매핑/축소하여 서비스가없는 것을 제거 할 수 있습니다. –