这确实让我烦恼,但首先是代码,然后是问题:
<?php
public static function retrievePagerByTagArray($page, $limit, $tags) {
$criteria = new Criteria();
$criteria->addJoin(self::MASTER_ID, MasterPeer::MASTER_ID);
foreach($tags as $tag) {
$criteria->addOr(MasterHasTagPeer::TAG_ID, $tag->getPrimaryKey());
}
$criteria->add(self::IS_ACTIVE, 1);
$criteria->addDescendingOrderByColumn(self::MASTER_ID);
$pager = new sfPropelPager('Master');
$pager->setCriteria($criteria);
$pager->setPage($page);
$pager->setMaxPerPage($limit);
$pager->init();
return $pager;
}
我想做的是:
我的标签是用get参数制作的,所以标签就像http://example.com?filter=tag1%7tag2等...我将这些标签转换为相应的tagid,并希望将我的结果过滤到那些具有参数意义的东西:
master_has_tag是一个只存储id的n:m表。
我知道$criteria->addOr(MasterHasTagPeer::TAG_ID, $tag->getPrimaryKey());
不是我想要的,因为这给了我所有包含至少一个过滤器的条目
答案 0 :(得分:0)
听起来您想要使用WHERE tag_id IN (1, 2, 3, 4...)
构建查询。但是,我不熟悉Symony或Propel,所以你需要找到相应的方法。
如果$tags
是一个ID数组,您可以使用implode()
将ID组合成逗号分隔的字符串。
$tag_ids = implode(',', $tags);
如果$tags
是一个对象数组,那么您可以使用array_map()
来做同样的事情。
// create an array of tag ids
$tags = array_map(function($tag) {
return $tag->getPrimaryKey();
}, $tags);
// create a comma-separated string of ids
$tag_ids = implode(',', $tags);
答案 1 :(得分:0)
我认为你应该制作一个包含多个内连接的MasterQuery,因为你正在寻找有n个标签的Masters:
$q = MasterQuery::create();
foreach ($tags as $tag) {
$q->useMasterHasTagQuery('Tag'.$tag->getId(), 'inner join')
->filterByTagId($tag->getId())
->endUse()
}
$masters = $q->find();
排序。