簡體   English   中英

Symfony2和Doctrine2:如何獲取帖子的所有標簽?

[英]Symfony2 and Doctrine2: how to get all tags for a post?

在我的項目中,兩個實體之間存在多對多關系:“郵政”和“標簽”。 (帖子具有變量“標簽”)。

我想允許用戶通過其名稱或標簽搜索帖子(例如在tumblr上)

假設我的數據庫中有這個:

        Name                     Tags
post1: "Recipe with eggs"        cooking, chicken, egg    
post2: "Random Title"            beef, chicken, egg    
post3: "Cooking Fish"            fish, cooking
post4: "Rice and chicken"        rice, meat

因此,如果我在搜索表單中輸入“雞雞蛋”,則僅返回post1(由於標簽),post2(由於標簽)和post4(由於名稱)。

但是我還想為每個帖子檢索所有與之關聯的標簽(post1的烹飪,雞肉和雞蛋……)。

在我的控制器中,我有這個:

//$data['search'] comes from a form and contains for exemple 'chicken egg'
$searchString = $data['search'];
$searchString = explode(' ',$searchString);
$list = $repository->getPostByTag($searchString);

在我的PostRepository.php中,我創建了以下代碼:

    public function getPostByTag($searchString)
    {
        $query = $this->createQueryBuilder('p')->leftJoin('p.tags','t');
        $i = 0;
        foreach($searchString as $tag)
        {
           $query->orWhere('t.name like :tag'.$i.' OR p.name like :percent_tag'.$i)
              ->setParameter('tag'.$i, $tag)
              ->setParameter(':percent_tag'.$i,'%'.$tag.'%');
           $i++;
        }
        $query->leftJoin('p.author','a')
              ->leftJoin('p.tags','t2')
              ->addSelect('t2')
              ->addSelect('a'); 
    }

但是,這種“ getPostByTag”方法給了我非常隨機的結果...我如何通過搜索它們的名稱和它們的標簽來獲取每個帖子及其相關的 標簽

你能幫我一個忙嗎? 請注意修改后的方法名稱,因為我們正在獲取具有多個標簽的多個帖子。

public function getPostsByTags($tagArray = array()) {
    $query = $this->createQueryBuilder('p');
    $i = 1;
    $tagObjects = this->getEntityManager()->getRepository('AcmeBundle:Tag')
        ->findByName(array('name' => $tagArray)); // This is case-insensitive by default

    foreach ($tagObjects as $tagObj) {
        $query->orWhere('?'.$i.' MEMBER OF p.tags')->setParameter($i, $tagObj);
        $i++;
    }

    foreach ($tagArray as $tag) {
        $query->orWhere('p.name LIKE ?'.$i)->setParameter($i, '%'.$tag.'%');
        $i++;
    }

    $query->leftJoin('p.tags', 't')
        ->leftJoin('p.author', 'a')
        ->addSelect('t')->addSelect('a')
        ->getQuery();

    return $query->getResult();
}

我認為您在進行參數設置時可能會出錯。 您不會將tag% tag起來-這樣做是故意的,因為您希望標簽完全匹配嗎? 另外,您不應該使用:作為percent_tag

$query->orWhere('t.name like :tag'.$i.' OR p.name like :percent_tag'.$i)
   ->setParameter('tag'.$i, $tag)
   ->setParameter('percent_tag'.$i,'%'.$tag.'%');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM