我一直在四处寻找,但仍然找不到如何设置查询以查找用户从侧边栏中选择的特定"标签"的示例,而侧边栏又会显示所有带有该标签的帖子。
我了解如何查找所有标签,但不了解如何查找用户选择的特定标签。
博客存储库
public function getTags($tags)
{
$qb = $this->createQueryBuilder('b');
$qb->select('b')
->join('b.tags', 'tag')
->where('b.tags LIKE ?', '%'.$tags.'%');
return $qb->getQuery()->getResult();
}
博客实体
/**
* @var string
*
* @ORMColumn(name="tags", type="text")
*/
private $tags;
/**
* Set tags
*
* @param string $tags
* @return Blog
*/
public function setTags($tags)
{
$this->tags = $tags;
return $this;
}
/**
* Get tags
*
* @return string
*/
public function getTags()
{
return $this->tags;
}
第一个解决方案:您应该使用条令查询。
PostRepository.php
public function findByTagName($tagName)
{
$qb = $this->createQueryBuilder('post');
$qb->select('post')
->join('post.tags', 'tag')
->where('tag.name LIKE ?', '%'.$tagName.'%');
return $qb->getQuery()->getResult();
}
第二个解决方案:使用多对多关系,直接从条令中获得
实体/Tag.php
/**
* @ORMManyToMany(targetEntity="YourAppYourBundleEntityPost", inversedBy="tags")
* @ORMJoinColumn(name="posts_tags")
*/
private $posts;
实体/Post.php
/**
* @ORMManyToMany(targetEntity="YourAppYourBundleEntityTag", mappedBy="posts")
*/
private $tags;
所以你可以做$tag->getPosts();
来获得所有相关的帖子
第三个解决方案:真的很难看,但教程的设计并不是为了改进。。。获取所有博客文章并解析每个字符串,以确定您的标签是否在中
public function getBlogWithTag($tagRequested)
{
$blogs = $this->createQueryBuilder('b')
->getQuery()
->getResult();
$blogsWithTag = array();
$tags = array();
foreach ($blogs as $blog)
{
$tags = explode(",", $blog->getTags());
foreach ($tags as &$tag)
{
$tag = trim($tag);
}
if(in_array($tagRequested, $tags)) {
array_push($blogsWithTag, $blog);
}
}
return $blogsWithTag;
}
我相信这对你有用。
public function getPostsByTags($tag)
{
$query = $this->createQueryBuilder('b')
->where('b.tags like :tag')
->setParameter('tag', '%'.$tag.'%');
return $query->getQuery()->getResult();
}