0

这确实让我感到困扰,但首先是代码,然后是问题:

<?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());不是我要找的,因为这给了我所有包含至少一个过滤器的条目

4

2 回答 2

0

听起来您想使用WHERE tag_id IN (1, 2, 3, 4...). 但是,我对 Symony 或 Propel 不熟悉,因此您需要找到相应的方法。

If$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);
于 2012-09-15T15:42:38.783 回答
0

我认为您应该使用多个内部联接创建 MasterQuery,因为您正在寻找具有 n 个标签的 Master:

$q = MasterQuery::create();
foreach ($tags as $tag) {
  $q->useMasterHasTagQuery('Tag'.$tag->getId(), 'inner join')
    ->filterByTagId($tag->getId())
  ->endUse()
}
$masters = $q->find();

有点。

于 2012-09-16T08:57:07.273 回答