2010-01-18 2 views
2

나는 Containable 비헤이비어를 사용하여 Comments (소유권있는 게시물, Question hasMany Post 및 Post hasMany Comments에 속하며 모든 것은 Users에 속함) .CakePHP 질의 결과가 두 단계 이상으로 나타남

$data = $this->Question->find ('first', 
    array ('contain' => 
     array ('User', 
       'Post' => array ('User', /* 'order' => 'User.created DESC'*/) 
     ) 
    ) 
); 

위의 주석에있는 섹션을 주석 처리하면 작동합니다. 나는 이것이 예상되는 것이라고 생각하지만, 내가 원하는 것은 모든 발견 된 게시물이며, 그들이 속한 '사용자'의 '생성 된'필드의 순서로 정렬되어야합니다. 어떻게 CakePHP에서이 더 깊은 레벨 정렬을 수행합니까? 나는 항상, "경고 (512) : SQL 오류 : 1054 : 알 수없는 열 '주문 조항'에서 'User.created'"

당신의 도움에 감사드립니다!

답변

3

또한, 당신이 시도 할 수있는 그룹에 관련된 테이블에 조인 사용하지 않는 찾기 호출에서.

디버그 수준을 1 이상으로 설정하여 쿼리 로그를보고 Cake에서 데이터를 가져 오기 위해 두 가지 쿼리를 수행하지 않도록하십시오. 이 경우 첫 번째 쿼리는 실제로 두 번째 테이블을 참조하지 않습니다.

이러한 상황에서 수동으로 조인을 수행하려면 다음 링크에서 Nate에서 설명한 Ad-Hoc 조인 방법을 사용할 수 있습니다.

http://bakery.cakephp.org/articles/view/quick-tip-doing-ad-hoc-joins-in-model-find

+0

디버그 출력을 살펴 보았습니다. 'JOIN'을 수행하지 않았습니다. 이것은 불행한 일입니다. 실제로 CakePHP가 그것을 할 수있는 다른 방법은 없을까요? – ash

+0

http://teknoid.wordpress.com/2008/07/17/forcing-an-sql-join-in-cakephp/ hasMany를 바인딩 해제하고 왼쪽 결합을 강제로 수행하는 방법에 대한 해결책이 있습니다. 조인을 사용하는 임시 hasOne이 있습니다. 그것을 읽으면 알려주고 그렇지 않으면 내가 볼 수있는 임시 조인 코드를 게시 할 수 있습니다. –

+0

실제로 작동했습니다. 도와 주셔서 감사합니다! – ash

0

재귀 값을 확인하십시오. 너무 제한적이라면, IIRC가 포함 할 수있는 링크를 무시할 것입니다. 나는 이것에 몇 번 부딪 치는 것을 기억한다. 여러 모델을 포함하려고 시도했지만 내 recursive 옵션이 0으로 설정되었고 아무 것도 꺼내지 않을 것입니다. 귀하의 예를 들어, 나는 1 (기본값)의 값으로 충분할 것이라고 생각하지만 어쩌면 명시 적으로 어딘가에 0으로 설정 했습니까?

+0

나는 Containable이 당신에게 가장 적합한 옵션을 선택할 것이라고 생각하기 때문에 실제로 재귀 옵션을 남겨 둡니다. (당신이 지정한 경우, 상황은 더욱 악화 될 수 있습니다). – ash

+0

그건 내 경험이 아니야. 시간이 지났지 만, 나는 똑같은 것을 생각했기 때문에 어느 시점에서 막연하게 시간을 기억하고 있습니다. 이 시점에서 내 기억이 부정확 할 수 있습니다. –

0

는 다음() 찾기 위해 호출하기 전에 추가 할 수 있습니다

$this->Question->order = 'Question.created DESC'; 
+1

이것은'created' 필드로 질문을 정렬합니다. 이것은 내가 원하지 않는 것입니다. 아마 당신은'$ this-> Question-> Post-> order = 'User.created DESC';를 의미했을 것입니다. – ash

+0

어쨌든 purohit의 예를 시도했지만 작동하지 않는 것 같습니다. 아마도 그것은 질문 모델이 실제로 사용하는 것보다 모델의 다른 인스턴스에 정렬 순서를 설정하고있을 것입니다 ...? –

1

나는이 문제를 얻을 수있는 두 가지 방법을 발견했다. 첫 번째는 모델에서 직접 두 번째 수준 결합을 정의하는 것입니다. 이제 모든 곳에서이 데이터에 액세스 할 수 있습니다. 그것은이 방법

var $belongsTo = array(
'Foo' => array(
    'className' => 'Foo', //unique name of 1st level join (Model Name) 
    'foreignKey' => 'foo_id', //key to use for join 
    'conditions' => '', 
    'fields' => '', 
    'order' => '' 
), 
'Bar' => array(
    'className' => 'Bar', //name of 2nd level join (Model Name) 
    'foreignKey' => false, 
    'conditions' => array(
    'Bar.id = Foo.bar_id' //id of 2nd lvl table = associated column in 1st level join 
), 
    'fields' => '', 
    'order' => '' 
) 
); 

문제는 그들이 할 필요가보다 일반적으로 쿼리가 더 복잡 만들 수 있다는 것입니다 ..... 다음과 비슷한 모습이 될 것입니다. 따라서 다음과 같이 두 번째 수준 쿼리를 직접 찾기 또는 페이지 매김 문에 추가 할 수도 있습니다. (참고 : 두 번째 수준의 조인에서 어떤 이유로 $ belongsTo 연결을 사용할 수 없으며이를 다시 정의해야합니다. 그들은 이미 정의되어 있습니다. 예를 '푸'는 이미 $ belongsTo를 정의하면, 당신은 아래의 예처럼 연결 작업을하기 위해 중복 'FOO1'를 작성해야합니다.)

$options['joins'] = array(

array('table' => 'foos', 
    'alias' => 'Foo1', 
    'type' => 'inner', 
    'conditions' => array(
    'CurrentModel.foo_id = Foo1.id' 
) 
), 
array('table' => 'bars', 
    'alias' => 'Bar', 
    'type' => 'inner', 
    'foreignKey' => false, 
    'conditions' => array(
    'Bar.id = Foo1.bar_id' 
) 
) 
); 

$options['conditions'] = array('Bar.column' => "value"); 
$this->paginate = $options; 
$[modelname] = $this->paginate(); 
$this->set(compact('[modelname]')); 

나는이 분명하다 희망 이해하기에 충분하고 누군가를 돕는 것입니다.

0

그래, 관련된/관련 모델을 기반으로 정렬하는 방법을 찾지 못해서 Set::sort() 메서드를 사용하여 종료되었습니다. 좋은 설명을 위해 체크 아웃 this article.

// This finds all FAQ articles sorted by: 
// Category.sortorder, then Category.id, then Faq.displaying_order 
$faqs = $this->Faq->find('all', array('order' => 'displaying_order')); 
$faqs = Set::sort($faqs, '{n}.Category.id', 'ASC'); 
$faqs = Set::sort($faqs, '{n}.Category.sortorder', 'ASC'); 

...그리고 예, 아마도 Category->find() 일 것입니다.하지만 불행하게도 원래 개발자는 그렇게 코딩하지 않았으며,보기를 재 작업하고 싶지 않았습니다.

관련 문제