2 回答
TA贡献1801条经验 获得超8个赞
如果你想让所有文章都至少有一个指定的标签,你的代码应该是这样的:
public function search($titles, $tags, $authors)
{
return $query = $this->createQueryBuilder('a') // a = article
->innerJoin('a.tags', 't') //on inner join is enough
->where('t.name in (:set)')
->setParameter('set', $tags)
->orderBy('a.createdAt', 'DESC')
->setMaxResults($limit)
->setFirstResult($offset)
->getQuery() //retrieve
->getResult();
}
第一个 SQL 将进行连接。提示是使用“in”运算符。
如果您想要包含所有标签(完全是所有)的文章,您应该为每个标签添加一个内部连接。技巧是为每个连接添加一个别名,并在别名上添加一个唯一的东西。
public function search($titles, $tags, $authors)
{
$query = $this->createQueryBuilder('a') // a = article;
foreach ($tags as $index => $tag) {
$query->innerJoin('a.tags', "t$index")
->andWhere("t$index" + ".name in (:tag$index)")
->setParameter("tag$index", $tag)
}
return $query
->orderBy('a.createdAt', 'DESC')
->setMaxResults($limit)
->setFirstResult($offset)
->getQuery() //retrieve
->getResult();
你的要求应该是这样的。我没有测试它们,但这是模板。
TA贡献1812条经验 获得超5个赞
如果有人有同样的问题,这里的代码:
foreach ($tags as $id => $tag) {
$query->innerJoin('a.tags', "t${id}")
->andWhere("t${id}.name in (:tag${id})")
->setParameter(":tag${id}", $tag);
}
- 2 回答
- 0 关注
- 98 浏览
添加回答
举报