2011-02-23 10 views
1
で彼らの最新のコメント

との記事を取得し、私はモデルPostと、次のように関連するモデルComment持って言う:は、CakePHP

Post hasMany Comment 
Comment belongsTo Post 

をどのようにCommentそれに関連する最新のすべてのPostを取得するためにfind('all')を使うのですか?

私はとPosthasOne関係を定義しようとしている:

var $hasOne = array('LatestComment' => array('className' => 'Comment', 'order' => 'LatestComment.created DESC')); 

しかし、私はPost->find('all')を行う際には、異なるCommentsLatestComment設定して、一回ごとCommentにつき、すべてのPostを複数回返します。

+0

は、私の問題に関連している可能性があります:http://stackoverflow.com/questions/8707048/last-x-blog-entries-but-only-once-per-user/11933591#11933591 – mark

答えて

2

パラメータの配列に 'limit' => 1を追加して、1つのコメントのみを返すことができます。

また、別の関係を定義する代わりに、「包含」ビヘイビアを使用して検索を実行するときに返されるコメントの数を制限することもできます。

$this->Post->find('all',array(
        'contain' => array(
          'Comment' => array(
           'order' => 'Comment.created DESC', 
           'limit' => 1 
         ) 
        ) 
       ); 

これは、関連付けを定義しなくても関係を定義する場合(作成者別または日付範囲内など)に便利です。

参照可能なモデルにコンテナの動作を追加するようにしてください。

+0

私はそれをもう一度します。必ずContainableを使用してください! – OldWest

+0

hasOne関係はオプション 'limit'をサポートしていないようです(http://book.cakephp.org/#!/view/1039/Associations-Linking-Models-Togetherを参照)。2番目の提案はうまくいきますが、これをhasOne関係で行う方法を見て、latestCommentを他の関連モデル(クエリに自動的に追加)として使用することができます。 – zephyr

+0

あなたはhasManyを使用し、その結果を1に制限できます。これは直感に反するようですが、うまくいくはずです。 – NathanGaskin

0

使用する複製を削除するには、すべての検索クエリでGROUP BYを使用します。私はCakeが 'group' =>オプションも持っていると信じています。

+0

これは私に各投稿の1つだけを与えますが、正しい(最新の)コメントは付けません。 – zephyr

+0

これを拡張して、クエリの他の部分を実行する必要があります。 DESCでソートし、配列結果から最初の要素を取得します。 – OldWest