2009-09-17 2 views
2

젠드 프레임 워크를 사용하여 개발 된 응용 프로그램을 만들고 있습니다. 나는 예를 들어, 모델에 관계를 정의하고, 즐겁게 사용할 수 있습니다 : 그러나Zend Framework 관계 - findManyToManyRowset()에서 열 이름 정의?

$rowset = $row->findManyToManyRowset('People', 'Jobs'); 

, 내가 행 집합이 반환되는 문제를 공격 한 '사람'에서 같은과 '잡스 있습니다 열 이름을 가지고 따라서 배열 키를 병합하여 최종 행 집합의 일부 데이터를 손실합니다.

은 내가 매개 변수 중 하나로서 findManyToManyRowset()Zend_Db_Select 개체를 전달할 수 이해하지만,이 경우에 사용하는 방법을 설명하는 모든 문서를 찾을 수 없습니다 예 :

$select = $this->select()->from(array(
            'p' => 'people', 
            'j' => 'jobs' 
            ), 
           array( 
            'person_id' => 'p.id', 
            'job_id' => 'j.id', 
            'person_code' => 'p.code', 
            'job_code' => 'j.code' 
            ) 
           ); 

내가 사용하려고하면 위의 코드는, 내가 같은 메시지가 :

Error: No reference rule "" from table People to table Jobs 

사람이 어떻게 이루어져야에 가르치 려 수 있습니까? 데이터베이스의 컬럼 이름을 변경할 수는 있지만, DB 구조를 재 설계하고 모든 관련 코드를 업데이트하는 것과 반대로 코드 변경을 선호합니다.

참고 : (. 즉,이 같은 이름을 가진 열을 병합) :

[_data:protected] => Array 
    (
     [id] => 1 
     [code] => SX342 
    ) 

건배,
매트

답변

1
위와 같이 열 앨리어싱 어떤 형태없이 행 집합이 같은 모습을 반환

내 첫 번째 추천은 idcode과 같은 일반적인 이름을 열거해서는 안됩니다. 이러한 이름은 의미가 없으며 연관 배열에서 결과를 가져올 때 충돌을 유발합니다.

선택 인터페이스도 잘못 사용하고 있습니다. from() 통화 또는 join() 통화 당 하나의 표만 지정해야합니다.

마지막으로 Zend_Db_Table 관계 인터페이스를 통해 복잡한 쿼리를 시도하지 않습니다. 단순한 경우에만 사용됩니다. 좀 더 복잡한 쿼리가 있으면 SQL 쿼리를 명시 적으로 작성하면됩니다.

How to do a joined query in the ZF tables interface?

+0

답장을 보내 주셔서 감사합니다. 열의 이름을 지정하는 방법이나 데이터베이스 디자인 모범 사례에 대한 좋은 자습서를위한 권장 사항이 있습니까? – fistameeny

+0

예를 들어 한 테이블에서 "person_id"대신 다른 테이블에서 "id"대신 두 테이블 모두에서 "person_id"를 사용할 수 있습니다. 가능한 경우 같은 내용의 열을 테이블간에 동일한 이름으로 만듭니다. 단순히 "코드"대신 "person_code"와 유사합니다. 기본적으로 열 이름은 적어도 쿼리에서 함께 조인 될 테이블 일 때 테이블간에 고유해야합니다. –

+0

"Joe Celko의 현자를위한 SQL 프로그래밍 스타일"의 첫 장을 읽으십시오. Google 도서는 온라인 미리보기에서 장을 포함 http://books.google.com/books?id=a9jtyioHfp8C –

2

나는이 대답은 조금 늦게 그러나 여기에서 지적 할 사항 다음은 오는 알고도 참조하십시오.

1) findManyToManyRowset($matchTable, $intersectionTable, $callerRefRule, $matchRefRule, $select); - Zend_Db_Table_Select을 전달하는 경우 규칙에 대해 null을 전달하려고합니다.

2) $matchTable에서 생성되어야 findManyToManyRowset()에 전달 된 Zend_Db_Table_Select와는 어디에 절 i에서 해당 가정하는 것이 안전은 교차 테이블에 대한 별명이며, m은 경기 테이블에 대한 별명입니다.

3) 충돌이 발생한 경우 m이 PHP에서 반환 된 연관 배열에서 키 이름을 얻습니다.실행 쿼리는 다음과 같습니다 : 당신이 교차 테이블에서 어떤 정보를 수집해야하는 경우에 상관없이 findManyToManyRowset()의 반환 값은 그래서 $matchTable에서 만든 행 집합 일 무슨,

SELECT 
    `i`.*, `m`.* 
    FROM 
    `interscetTable` AS `i` 
    INNER JOIN 
    `matchTable` AS `m` 
    ON 
    `i`.`fk_m` = `m`.`pk` WHERE (`i`.`fk_o` = ?) 

4), 또한 캡처하는 동안을 데이터 이동 색인의 데이터는 사용자 정의 Zend_Db_Select이어야하며 데이터를 매핑하는 데 Zend_Db_Table 데이터를 사용하지 않아야합니다.

일치하는 테이블로 "People"을 사용하고 교차 테이블로 "Workers"를 사용하고 원본 테이블로 "Clients"라고 말할 수 있습니다.이 예제에서는 테이블을 다음과 같이 연결한다고 가정합니다 : 사람들. id:... -> 근로자. person_id:client_id:job_id -> 고객 : id:...

$client = $clientTable->fetchRow(); /// grab a random client 

// fetch all people that have worked for the client ordered by their last name. 
$client->findManyToManyRowset("People", "Workers", null, null, 
    $peopleTable->select()->order('m.lastname')); 

// fetch all people that have worked for the client ordered by their hire date: 
// `workers`.`hiredate` 
$client->findManyToManyRowset("People", "Workers", null, null, 
    $peopleTable->select()->order('i.hiredate'));