如何在CakePHP3中对子查询进行分页?
我有一个CakePHP 3应用程序,它有两个模型,如何在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'] ] ])-
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类的方法。