2014-06-18 3 views
0

내가 만들고있는 cakePHP 응용 프로그램에는 프로필에 여러 위치가있을 수 있습니다. 테이블은 "프로파일"과 "위치"라고 불리고 모델 클래스에서는 HasMany 관계를 정의했습니다. 이제 사용자가 위치를 기반으로 프로필을 검색 할 수있게하려고합니다. 여기에 몇 가지 질문과 CakePHP 요리 책을 읽은 후에, 나는 SQL 조인을 사용해야한다고 결정했다. (실제로 더 많은 테이블이 관련되어 있고, 검색 결과는 다른 테이블에 관한 조건에 기반해야한다.)hasMany와 DB 테이블 조인 - 배열에 저장

public function findProfiles($long, $lat){ 

$options['joins'] = array(
    array('table' => 'locations', 
      'alias' => 'Location', 
      'type' => 'Inner', 
      'conditions' => array('Location.profile_id = Profile.id')) 
    ); 


$options['order'] = array('Location.lng ASC'); //this is just as trial 

return $this->find('all',$options); 
} 

코드는 작동하지만, 나는 그것을 가지고 각각의 위치에 대한 프로파일의 사본을 얻을 :

내 프로필 모델 내에서 다음 함수를 작성했습니다. 즉, 프로필에 5 개의 지위가 있다면 해당 프로필의 인스턴스 5 개를 얻습니다 (각 인스턴스는 5 개 위치 모두 포함합니다).

어떻게하면됩니까?

[편집]

예 : 저는 두 가지 위치를 가진 프로필이 하나만 있다고 가정합시다. 나는 얻는다 :

result[0][Profile] 
     [Position][0] 
        [1] 
     [1][Profile] 
     [Position][0] 
        [1] 

결과 [0]와 결과 [1]의 데이터가 동일한 경우.

+0

당신은 당신이 원하는 배열의 예를 게시 할 수 있습니까? 어쩌면 그것은 아침이기 때문일 수 있습니다. 그러나 나는 당신을 아주 좋아하지 않습니다 ... – Nunser

+0

하하 좋은 질문입니다. 실제로 내가 얻은 각각의 인스턴스는 내가 원하는 것처럼 모든 위치를 배열에 포함한다는 것을 알 수 있습니다. 그러나 프로필에 여러 위치가있는 경우 프로필의 여러 복사본을 가져옵니다. 각 복사본에는 모든 위치가 포함됩니다 (즉 모든 복사본이 동일 함). 질문 – Scipio

+0

을 편집했으며 프로필과 위치 모델에 대한'$ recursive' 값은 무엇입니까? '-1'로 설정되지 않았다면 아마도 그게 문제 일 겁니다. – Nunser

답변

1

사용 된 조인 유형으로 인해 문제가 발생합니다. 내부 사용하면

profile_id  location_id 
--------------------------- 
    1    2 
    1    3 

그리고 케이크 이해 귀하의 요청이 수익을 얻을 것이다 그 프로필의 두 개의 레코드와 같은, 동일한 정보로 프로필을 반복받을 수 있도록 가입 할 수 있습니다.

이것이 문제의 범위라면, "포함 할 수있는 동작으로 가서 조인을 잊어 버리라."라고 말하고 싶습니다. 그러나 더 많은 테이블이 관련되어 있다고 말했기 때문에 조인 유형을 변경할 수 없습니다. 그래서 반복하지 않고 고유의 정보를 얻기 위해,이

$options['joins'] = array(
    array('table' => 'locations', 
      'alias' => 'Location', 
      'type' => 'Inner', 
      'conditions' => array('Location.profile_id = Profile.id')), 
      'group' => 'Profile.id' 
    ); 

유사한 코드로

profile_id  location_id 
--------------------------- 
    1    2 & 3 

를 얻기 위해 쿼리에서 GROUP해야합니다 그리고 당신은 반복을 제거합니다. 이와 같은 미래의 문제를 해결하려면 먼저 DB로 전송되는 실제 쿼리를 확인하고 DB가 제공 한 결과가 원하는 것인지 확인하십시오. 그렇지 않은 경우 케이크를 변경하기 위해 수행 할 수있는 작업을 확인하십시오 .