2017-04-19 4 views
1

私はUrlsDownloadsの2つのモデルを持つCakePHP 3アプリケーションを持っています。モデルは、URLが複数のダウンロードを持つように関連付けられています(Cakeの用語ではUrls hasMany Downloads)。私はこのようなクエリを行うとCakePHP 3ではどのようにサブクエリを改ページしますか?

それはUrlsテーブルから1行を返すと、関連Downloadsの全てます:

// This is in a view() method 
$query = $this->Urls->find()->contain(['Downloads' => ['sort' => ['Downloads.created' => 'DESC'] ] ])->where(['id' => $id]); 

私はDownloadsのリストをページ分割したいが、どのようにを見ることができませんこれを行う。私はhttps://book.cakephp.org/3.0/en/controllers/components/pagination.htmlを見て撮影したが、私が試した私は見つけることができる唯一のことはした:

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

しかし、あなただけの1を示しているので、それだけで 不明な方法を言ってエラーが

+0

'paginate()'メソッドは、テーブルクラスのメソッドではありません。 – ndm

答えて

0

「ページ付け」あなたは2つのクエリを実行できます。

1(ダウンロードなしで)URLを取得するクエリ

$url = $this->Urls->get($id); 

秒1を取得する(およびページ付け!)のDowloads

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

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

'contains'を使うことができるということは、別々のクエリを行う必要がないということです。しかし、情報をありがとう。 – Andy

+1

ケーキは最終的に2つの異なるクエリを実行してデータを取得します。だから私はポイントが表示されません – arilia

0

ダウンロードはURLへ属しているので、あなたが行うことができます反対は、次のように:paginate()が満たされていないので、

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

あなたの誤差がありますあなたはテーブルオブジェクトのそれを呼び出すので、それは不明です。あなたは、コントローラオブジェクト上でそれを呼び出す必要があります: - paginateとして

$this->paginate(); 

はあなたの例にしようとしているように、それはUrlを取得するためのクエリの一部として呼び出すことはできませんコントローラメソッドです。これは、2つのクエリを実行する必要があることを意味しますが、ダウンロードが含まれていれば、これはCakePHPがダウンしたものです。

$this->Urls->get($id, ['contain' => 'Downloads']); 
それは JOIN使用してSQLで行うことができないので、これは基本的に次の2つのクエリになり

: - - :たとえばだから、

$this->Urls->get($id); 
$this->Urls->Downloads->find('all')->where(['url_id' => $id])->all(); 

、あなたはUrl最初の取得が必要です -

$url = $this->Urls->get($id); 

そしてあなたがのpaginateメソッドにダウンロードのための検索クエリを渡したいのダウンロードページ付けする: -

$query = $this->Urls->Downloads->find() 
    ->sort(['created' => 'DESC']) 
    ->where(['url_id' => $id]); 
$downloads = $this->paginate($query); 
関連する問題