在Doctrine中调用未定义的方法Slice

时间:2013-10-26 10:14:56

标签: symfony doctrine-orm doctrine

我有这个功能,

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

1 个答案:

答案 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 修复了代码中的错误。