如何在学说中搜索多个标签

时间:2010-07-06 12:37:33

标签: php tags doctrine many-to-many

我有一个关于标签和人的多对多关系的数据库。我试图搜索有多个标签的人时遇到麻烦。我尝试了这个,但失败了:

        $person = Doctrine_Query::create()
        ->from("Model_Person p")
        ->innerJoin("p.tags t")
        ->whereIn('t.id',$t)
        ->execute();

上面的语句返回所有至少有一个数组$ t中的标签的人,但我只想要那个在该数组上标记“全部”标签的人。

任何人都知道如何实现这一目标?

由于

2 个答案:

答案 0 :(得分:1)

这是因为IN返回至少一个匹配的所有结果。如果您有id IN(1,2,3),则说明它与id = 1 OR id = 2 OR id = 3相同。

要达到预期的目标,请使用Doctrine的andWhere()方法,使用现在位于$t的每个值,例如[...]->andWhere('id = ?', 1)->andWhere('id = ?', 2)->[...]

答案 1 :(得分:0)

经过一段时间的研究后,我发现并采用了纯粹的SQL代码,它完全按照我的需要运行。 在我的应用程序中,rizidoro的表是信息表。

   //$tagQueryString contains tags separated by space ex. "crisis usa"    
   $tagsArray = explode(' ', $tagQueryString);
   $tagsArrayQuery = '"' . implode('","', $tagsArray) . '"';
   //$tagsArrayQuery='"crisis","usa";


    $fromQuery =
            '
        info i
   INNER JOIN (SELECT   it.info_id
               FROM     info_tag it
                        INNER JOIN info i
                          ON i.id = it.info_id
                        INNER JOIN tag t
                          ON t.id = it.tag_id
               WHERE    t.name IN (' . $tagsArrayQuery . ')
               GROUP BY it.info_id
               HAVING   COUNT(it.info_id) = ' . count($tagsArray) . ') ii
     ON i.id = ii.info_id';

    $query = new Doctrine_RawSql();
    $query->select('{i.*}');
    $query->from($fromQuery);
    $query->addComponent('i', 'Model_Info i');

  //you can add offset and limit for pagination
    $infos = $query->limit($resultsPerPage)
                   ->offset($resultsPerPage * ($currentPage - 1))
                   ->execute();

这不是优雅的代码,但工作正常。我不知道怎么做更多“教条式”。 以下是类似问题的其他解决方案: http://www.sergiy.ca/how-to-write-many-to-many-search-queries-in-mysql-and-hibernate