在我的项目中,我在两个实体之间存在多对多关系:Post和Tag。 (帖子有一个变量'标签')。
我想允许用户通过他们的名字或他们的标签来搜索帖子(比如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"方法给了我非常随机的结果...... 如何通过搜索他们的姓名和他们的标签来获取每个帖子及其相关标签?
答案 0 :(得分:1)
你能给我这个旋转吗?请注意修改后的方法名称,因为我们正在使用多个标记获取多个帖子。
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();
}
答案 1 :(得分:0)
我认为您在进行参数设置时可能会出错。你没有用tag
包围%
- 这是故意的,因为你想让标签完全匹配吗?另外,您不应该:
{。}}。{/ p>
percent_tag