2016-06-27 10 views
0

私は2つのテーブル(ユーザと技術)を持っており、それらのデータを第3のコントローラの中に別々に取り出す必要があります。複数のデータを取得するCakephp 3

私はloadmodelとfind()を使って$ this-> set()を介して表示するようにdatasを設定できますが、これを実行するとWebサイトは70年代より遅くなります。

だから、基本的に私はここに私のコードだ私のクエリを最適化し、私のDB

をスピードアップする必要があります。

$users = $this->loadModel('Users'); 


    $datas=$users->find('all')->select(['id','phone', 'first_name','last_name','birthday','email','website', 'address', 'resume', 'cv_url'])->where(['id' => 1])->bufferResults(false)->ToArray(); 


    $technologies = $this->loadModel('Technologies'); 
    $technologies=$technologies->find('all')->select(['id', 'name', 'slug', 'image', 'exp', 'exp_perc'])->bufferResults(false)->ToArray(); 

    $this->set(compact('datas','technologies')); 

一部DebugKit画像 enter image description here enter image description here

あなたは私だけで2つのクエリを持って見ることができるとしてではなく、デバッグには10を示し、TABLE_SCHEMAは35322msを取って、その2時間(35322 * 2)

と呼ばれます

ご提案は大歓迎です。

+1

私はあなたの質問に多くの情報を追加することをお勧めします。それは、再現性のない問題であるため、多分助けにならないでしょう。同様に、どのDBMSを使用していますか?結果のクエリはどのように見えますか?検索されるレコードの数はいくつですか?どこの時間が費やされているのですか(プロファイラを使ってそれを把握してください)? ... – ndm

答えて

0

モデルを読み込んで選択クエリを作成する代わりに(クエリ時間が長くなる)、TableRegistryを使用する必要があります。

たとえば、あなたの代わりに$users = $this->loadModel('Users');$usersTable = TableRegistry::get('Users');を使用する必要があり、その後、あなたはforeach($query as $row)で、クエリの行を$query = $usersTable->find('all')->.....を使用してデータを照会して繰り返すことができます。

「ユーザー」モデル全体が読み込まれず、cakePHPクエリで簡単に操作できるUsersTableのみが使用されることを考慮すると、より高速に処理する必要があります。 http://book.cakephp.org/3.0/en/orm/table-objects.html#getting-instances-of-a-table-class

私はそれが役に立てば幸い:

は、ここではいくつかの詳細な情報です! ;)

+0

私はすでにそれを試みました、問題は、サーバー上で直接作業しています。デバッグモードでは、クエリを実行するのに多くの時間がかかります。私はlocalhost上でそれを試して、それは正常にデバッグモードが設定されている場合でも正常に動作します。 –

関連する問題