【问题标题】:Symfony2 - Doctrine : setMaxResults() doesn't workSymfony2 - 教义:setMaxResults() 不起作用
【发布时间】:2016-02-15 14:44:32
【问题描述】:

我的存储库中有一个关于教义和自定义查询的问题。我在一个网站上工作,包括高级帐户。 例如,使用这些帐户,您可以不受列表成员结果的限制。如果您没有高级帐户,结果列表将限制为 10 个结果。

所以这是我的自定义查询:

/**
 * Avec cette fonction on obtient la liste de tous les membres
 * en utilisant une pagination
 * @param int $page
 * @param $limitResultPremium
 * @return Paginator
 */
public function getAllUser($page = 1,$maxResultPerPage = 6,$limitResultPremium = 10) {

    $query = $this->createQueryBuilder('u')
        ->select('u')
        ->where('u.enabled = true')
        ->andWhere('u.dCreated <= '. "'".date("Y-m-d H:i:s", time())."'")
        ->orderBy('u.dCreated')
        ->setMaxResults($limitResultPremium)
    ;

    $query->setFirstResult(($page-1) * $maxResultPerPage)
        ->setMaxResults($maxResultPerPage);


    return new Paginator($query);
}

如您所见,我使用 paginator 对结果页进行分页。但是我想使用函数setMaxResults(),它不起作用。我也有与我的查询相对应的最大结果(在我的情况下,我得到 11 个结果,我只想得到 10 个......)

如果有人可以帮助我...对不起我的英语!提前致谢

【问题讨论】:

  • $limitResultPremium 应该做什么?
  • $limitResultPremium 如果帐户不是高级帐户,则应该通过限制值
  • 所以如果当前用户有一个高级帐户,你只想显示10行,否则你允许分页并列出所有用户,对吗?在此功能中无法确定用户是否拥有高级帐户。
  • 是的,你是对的。我在调用此函数之前进行了此验证,并在 $limitPremium 变量中输入了一个值

标签: php symfony doctrine-orm


【解决方案1】:

我猜你在尝试使用$limitResultPremium 为已经工作的代码添加分页时最终得到了这段代码。多次调用setMaxResults 只会导致最后一次调用有效。你可能想要的是这样的:

public function getAllUser($page, $maxResultPerPage, $limitResultPremium) {

    $query = $this->createQueryBuilder('u')
        ->select('u')
        ->where('u.enabled = true')
        ->andWhere('u.dCreated <= '. "'".date("Y-m-d H:i:s", time())."'")
        ->orderBy('u.dCreated');

    if ($limitResultPremium !== null) {
        $pageMax = $limitResultPremium / $maxResultPerPage;
        $page = $page > $pageMax ? $pageMax : $page;
    }

    $query->setFirstResult(($page-1) * $maxResultPerPage)
        ->setMaxResults($maxResultPerPage);


    return new Paginator($query);
}

当用户试图查看超出其允许范围的页面时,他将被发送到允许的最后一个页面。您还应该限制演示文稿中的页面(不显示高于 $pageMax 的页面)。

【讨论】:

    【解决方案2】:

    您使用了两次-&gt;setMaxResults 方法。 我建议你这样做:

    public function getAllUser($page = 1,$maxResultPerPage,$limitResultPremium) {
    
        $query = $this->createQueryBuilder('u')
            ->select('u')
            ->where('u.enabled = true')
            ->andWhere('u.dCreated <= '. "'".date("Y-m-d H:i:s", time())."'")
            ->orderBy('u.dCreated');
    
        if ($limitResultPremium) {
            $maxResultPerPage = 10;
        }
    
        $query->setFirstResult(($page-1) * $maxResultPerPage)
            ->setMaxResults($maxResultPerPage);
    
        return new Paginator($query);
    }
    

    【讨论】:

    • 感谢您的回答!我已经尝试过您的解决方案,但我发现一个错误:尝试调用类“Doctrine\ORM\QueryBuilder”的名为“limit”的未定义方法。
    • 更新了我的评论。 sry 不得不查找如何再次使用教义 2 设置限制。
    • 这不是问题,不用担心 :) $maxResultPerPage 不限制结果,它只是限制每页的数量或结果,此参数不依赖于帐户溢价与否
    • 根据this 它应该限制这种方式......
    • 我认为我的问题是分页器已经对每页进行了限制。当我单击第二页时,它将显示下一个用户,但仅在第一个和最大结果之间。所以我想,我必须为这个限制找到另一个解决方案......
    【解决方案3】:

    如果您将使用的最大结果为 10 ,则不需要 limitResultPremium ,并且参数中不得定义 pge 编号

    public function getAllUser($page,$maxResultPerPage = 10) {
    
    $query = $this->createQueryBuilder('u')
        ->select('u')
        ->where('u.enabled = true')
        ->andWhere('u.dCreated <= '. "'".date("Y-m-d H:i:s", time())."'")
        ->orderBy('u.dCreated');
    
    
    
    $query->setFirstResult(($page-1) * $maxResultPerPage)
        ->setMaxResults($maxResultPerPage);
    
    return new Paginator($query, true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 2012-10-21
      • 2012-08-09
      • 1970-01-01
      • 2016-05-16
      • 2012-01-06
      相关资源
      最近更新 更多