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などのようになります...これらのタグを対応するタグ ID に変換し、結果をフィルターして、それらを含むものだけにしたいと考えています。パラメータの意味:

master_has_tag は、ID のみを格納する n:m テーブルです。

$criteria->addOr(MasterHasTagPeer::TAG_ID, $tag->getPrimaryKey());これは、少なくとも1つのフィルターを含むすべてのエントリを提供しているため、探しているものではないことを知っています

4

2 に答える 2

0

n 個のタグを持つマスターを探しているので、複数の内部結合を持つ MasterQuery を作成する必要があると思います。

$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 に答える
0

でクエリを作成したいようですWHERE tag_id IN (1, 2, 3, 4...)。ただし、私は Symony や Propel に詳しくないので、対応するメソッドを見つける必要があります。

Ifは、 ID をコンマ区切りの文字列に結合するために$tags使用できる ID の配列です。implode()

$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 に答える