繁体   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