문제

다음과 같은 관계가 설정되어 있습니다.

A HABTM B
B belongsTo C
C hasMany B

이제 주어진 A에 대해 B가 첨부된 모든 C가 필요합니다.SQL 쿼리를 작성할 수 있지만 적절한 CakePHP 방식은 무엇입니까?어떤 모델에서 어떤 매개변수를 사용하여 어떤 메서드를 호출해야 합니까?

도움이 되었습니까?

해결책

나는 Aziz의 답변을 따르고 데이터가 들어오는 대로 간단히 처리하겠습니다.하지만 기본 모델로 C가 필요한 경우 약간의 해결 방법을 수행해야 합니다.Cake는 아직 관련 모델의 조건, 특히 제거된 3번째 사촌 유형의 쿼리에서는 그다지 좋지 않습니다.일반적으로 ownTo 또는 hasMany 관계에 대한 실제 JOIN 쿼리만 수행합니다.그러나 HABTM 관계는 아니지만 별도의 쿼리로 얻는 관계입니다.이는 관련 HABTM 모델에 조건을 포함할 수 없음을 의미합니다.

가장 좋은 방법은 다음과 같습니다.

// get related records as usual with the condition on A, limit to as little data as necessary
$ids = $this->A->find('first', array(
    'conditions' => array('A.id' => 'something'), 
    'recursive'  => 2,
    'fields'     => array('A.id'),
    'contain'    => array('B.id', 'B.c_id', 'B.C.id') // not quite sure if B.C.id works, maybe go with B.C instead
));

// find Cs, using the ids we got before as the condition
$Cs = $this->C->find('all', array(
    'conditions' => array('C.id' => Set::extract('/B/C/id', $ids)),
    'recursive   => 1
);

이는 상당히 많은 쿼리를 생성하므로 실제로는 최적의 솔루션이 아닙니다.자신만의 SQL을 작성하는 것이 실제로는 가장 깔끔한 방법일 수 있습니다.

편집하다:

또는 다음과 같이 할 수도 있습니다. 즉시 연결을 다시 바인딩 hasMany/belongsTo 관계를 만들기 위해 A와 B의 조인 테이블/모델을 사용할 가능성이 높습니다.이를 통해 관련 모델의 조건을 더 쉽게 사용할 수 있지만 조건이 A에 있을 때 C를 가져오는 것은 여전히 ​​까다롭습니다.

다른 팁

$this->A->find(
   'first', 
   array('conditions'=>array('id'=>'someword'), 
   'recursive'=>2)
);

이와 같이?

이것은 효과가있을 수 있습니다

$this->C->find('all',
array('conditions'=>array('id'=>'someword','B.aid'=>$a.id)));

나는 "포함 가능한"행동을 생각합니다 (http://book.cakephp.org/view/474/containable) ... 관련 데이터 찾기를 많이 제어합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top