如何在CakePHP3中对子查询进行分页?

如何在CakePHP3中对子查询进行分页?,php,cakephp,pagination,Php,Cakephp,Pagination,我有一个CakePHP 3应用程序,它有两个模型,URL和下载。这些模型相互关联,使得一个URL可能有多个下载(URL有许多下载) 当我执行类似这样的查询时,它将从url表和所有相关下载中返回1行: // This is in a view() method $query = $this->Urls->find()->contain(['Downloads' => ['sort' => ['Downloads.created' => 'DESC'] ] ])-

我有一个CakePHP 3应用程序,它有两个模型,
URL
下载
。这些模型相互关联,使得一个URL可能有多个下载(
URL有许多下载

当我执行类似这样的查询时,它将从
url
表和所有相关
下载中返回1行:

// This is in a view() method
$query = $this->Urls->find()->contain(['Downloads' => ['sort' => ['Downloads.created' => 'DESC'] ] ])->where(['id' => $id]);
我想对
下载列表进行分页,但看不到如何进行分页。我已经看过了,但我能找到的唯一我尝试过的东西是:

public function initialize()
{
    parent::initialize();
    $this->loadComponent('Paginator');
}

// In my view() method
$this->paginate = [
    'contain' => ['Downloads']
];

$query = $this->Urls->find()->contain(['Downloads' => ['sort' => ['Downloads.created' => 'DESC'] ] ])->where(['id' => $id])->paginate();
但它只是说
未知方法“paginate”

因为您只显示一个Url,所以可以执行两个查询

一个用于检索url的查询(不包括下载)

第二个用于检索(并分页!)定位销负载的

$downloads = $this->Urls->Downloads->find()
    ->sort(['created' => 'DESC'])
    ->where(['url_id' => $id]);

$downloads = $this->paginate($downloads) 

因为您只显示一个Url,所以可以执行两个查询

一个用于检索url的查询(不包括下载)

第二个用于检索(并分页!)定位销负载的

$downloads = $this->Urls->Downloads->find()
    ->sort(['created' => 'DESC'])
    ->where(['url_id' => $id]);

$downloads = $this->paginate($downloads) 

由于下载属于URL,您可以做相反的事情,如下所示:

$downloads = $this->Urls->Downloads->find()
    ->contain('Urls')
    ->where(['url_id' => $id])
    ->order(['created' => 'DESC']);

由于下载属于URL,您可以做相反的事情,如下所示:

$downloads = $this->Urls->Downloads->find()
    ->contain('Urls')
    ->where(['url_id' => $id])
    ->order(['created' => 'DESC']);

您的错误是因为
paginate()
不是表类的方法,并且您正在表对象上调用它,因此它是未知的。您需要在控制器对象上调用它:-

$this->paginate();
由于
paginate
是一种控制器方法,因此不能像您在示例中尝试的那样将其作为检索
Url
的查询的一部分调用。这意味着您需要执行两个查询,但如果您包含了下载内容,CakePHP就会这样做。例如:-

$this->Urls->get($id, ['contain' => 'Downloads']);
这基本上会导致以下两个查询,因为无法在SQL中使用
连接来完成这两个查询:-

$this->Urls->get($id);
$this->Urls->Downloads->find('all')->where(['url_id' => $id])->all();
因此,您需要首先获取
Url
:-

$url = $this->Urls->get($id);
然后要对下载进行分页,请将下载的查找查询传递到分页方法:-

$query = $this->Urls->Downloads->find()
    ->sort(['created' => 'DESC'])
    ->where(['url_id' => $id]);
$downloads = $this->paginate($query);

您的错误是因为
paginate()
不是表类的方法,并且您正在表对象上调用它,因此它是未知的。您需要在控制器对象上调用它:-

$this->paginate();
由于
paginate
是一种控制器方法,因此不能像您在示例中尝试的那样将其作为检索
Url
的查询的一部分调用。这意味着您需要执行两个查询,但如果您包含了下载内容,CakePHP就会这样做。例如:-

$this->Urls->get($id, ['contain' => 'Downloads']);
这基本上会导致以下两个查询,因为无法在SQL中使用
连接来完成这两个查询:-

$this->Urls->get($id);
$this->Urls->Downloads->find('all')->where(['url_id' => $id])->all();
因此,您需要首先获取
Url
:-

$url = $this->Urls->get($id);
然后要对下载进行分页,请将下载的查找查询传递到分页方法:-

$query = $this->Urls->Downloads->find()
    ->sort(['created' => 'DESC'])
    ->where(['url_id' => $id]);
$downloads = $this->paginate($query);

我真的希望在一个查询中完成这一切,因为能够使用
contain
的意义在于,您不必进行单独的查询。感谢您提供的信息。cake最终将执行两个不同的查询来检索数据。因此,我看不出我真正希望在一个查询中完成所有操作的要点,因为能够使用
包含
的要点是,您不必进行单独的查询。感谢您提供的信息。cake最终将执行两个不同的查询来检索数据。因此,我看不到要点您可能希望再次仔细查看文档,
paginate()
方法不是table类的方法。您可能希望再次仔细查看文档,
paginate()
方法不是table类的方法。