Доктрина ОРМ - Самостоятельное объединение без каких-либо реальных отношений - PullRequest
2 голосов
/ 27 января 2010

Я пытаюсь найти связанные объекты для одного объекта путем сопоставления тегов объектов. Я построил запрос MySQL, который будет возвращать объекты, которые наиболее соответствуют, подсчитывая соответствующие теги.

Я новичок в doctrine (1.2), поэтому мне интересно, может ли кто-нибудь помочь мне встать на правильный путь, изменив мою схему и создав запрос DQL? Большая проблема состоит в том, что два набора тегов не связаны друг с другом в моем schema.yml, я бы предположил.

schema.yml:

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, который работает по схеме выше:

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 ]

2 голосов
/ 27 января 2010

Вы также можете использовать подзапросы. Примерно так:

$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 голос
/ 27 января 2010

Решение:

$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();
...