문제

Zend Framework를 사용하여 개발 된 응용 프로그램을 작업하고 있습니다. 나는 모델에서 관계를 정의했으며 행복하게 사용할 수 있습니다.

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

그러나 행 세트가 반환되는 문제에 도달했습니다. 'People'및 'Jobs'에서 동일한 열 이름이 있습니다. 따라서 배열 키를 병합하여 최종 행 세트에서 일부 데이터를 잃어 버립니다.

나는 내가 통과 할 수 있다는 것을 이해한다 Zend_Db_Select 대상 findManyToManyRowset() 매개 변수 중 하나 로서이 경우 사용 방법을 설명하는 문서를 찾을 수 없습니다.

$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
    )

건배,
매트

도움이 되었습니까?

해결책

첫 번째 권장 사항은 다음과 같은 일반 이름을 이름으로 지정해서는 안된다는 것입니다. id 그리고 code. 이 이름은 의미가 없으며, 발견 한대로 연관 배열을 가져올 때 충돌이 발생합니다.

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

마지막으로, 나는 결코 복잡한 쿼리를 시도하지 않습니다. Zend_Db_Table 관계 인터페이스. 간단한 경우에만 의존합니다. 더 복잡한 쿼리가있는 경우 SQL 쿼리를 명시 적으로 작성하십시오.

또한보십시오 ZF 테이블 인터페이스에서 결합 된 쿼리를 수행하는 방법은 무엇입니까?

다른 팁

나는이 대답이 조금 늦었다는 것을 알고 있지만 여기에 지적 할 것이 있습니다.

1) findManyToManyRowset($matchTable, $intersectionTable, $callerRefRule, $matchRefRule, $select); - 당신이 지나가는 경우 Zend_Db_Table_Select 당신은 통과하고 싶을 것입니다 null 규칙을 위해.

2) Zend_Db_Table_Select 전달되었습니다 findManyToManyRowset() 생성해야합니다 $matchTable 그리고 Clauses에서 i 교차 테이블의 별칭입니다 m 경기 테이블의 별칭입니다.

3) 충돌의 경우, m PHP에서 반환 된 연관 배열에서 키 이름을 얻습니다. 실행 된 쿼리는 다음과 같습니다.

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

4) 무엇이든 반환 가치 findManyToManyRowset() The에서 만든 행 세트가 될 것입니다 $matchTable 따라서 교차 테이블에서 정보를 캡처 해야하는 경우 매치 테이블의 데이터를 캡처하면 사용자 정의가 필요할 것입니다. Zend_Db_Select 그리고 사용하지 마십시오 Zend_Db_Table 어쨌든 데이터를 매핑하는 것.

따라서 "사람"을 매치 테이블로 사용하는 "작업자"를 교차점 테이블로 사용하고 "클라이언트"라고 말합니다.이 예를 위해 테이블이 다음과 같은 것을 연결한다고 가정합니다. People.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')); 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top