2012-12-28 3 views
0

내 CakePHP 애플리케이션에는 두 가지 모델 인 NewsArticleImage이 있습니다. Image은 HABTM (소유하고 많은 것) 협회를 사용하여 NewsArticle과 연결되어 있기 때문에 작가는 원하는 경우 기사 용 갤러리를 만들 수 있습니다.두 개 이상의 연관된 HABTM 유형이있는 한 유형의 레코드 찾기

내 응용 프로그램의 홈페이지에서 관련 기사가 하나 이상있는 가장 최근의 기사 일뿐입니다. 내 컨트롤러에서이 조건을 어떻게 형성합니까? 지금까지 내가 가진 :

<?php 
$topStory = $this->NewsArticle->find('first', array(
    'order' => array(
     'NewsArticle.created' => 'desc' 
    ) 
)); 

하지만 내 NewsArticle 모델에 부착 Image 레코드 수를 "계산"하는 방법을 확실입니다.

답변

0

HABTM을 사용해야하는 경우 JOIN을 수행해야합니다 (CakePHP Joins 참조).

이유는 정상적인 find()은 실제로 별도의 쿼리를 수행하고 나서 CakePHP는 데이터를 반환하기 전에 함께 저장합니다. 하위 결과의 존재로 주요 결과를 제한하려는 경우 JOIN을 사용해야합니다. 대신 멀리 hasMany의로 얻을 수 있다면

(AN ImagebelongToNewsArticle을 의미), 당신은 CakePHP's counterCache를 사용할 수 있습니다.

+0

감사합니다. 내가 미래에 저자를위한 이미지 라이브러리를 소개한다면 이미지가 여러 기사에서 사용되기를 원할 경우를 대비해 'hasMany' 관계로 벗어날 수 없을 것입니다. –

+0

RTFM! 조인에 관한 CakePHP 요리 책의 섹션을 읽고이 솔루션에 도착했습니다 : https://gist.github.com/4401761. 조인을 가르쳐 줘서 고마워. –

0

HABTM 조인 테이블에 대한 CakePHP 모델을 만드는 것이 좋습니다. 그런 다음 해당 테이블을 쿼리 할 수 ​​있습니다.

NewsArticle에는 news_articles라는 테이블이 있습니다. 이미지에는 이미지라는 테이블이 있습니다. 따라서 join 테이블은 news_articles_images 일 가능성이 큽니다.

모델을 조인 테이블과 다른 별칭 이름으로 만드는 것이 좋습니다. 문제를 방지합니다. 그래서 당신은 이런 것을 할 수 있습니다.

class Gallery extends AppModel 
{ 
    var $name = 'Gallery'; 
    var $useTable = 'news_articles_images'; 
    var $belongsTo = array('NewsArticle','Image'); 
} 

컨트롤러에서 이미지가있는 첫 번째 기사를 쉽게 찾을 수 있습니다.

$topStory = $this->Gallery->find('first',array('order'=>array('NewsArticle.created'=>'DESC')); 
+0

실제로는 조인의 별칭 인 새 모델 만들기를 언급합니다. CakePHP는 내부적으로 "브리지"모델을 생성합니까? 그렇다면 실제로 자체 모델을 생성하는 대신 의사 모델을 쿼리 할 수 ​​있습니까? –

+0

@MartinBean 네, 내부적으로 생성합니다. 이 이름은 조인 테이블의 이름이 될 것이지만 $ belongsTo 연관이 구성되지 않습니다. 또한이 내부 이름과 같은 이름의 Model.php 파일을 만드는 것은 좋지 않습니다. 케이크는 항상 당신이 만든 것을 사용하지는 않습니다. – cgTag

+0

내부 모델의 인스턴스를 얻으려면 - CakeRegistry :: init ('NewsArticlesImages'); 또는 조인 테이블 이름을 기초로 한 항목. – cgTag

관련 문제