加入多个值的语句

时间:2012-09-15 15:27:49

标签: php mysql symfony-1.4 propel

这确实让我烦恼,但首先是代码,然后是问题:

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

2 个答案:

答案 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();

排序。