这应该很简单。我确实在SO和其他地方找到了有关该主题的许多文章,但这只会引发错误:
[语义错误]第0行,第18列靠近“来自应用程序\实体\消息的线程”:错误:无效的PathExpression。必须是StateFieldPathExpression。
这是用于在消息模块上选择不同的线程。我尝试的查询是:
public function getThreads() {
return $this->createQueryBuilder('m')
->select('DISTINCT m.thread')
->where('m.thread IS NOT NULL')
->orderBy('m.thread', 'DESC')
->setMaxResults(10)
->getQuery()
->getResult();
消息实体:
class Message
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Ad", inversedBy="messages")
* @ORM\JoinColumn(nullable=true)
*/
private $ad;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Message")
*/
private $thread;
.....
为了公平起见,我确实设法使其与DQL一起使用,但是,您知道,我似乎无法不使用查询生成器来解决它。
顺便说一下,这里是DQL:
public function getThreads() {
$query = $this->em->createQuery(
'SELECT DISTINCT(m.thread) FROM App:Message m
WHERE m.thread IS NOT NULL
ORDER BY m.thread DESC
LIMIT 10 ');
return $query->getResult();
}
谢谢
答案 0 :(得分:0)
尝试这些解决方案之一,我认为您的问题是您没有使用查询生成器在解决方案中指定“来源”。您也可以从createQueryBuilder()函数中删除“ m”,此函数不接收任何参数。我希望这些解决方案之一对您有用。
解决方案1
public function getThreads(){
return $this->em->createQueryBuilder()
->select('DISTINCT m.thread')
->from('App\Entity\Message', 'm')
->where('m.thread IS NOT NULL')
->orderBy('m.thread', 'DESC')
->setMaxResults(10)
->getQuery()
->getResult();
}
解决方案2
public function getThreads(){
return $this->em->createQueryBuilder()
->select('m.thread')->distinct()
->from('App\Entity\Message', 'm')
->where('m.thread IS NOT NULL')
->orderBy('m.thread', 'DESC')
->setMaxResults(10)
->getQuery()
->getResult();
}
解决方案3
public function getThreads(){
$queryBuilder = $this->em->createQueryBuilder();
$queryBuilder->select('m.thread')->distinct()
->from('App\Entity\Message', 'm')
->where($queryBuilder->expr()->isNotNull('m.thread'))
->orderBy('m.thread', 'DESC')
->setMaxResults(10);
$query = $queryBuilder->getQuery();
$result = $query->getResult();
return $result;
}