2014-10-23 3 views
1

Containable 동작에 문제가 있습니다.Containable을 사용하는 CakePHP에서의 복잡한 순서 지정

주문과 같은 작업에 대해 포함 된 모델 특성에 액세스 할 수있는 방법이 있는지 알고 싶습니다.

'contain' => array(
      'A' => array(
       'B' => array(
        'order' => 'A.integer_attribute' 
       ) 
      ) 
     ) 

I :

예를 들어, 내가 뭔가 같은 것 A.의 속성 (정수)를 사용하여 B의 객체를 주문할 필요가 모델 A에 속하는 모델 B가 Containable없이이 작업을 수행하는 더 쉬운 방법이 있다는 것을 알아 두십시오. 그러나 여기서 자세히 설명 할 가치가없는 이유로 사용하려면 꼭 사용해야합니다. 이것은 추상적 인 예입니다. 진실 모델 A는 다른 모델에 속하며 이것은 깊이 담을 수있는 나무의 작은 부분입니다.

나는 어떤 도움으로도 매우 기쁩니다!

OK 편집, 나는 명확하지 않고 상황을 설명하기 위해 최선을 다할 것입니다 :

을 내가 4 개 모델이 있습니다 사용자, 카테고리, 필드UserField을이고 그 관계는 다음과 같습니다.

Category hasMany User 
Category hasMany Field 
User hasMany UserField 
Field hasMany UserField 

이러한 관계의 반대는 모두 belongsTo입니다. 여기에있는 목적은 사용자가 자신의 정보 (도시, 주 등)로 채우기 위해 필요한 많은 필드가있는 범주에 속한다는 것입니다. 그가 채운 정보는 UserField 테이블에 저장됩니다. 각 정보는 필드와 필드를 제공 한 사용자가 있어야하기 때문입니다.

즉, 각 카테고리에 대해 사용자 목록과 해당 정보를 표시하는 화면을 만들어야한다고했습니다. 그래서 모든 범주와 필드를 검색하므로 각 범주에 대한 표를 작성할 수 있습니다. 각 필드에는 "no_order"속성이 있습니다.이 속성은 필드가 나타나는 순서를 나타내는 숫자입니다.

동시에 테이블에 올바르게 표시하려면 모든 카테고리의 사용자가 필요합니다. 마지막으로, 문제가 있는데, 각 사용자에 대해 각 필드의 "no_order"로 UserField 객체를 정렬해야합니다. 그래서 나는 다음과 같이 끝 맺었습니다 :

그러나 UserField가 거기에서 각각의 Field의 no_order에 도달 할 수 없기 때문에 이것은 작동하지 않습니다.

이것이 명확하지 않은 경우 사과하지만,이 글을 읽는 동안 약간의 시간을 할애 해 주신 분께는 귀하의 도움에 매우 감사 할 것입니다. 사용해야

+0

견본 데이터를 공유하고 정렬 방법을 지정해야합니다. ** ** ** ** ** ** ** ** ** ** 모든 ** B ** **가 모두 동일하게 정렬되기 때문에 설명하는 내용은별로 의미가 없습니다. 아마도 그 배열을 외부 배열 (즉, 'A'=> 배열 레벨)로 옮기기를 원할 것입니다. – AgRizzo

+0

좋아요, 편집하고 풍경을 더 구체적으로 제공하려고합니다. – lucasnadalutti

답변

0

조인. 얼마나 효율적인지는 모르겠지만 다음과 같습니다.

'contain' => array(
      'Field', 
      'User' => array(
       'User.privilege = "Solicitante"' 
       'UserField' => array(
        'order' => '(SELECT f.no_order FROM fields AS f WHERE UserField.field_id = f.id LIMIT 1)' 
       ) 
      ) 
     ) 

원시 쿼리로 내 문제가 해결되었습니다. 비슷한 문제를 겪고있는 누군가에게 도움이되기를 바랍니다!

0
나는 당신이 그렇게 원하는 작업을 위해 슈어 있지 않다

,하지만 난 것은 내가 마침내 해결책을했다 CakePHP의

$A = $this->A->find('all', array(
      'joins' => array(
        array(
        'table' => 'B', 
        'alias' => 'B', 
        'type' => 'LEFT', 
        'conditions' => array(
        'B.field_id = A.id' 
        ) 
       ) 
      ), 
       'conditions' => array(
       'B.field' => 'if_you_want_more_conditions' 
      ), 

       'contain' => array(
        'A' => array(
         'B' => array(
         'order' => 'A.integer_attribute' 
         ) 
        ) 
      ), 
       'fields' => array('A.field','B.field'), 
       'recursive' => -1 
      )); 
+0

방금 ​​조금 질문을 편집했습니다. 자세한 내용은. 나는 많은 양의 레코드를 가지고있는 테이블을 가지고 있기 때문에 합치면 좋은 해결책이 될 것이라고 생각하지 않는다. 또한, 실제로 데이터가 중첩되도록해야합니다 (Cake 방식). :( – lucasnadalutti