2016-09-09 5 views
0

現在、私は2つの関連テーブルで作成した列をソートし、それに応じて親テーブルを更新する必要があるタイムライン機能を実装しようとしています。CakePHP 3 ORM - 2つの異なる関連テーブルの2つの列に基づいた並べ替え

具体的には、私は多くのコメントを持つ写真の表を持っています。私はコメントと画像の両方のテーブルの作成された列の最新のタイムスタンプに基づいて画像を並べ替える必要があります。

は、私は必要なデータを取得する次のクエリを持っているが、それは正しく注文されていません。

public function getPicturesAndCommentsOfUser($userId){ 
    return $this->find() 
     ->contain([ 
      'Comments' => function ($q){ 
       return $q 
        ->contain(['Users' => function ($q) { 
         return $q->select($this->select); 
        }]) 
        ->order(['Comments.created' => 'ASC']); 
      }, 
      'Users' => function ($q) { 
       return $q->select($this->select); 
      }, 
      'Albums' 
     ]) 
     ->matching('Albums.Users', function ($q) use ($userId) { 
      return $q 
       ->where(['Users.id' => $userId]); 
     }); 
} 

私の質問はPictures.createdとComments.createdの順序の両方を組み合わせる方法です。私はすでに - > contains(['Comments'])と最後に一致した呼び出しの後のチェーンの最も外側の部分の両方でorder関数を呼び出そうとしました。私は2つのテーブルを互いに関連付ける方法を理解できないので、両方のテーブルを並べ替えることはできません。

さらに、他の情報源(like this one)で私はユニオンステートメントを使用することができますが、私がそのオプションについて知ることができるすべての情報は、関連していない無関係なテーブルでも機能するということです。

誰も私にこれを解決する方法のいくつかの指示を与えることができますか?

答えて

0

まず、あなたの目的は明確でなければなりません。どの注文が優先されますか? Pictures.createdまたはComments.created?両方に基づいて結果を並べ替えることはできません。あなたがこのようなことをするとき:

$this->Comments->find()->order(['Pictures.created' => 'ASC'])-> 
    order(['Comments.created' => 'ASC']); 

注文はComments.createdのためだけに保証されます。 2つのコメントに等しい時間があった場合は、Pictures.createdで注文します。

もう一つ考慮すべきことがあります。より多くのデータが格納されているオブジェクトに対してクエリを作成します。各場合Picture HasMany CommentsCommentsにクエリを作成しようとします。 Picturesにクエリを作成するときに結果がどのようにソートされるかはわかりません。検索されたレコードはPictures.idではなくソートされますが、結果がオブジェクトモデルに変換されると、コメントはピクチャにネストされ、以前の順序が破棄されます。

そして、ついには複雑にしません。クエリでPHPロジックを使用してもパフォーマンスは向上しません。そうしないとコードの可読性が低下します。したがって、PHPロジックを最初に実行しようとしている場合は、最初にすべてのデータを取得し、いくつかの単純なforeachを使用して処理します。

+0

私が使用しているプラ​​グイン(Crud v4)の標準機能のオーバーロードは、私がピクチャで始まる何かでクエリを置き換えることしかできないので、私のコメントはコメントにはできません(私は標準のインデックスメソッド)。最近のコメントでソートされた関連するすべての画像を画像の最初のコメントとして取り出すことで、今解決しました。その後、手作りソートアルゴリズムを使用して、適切な結果を得ます。醜いですが、それは動作します。 – markvdlaan93

関連する問題