我有这个功能,
public function getWall(){
$q = $this->createQueryBuilder('f');
$q->leftJoin("f.profilo", 'p');
$q->leftJoin("p.utente", 'u');
$q->where('(f.foto_eliminata IS NULL OR f.foto_eliminata != 1)');
$q->andWhere('p.fase_registrazione = :fase');
$q->andWhere('u.locked = :false');
$q->slice(0, 20);
$q->setParameter(':fase', 100);
$q->setParameter('false', false);
$q->orderBy('f.created_at', 'desc');
$dql = $q->getQuery();
$results = $dql->execute();
return $results;
}
但是我收到了这个错误,
Call to undefined method Doctrine\ORM\QueryBuilder::slice()
答案 0 :(得分:2)
好的,所以,你得到这个错误,因为QueryBuilder
没有这样的方法。但Collection
有。{1}}。如果你想使用切片,可能的变体是:
use Doctrine\Common\Collections;
public function getWall(){
$result = $this->createQueryBuilder('f')
->leftJoin("f.profilo", 'p')
->leftJoin("p.utente", 'u')
->where('(f.foto_eliminata IS NULL OR f.foto_eliminata != 1)')
->andWhere('p.fase_registrazione = :fase')
->andWhere('u.locked = :false')
->setParameter('fase', 100)
->setParameter('false', false)
->orderBy('f.created_at', 'desc')
->getQuery()
->getResult();
// $result typed as array
return new Collections\ArrayCollection($result))->slice(0,20); // convert array to collection, then slice
}
顺便说一句,以这种方式“限制”查询结果并不是一个好主意。
你可以使用setMaxResults(20)
,而不是选择所有对象。
关于延迟集合(http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html):选择result
个对象后,您可以从result
集合中获取一些对象:$r = $result[0]
之后:
$portfilos = $r->getPortfolio(); // returns for example Collection with some objects;
// its Lazy, without SQL query!
$portfolios->slice(0, 20); // queries first 20 potfolios
使用slice
是一个相当不错的主意,如果你在某些关系中有很多对象。
P.S。 sry,mb我没有认出你的问题,但尝试过:)
<强> EDITED 强> 修复了代码中的错误。