Zend Framework 관계 - Findmanytomanyrowset ()에서 열 이름을 정의합니까?
-
08-07-2019 - |
문제
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 쿼리를 명시 적으로 작성하십시오.
다른 팁
나는이 대답이 조금 늦었다는 것을 알고 있지만 여기에 지적 할 것이 있습니다.
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'));