2010-01-27 5 views
2

개체 태그를 일치 시켜서 한 개체에 관련된 개체를 찾으려고합니다. 일치하는 태그를 계산하여 가장 일치하는 객체를 반환하는 mysql 쿼리를 생성했습니다.Doctrine ORM - 실제 관계가없는 자체 조인

doctrine (1.2)을 처음 사용 했으므로 누군가 내 스키마를 수정하고 DQL 쿼리를 작성하는 올바른 길을 찾아야하는지 궁금합니다. 큰 문제는 두 tagset이 내 schema.yml에서 서로 관련이 없다는 것입니다.

schema.yml 파일 :

SELECT object.name, COUNT(*) AS tag_count 
FROM tagset T1 
INNER JOIN tagset T2 
    ON T1.tag_id = T2.tag_id AND T1.object_id != T2.object_id 
INNER JOIN object 
    ON T2.object_id = object.id 
WHERE T1.object_id = 2 
GROUP BY T2.object_id 
ORDER BY COUNT(*) DESC 

답변

2

당신은뿐만 아니라 하위 쿼리를 사용할 수 있습니다 여기에

Object: 
    columns: 
    name: 
    relations: 
    Tags: { foreignAlias: Objects, class: Tag, refClass: Tagset} 

Tagset: 
    columns: 
    object_id: {type: integer, primary: true, notnull: true} 
    tag_id: { type: integer, primary: true, notnull: true } 
    relations: 
    Object: { foreignAlias: Tagsets } 
    Tag: { foreignAlias: Tagsets } 

Tag: 
    columns: 
    name: { type: string(255), notnull: true } 
    Object: { foreignAlias: Tags, class: Object, refClass: Tagset} 

는 위의 스키마를 사용하여 작동하는 MySQL의 쿼리입니다. 다음과 같은 내용 :

$object_id = 2; 

Doctrine::getTable('Tagset')->createQuery('t') 
    ->select('t.tag_id, o.id, o.name, COUNT(t.tag_id) AS tag_count') 
    ->innerJoin('t.Object o WITH o.id != ?', $object_id) 
    ->where('t.tag_id IN (SELECT t.tag_id FROM Tagset t WHERE t.object_id = ?)', $object_id) 
    ->groupBy('t.object_id') 
1

솔루션 :

$q = new Doctrine_RawSql(); 
    $this->related_objects = $q-> 
      select('{o.name}')-> 
      from('tagset t1 JOIN tagset t2 ON t1.tag_id = t2.tag_id AND t1.object_id != t2.object_id JOIN object o ON t2.object_id = o.id')-> 
      addComponent('o','Object o')-> 
      where('t1.object_id = ?', $this->object->id)-> 
      groupBy('t2.object_id')-> 
      orderBy('COUNT(*) DESC')-> 
      execute(); 
관련 문제