我有一个关于标签和人的多对多关系的数据库。我试图搜索有多个标签的人时遇到麻烦。我尝试了这个,但失败了:
$person = Doctrine_Query::create()
->from("Model_Person p")
->innerJoin("p.tags t")
->whereIn('t.id',$t)
->execute();
上面的语句返回所有至少有一个数组$ t中的标签的人,但我只想要那个在该数组上标记“全部”标签的人。
任何人都知道如何实现这一目标?
由于
答案 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