2011-12-23 2 views
0
나는 교리를 1.2로 테스트하고 아주 잘 작동 된 다음 날 MySQL의 쿼리를, 번역 시간의 지옥 데

:교리에 원시 MySQL을 번역 1.2

SELECT 
    r.name AS regionname, 
    s.name AS statename 
FROM 
    job j 
LEFT JOIN 
    community c ON c.id = j.community_id 
LEFT JOIN 
    state s ON s.id = c.state_id 
LEFT JOIN 
    region r ON r.id = s.region_id 
WHERE 
    r.id = 1 

이 작동하지 않습니다 : 내가 같은 일로 나타났습니다

job: 
columns: 
    id 
    community_id 
relations: 
    community: local_key: community_id, foreign_key: id, foreignAlias: Communitys 

community: 
columns: 
    id 
    state_id 
relations: 
    state: local_key: state_id, foreign_key: id, foreignAlias: States 

state: 
columns: 
    id 
    name 
    region_id 
relations: 
    region: local_key: region_id, foreign_key: id, foreignAlias: Regions 

region: 
columns: 
    id 
    name 

답변

0

: 유용 경우

$q = Doctrine_Query::create() 
    ->select('r.name AS regionname', 's.name AS statename') 
    ->from('job j') 
    ->leftJoin('community c ON c.id = j.community_id') 
    ->leftJoin('state s ON s.id = c.state_id') 
    ->leftJoin('region r ON r.id = s.region_id') 
    ->where('r.id = 1') 
    ->execute(); 

여기, 내 DB 구조입니다 잘. Doctrine 1.2에서 조인을하는 것은 mysql과 조금 다르다. 참여를하려면 Doctrine이 귀하의 경우 각 구성 요소에 작업 클래스를 작성하는 관계를 활용해야합니다.

내가 말하는 이러한 관계에 대한 작업의 기본 클래스를 확인할 수 있습니다. 설정 방법, 그들은 작업 테이블의 사회 외래 키가 id 예를 들어 다음과 같이 : 할, 당신의 질문으로 돌아 가기

$this->hasOne('community as Communitys', array(
     'local' => 'community_id', 
     'foreign' => 'id')); 

있는 A 테이블의 별칭을 참조 할 필요 가입 어디 외국를 키가 속해 있습니다.

->leftJoin('j.Community') 

대신

community c ON c.id = j.community_id 

공지 사항

의 I 교리 1.2에서 이미 암시되어 그 때문에 ID에 가입 말하지 않았다 : 예를 들어, 당신은 별명 커뮤니티와 커뮤니티 테이블에 가입하려는 경우 . 그러나 다른 것을 선택하여 참여할 수 있습니다.

은 마찬가지로 테이블의 경우 이전에 명시된대로 구성 요소 2.reference 현재 queryand 에서 자신의 별명 1. 한

해야 할 그들이 외래 키가 다른 테이블에 가입해야하는 가입 한 그들의 기본 클래스도.

그래서 당신은 당신이 현재 쿼리의 상태로 나는 당신이 패턴을 볼 수 있기를 바랍니다 당신이 여기에서

// join job and community first 
->from('job j') 
->leftJoin('j.Community c') 
// join community to state since they are the ones that are related 
->leftjoin('c.States s') 

입니다해야 할 방법을 커뮤니티에 가입 할 것이라고 말했다.

SQL 구문 :

LEFT JOIN 
    community c ON c.id = j.community_id 

DQL 구문 :

가입의 생각은 여전히 ​​원시 SQL과 같은 당신이 그것을 보면 하루의 끝에서, 유일한 차이점은 구문입니다
->leftJoin('j.Community c') 

어쨌든 여기에, 귀하의 질문에 대답 (가) 어느 정도 수행해야 가입하는 방법입니다하기 : 자세한 답변

$q = Doctrine_Query::create() 
    ->select('*') 
    ->from('job j') 
    ->leftJoin('j.Community c') 
    ->leftJoin('c.State s') 
    ->leftJoin('s.Region r') 
    ->where('r.id = 1') 
    ->execute(); 
+0

감사합니다. 불행히도 작동하지 않습니다. 나도 외국의 별명을 알기 위해 노력했다. 그러나 그것들에 매달렸다. 내가 사용하려고 할 때 발생하는 오류입니다. "알 수없는 관계 별칭 커뮤니티"그리고 그 중 하나를 시도 할 때마다 이러한 오류가 발생합니다. 나는 그들이 설치 방법과 재 게시에 무엇인지 확인해 볼 것입니다. 다시 한번 감사드립니다. – Patrick

+0

... 그게 문제인 것처럼 보입니다. 'Community as Community'문은 없으며 'Community, array ('.내 스키마가 외국 별칭으로 명시되어 있기 때문에 어느 정도 당황 스럽습니다. 그러나 내 스키마는 그것을 일대일 관계로 식별하지 않습니다. 그게 문제 야? – Patrick

+0

업데이트 : "as"절을 포함하도록 기본 클래스를 변경했습니다 (이 형식이 나쁜 것으로 알고 있으며 궁극적으로 문제를 수정하면 스키마에서 변경됩니다). "커뮤니티"관계에 대한 문제가 수정되었습니다. 그러나 이제는 "States"절에 매달려서 그 일이 국가와 관련이 있다고 말하는 오류가 발생했습니다 ... 내 스키마에는 해당되지 않습니다 ... 커뮤니티는 국가와 관련이 있습니다. 솔루션에 대한 아이디어가 있습니까? – Patrick