2

我有这个功能,

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()
4

1 回答 1

2

好的,所以,你得到这个错误,原因QueryBuilder没有这样的方法。但是Collection有。如果你想使用切片,一个可能的变体是:

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如果您在某种关系中有很多对象,那么使用是一个相当不错的主意。

ps sry, mb 我没有意识到你的问题,但尝试了:)

EDITED 修复了代码中的错误。

于 2013-10-26T11:00:33.483 回答