0

myapp.dev:port から mamp v2.1.3 (pro ではないため、これが最新バージョンです) でローカルに Cake アプリケーション v2.3.1 を実行していますが、サイトにページネーションがあると (約 5秒)、コントローラー内の私のコードは次のとおりです。

public $paginate = array(
        'fields' => array('Artist.id, Artist.year_born, Artist.year_died, Artist.country_born'),
        'limit' => 50,
        'order' => array('Artist.id' => 'desc')
    );

AppController.php で次のように、ページネーションhttps://github.com/slywalker/TwitterBootstrapに Twitter ブートストラップ プラグインを使用します。

public $helpers = array('Paginator' => array('className' => 'TwitterBootstrap.BootstrapPaginator'));

ページネーションの を 1 に設定しようとしましたlimitが、ブートストラップの代わりにケーキ独自のページネーションを使用しようとしましたが、それでも非常に遅いです。myapp.dev:port/artists/view/14532 のようなアーティストにアクセスできるため、ページネーションを使用する必要があり、それはうまく機能するため、SQLクエリとは何の関係もないと思います。

/etc/hosts ファイルの名前を変更してみました127.0.0.1 localhost myapp.dev::1 localhost myapp.dev、何も機能しないようです。何か案は?私は本当に立ち往生しています。

更新:私の Artist テーブルの hasMany 関係について言及しないのは少し残念です。これは私のアーティストモデルです:

class Artist extends AppModel {

    public $hasMany = array(
        'ArtistBiography' => array('dependent' => true),
        'ArtistSurname' => array('dependent' => true),
        'ArtistSignature' => array('dependent' => true),
        'ArtistForename' => array('dependent' => true),
        'ArtistMonogram' => array('dependent' => true));
    public $hasOne = array(
        'ArtistActive' => array('dependent' => true));
}

DebugKit を使用したところ、ページネーターが 2 つの左結合に対して 2 つの不要なクエリを実行し、両方とも実行に約 2000 ミリ秒かかることがわかりました。ページネーターにこれを無視するように指示するにはどうすればよいですか? 私は新しい関係を与えるためにこのようなことを試みました:

public $paginate = array(
        'fields' => array('Artist.id, Artist.year_born, Artist.year_died, Artist.country_born'),
        'limit' => 50,
        'order' => array('Artist.id' => 'desc'),
        'joins' => array(
                array('table' => 'artist_forenames', 'alias' => 'ArtistForename', 'type' `=>     'inner', 'conditions' => array('Artist.id = ArtistForename.artist_id')),`
                array('table' => 'artist_surnames', 'alias' => 'ArtistSurname', 'type' => 'INNER', 'conditions' => array('Artist.id = ArtistSurname.artist_id'))),
        'recursive' => -1
    );

しかし、これを機能させる方法がわかりません。私が基本的に望んでいるのは、artist_surnamesandを結合し、artist_fornames呼び出された 2 つのテーブルを無視することでartist.activesありartist_monogram、両方を一緒にすると、クエリが 4000 ミリ秒遅くなります。

ここでの 2 番目の質問は、なぜこれら 2 つの結合によって速度が大幅に低下するのかということです。私は 100 人のアーティストをリストしている artist/all と呼ばれるテスト ビューを実行しました。すべての結合を含むクエリは約 40 ~ 50 ミリ秒で完了します。

4

1 に答える 1

3

TLDR:

  1. $recursiveに設定-1
  2. CakePHP の Containable Behaviorを使用して、必要な関連データのみを取得します

コードの例:

//wherever you set this variable
$paginate = array(
    'recursive' => -1,
    'limit' => 50,
    'order' => array('Artist.id' => 'desc'),
    'contain' => array(
        'ArtistSurname',
        'ArtistForName'
    )
);

Containable のドキュメントに目を通すことを忘れないでください - モデルを$actsAsContainable に設定する方法、recursive を -1 に設定する方法などについて説明しています。

AppModel で実際に両方を設定することpublic $recursive=-1'public $actsAs =array('Containable');お勧めします。そうすれば、すべてのモデルが設定され、必要なときにいつでも Containable を使用できるようになります。また、再帰の -1 よりも高いものはすべて悪い IMHO - Containable はあらゆる点ではるかに優れています。

于 2013-05-22T13:53:41.127 に答える