Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 对分页结果进行排序的拉维学说_Php_Laravel_Doctrine Orm - Fatal编程技术网

Php 对分页结果进行排序的拉维学说

Php 对分页结果进行排序的拉维学说,php,laravel,doctrine-orm,Php,Laravel,Doctrine Orm,我是一个新的信条,我已经开始把它用于一个个人项目。我正在使用laravel条令库让它与laravel一起工作 不幸的是,当我尝试对分页查询排序时,我看到以下错误: An exception occurred while executing 'SELECT DISTINCT id_0 FROM (SELECT t0_.id AS id_0, t0_.title AS title_1, t0_.slug AS slug_2, t0_.views AS views_3, t0_.replies

我是一个新的信条,我已经开始把它用于一个个人项目。我正在使用laravel条令库让它与laravel一起工作

不幸的是,当我尝试对分页查询排序时,我看到以下错误:

An exception occurred while executing 'SELECT DISTINCT id_0 FROM (SELECT 
t0_.id AS id_0, t0_.title AS title_1, t0_.slug AS slug_2, t0_.views AS  
views_3, t0_.replies AS replies_4, t0_.created_at AS created_at_5,  
t0_.updated_at AS updated_at_6, p1_.id AS id_7, p1_.body AS body_8,  
p1_.created_at AS created_at_9, p1_.updated_at AS updated_at_10,  
p1_.deleted_at AS deleted_at_11, c2_.id AS id_12, c2_.name AS name_13,  
c2_.slug AS slug_14, c2_.created_at AS created_at_15, c2_.updated_at AS  
updated_at_16 FROM topics t0_ LEFT JOIN posts p1_ ON t0_.id = p1_.topic_id  
LEFT JOIN categories c2_ ON t0_.category_id = c2_.id) dctrn_result ORDER BY  
created_at_5 ASC LIMIT 10 OFFSET 0':

SQLSTATE[HY000]: General error: 3065 Expression #1 of ORDER BY clause is not  
in SELECT list, references column 'dctrn_result.created_at_5' which is not  
in SELECT list; this is incompatible with DISTINCT
导致此错误的实际代码如下所示:

    public function findAll($results = 10, $pageName = 'page') {
        $query = $this->createQueryBuilder('t')
            ->select('t', 'f', 'c')
            ->leftJoin('t.first', 'f', 'ON')
            ->leftJoin('t.category', 'c', 'ON')
            ->orderBy('t.createdAt', 'asc')
            ->getQuery();

        return $this->paginate($query, $results, $pageName);
    }
我正在尝试选择一个主题列表,包括它们的类别和第一篇文章,所有这些都是按日期创建的主题排序的


我花了一些时间来研究这个问题,但到目前为止还无法弄清楚到底发生了什么,我是否应该用其他方法来做这件事,还是我的代码不正确?

结果是
paginate()
的第四个参数导致了这个问题,它的默认值为
true
,但将其设置为
false
会使其再次开始工作

 public function paginate(Query $query, $perPage, $pageName = 'page', $fetchJoinCollection = true)
只需将
$fetchJoinCollection
设置为false。我不确定确切的原因,但它目前起作用。

根据这一原则,计算正确的计数需要三个步骤:

  • 使用DISTINCT关键字执行计数查询
  • 使用DISTINCT执行限制子查询,以在当前页面上的from中查找实体的所有ID
  • 执行WHERE IN查询以获取当前页面的所有结果
  • 我认为当ORDERBY子句被附加到子查询的外部而不是内部时,会产生SQL错误。在文档的底部,他们说设置fetchJoinCollection=false将跳过一步。这可能是绕着问题转的


    我希望他们能在未来的版本中解决这个问题。

    我的错误与您的错误完全相同,但我的错误已离开join,必须将
    $fetchJoinCollection
    变为真。这个解决方案对我不起作用。