2010-12-22 2 views
0

먼저 MVC 프레임 워크에 익숙하지 않으므로 해당 영역에 대한 지식이 없다고 전합니다.모델에 관련 모델을 찾는 방법을 알려주는 방법은 무엇입니까?

디자이너 모델이 있는데 디자이너 모델에서 정보를 검색 할 때 각각의 디자이너에 대해 제품을 연결하려고합니다. 제품을 가져오고 싶습니다.

이 연관성은 간단하지 않으므로 케이크를 마술처럼 사용하지 않으므로 직접 정의해야합니다. 나는 자습서를 따라 왔고 나는 모두가 묶여있는 방법을 잘 모르지만 확신 할 수있다.

정확한 장소에 designer_id를 연결하면 관련된 모든 제품을 선택한다는 매우 긴 쿼리가 있습니다.

제품을 검색하는 방법을 알 수 있도록이 쿼리를 Designer 모델의 어딘가에 배치해야한다고 생각합니다. 여기

쿼리입니다 {$__cakeID__$} 같이 문자열의 부분이 designer_id로 대체해야합니다

SELECT *, COUNT(DISTINCT tags.name) AS uniques 
FROM products, products_tags, tags, designers, designers_tags 
WHERE products.id = products_tags.product_id 
AND tags.id = products_tags.tag_id 
AND tags.id IN (
    SELECT t.id 
    FROM tags t 
    LEFT JOIN designers_tags dt ON dt.tag_id = t.id 
    LEFT JOIN designers d ON d.id = dt.designer_id 
    WHERE d.id ={$__cakeID__$} 
    AND dt.include =1 
) 
AND products.id NOT IN ( 
    SELECT products.id 
    FROM products, products_tags, tags 
    WHERE products.id = products_tags.product_id 
    AND tags.id = products_tags.tag_id 
    AND tags.id IN (
     SELECT t.id 
     FROM tags t 
     LEFT JOIN designers_tags dt ON dt.tag_id = t.id 
     LEFT JOIN designers d ON d.id = dt.designer_id 
     WHERE d.id ={$__cakeID__$} 
     AND dt.include =0 
    ) 
) 
AND designers.id = designers_tags.designer_id 
AND designers_tags.tag_id = tags.id 
GROUP BY products.id 
HAVING uniques = (
    SELECT COUNT(d.id) AS tag_count 
    FROM tags t 
    LEFT JOIN designers_tags dt 
     ON dt.tag_id = t.id 
    LEFT JOIN designers d 
     ON d.id = dt.designer_id 
    WHERE d.id = {$__cakeID__$} 
    AND dt.include =1 
    GROUP BY d.id 
) 

도 여기에 디자이너 모델 :

class Designer extends AppModel 
{  
    var $name = 'Designer'; 

    var $actsAs = array('Sluggable' => array('separator' => '-', 'overwrite' => false, 'label' => 'name')); 

    var $hasAndBelongsToMany = 'Tag'; 

    var $hasOne = 'AlternateName'; 

    var $hasMany = 'Vote'; 
} 

어떤 것 Designer 모델에서이 쿼리를 사용하여 관련 제품을 자동으로 찾으려면해야합니까?

// this assumes you are in the DesignersController 
$this->Designer->Tag->find('all', array(
    'joins' => array(
     array(
      'table' => 'designers_tags', 
      'alias' => 'FilterDesignersTag', 
      'type' => 'INNER', 
      'conditions' => array(
       'FilterDesignersTag.tag_id = Tag.id' 
      ) 
     ) 
    ), 
    'contain' => array('Designer', 'Product'), 
    'conditions' => array(
     'FilterDesignersTag.designer_id' => $designer_id, 
     'FilterDesignersTag.include' => 1 
    ) 
)); 

데이터는 다시 태그 주위를 지향 올 것이다,하지만 당신은 당신이 필요 얻을 것이다 :

+0

그건 하나의 helluva 쿼리입니다. 너 케익이 너를 위해 협회를 다룰 수 없다고 확신합니까? 협회를 설명하고, 그리고/또는 데이터베이스에서 반환하려는 것을 정확히 설명해 주시겠습니까? – Stephen

+0

@Stephen, 디자이너 HABTM 태그, 제품 HABTM 태그. 모든 태그가 디자이너로 포함 된 제품이 포함됩니다. 또한 designer_tags 테이블에는'include'라는 부울 필드가 있습니다. false이면 해당 태그가있는 제품을 포함하면 안됩니다. 그런 식으로 카테고리를 생성하고 카테고리에 포함될 제품이 있어야하거나 갖지 않아야하는 태그를 선택할 수 있습니다. 이해가 되니? –

+0

거의 알았습니다. 디자이너와 정확히 동일한 태그가있는 제품 만 필요합니까?아니면 디자이너가 가지고있는 * 모든 태그가있는 모든 제품을 원하십니까? – Stephen

답변

0

이 쿼리는 애드혹가 가입하고 함유 성 행동을 사용하여 작동합니다. 또한 세 모델 (Designer, ProductTag)의 HABTM 관계를 정의해야합니다 (태그에는 두 개의 HABTM 연관이 있어야 함).

또한 모델에 var $actsAs = array('Containable');을 추가해야합니다. 당신이 CakePHP의 솔루션을 찾아 원시 쿼리를 사용할 필요 끝낼 수없는 경우

편집

, CakePHP의 모델 query method와 함께 할 수 있습니다. 이 방법을 사용할 때 몇 가지 기능을 포기하고 있음을 이해하십시오. 만약 당신이 응용 프로그램에서이 방법을 사용하는 경우

는, 주입 십자가에서 사용자가 제공 한 데이터를 정리 에이즈 CakePHP의 살균 라이브러리를 체크 아웃하십시오 : 또한 요리 책에서이 조언을주의 깊게 살펴 - 사이트 스크립팅 공격.

+0

당신의 마지막 코멘트는 나의 대답을 무효로합니다 ... 그러나 당신은 이것을 기반으로 할 수 있습니다. – Stephen

+0

답변을 주셔서 감사합니다. 귀하의 솔루션을 가지고 노는 것을 시도해 볼 수 있습니다. include = 0 태그가있는 제품을 포함하지 말라고 어떻게 말합니까? ''FilterDesignersTag.include! = '=> 0'을 조건 배열에 추가 할 수 있습니까? 감사! –

+0

나는 'FilterDesignersTag.include = 1'을 가진 것들만 포함하도록 말하고 있습니다. 최종 조건을 살펴보십시오. – Stephen