2017-12-13 20 views
0

以下はcakephpのドキュメントが動作しない行です。フェッチ戦略CakePHP 3関連の制限が機能しません

を変更

あなたはすでに知っているかもしれませんが、belongsToのとhasOneのアソシエーションがメインファインダクエリでJOINを使用してロードされます。これにより、クエリとフェッチ速度が改善され、データを取得するときに表現力豊かな条件を作成できるようになりますが、order()やlimit()などの関連付けのファインダクエリに特定の句を適用する場合には問題になる可能性があります。あなたは協会として記事の最初のコメントを取得したい場合例えば

、:

$articles->hasOne('FirstComment', [ 
    'className' => 'Comments', 
    'foreignKey' => 'article_id' 
]); 

、我々が使用するクエリを指示する必要があります正しく、この関連付けからデータをフェッチするためには、 CakePHPはstがすることhasOneノートで作業する場合

$query = $articles->find()->contain([ 
    'FirstComment' => [ 
     'strategy' => 'select', 
     'queryBuilder' => function ($q) { 
      return $q->order(['FirstComment.created' =>'ASC'])->limit(1); 
     } 
    ] 
]); 

おかげ

+0

"_doesn't work_"は適切な問題の説明ではありません!問題がCakePHPの内部を知っている人にとって明白であっても、_exactly_が何を起しているのか、そして_確実に_何が起こるのかについて常にできるだけ具体的にしてください。 Cookbookの例をダンプするだけではなく、_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ – ndm

+0

私の場合、1つの記事について多くのコメントがあります。今は各記事の最新のコメントを取得する方法を知る必要があります。 – Pankaj

+0

これはあなたの質問で詳しく説明します。 ** https://stackoverflow.com/questions/30241975/how-to-limit-contained-associations-per-record-group** – ndm

答えて

0

:我々は特定の列でオーダーをしたいので、選択の戦略、 queryBuilderが呼び出された後、ORDER BY句をクエリからリッピングします。 queryBuilderは、JOIN句の結合条件を作成するために使用されます。結合のためにON (expression)内にORDER BY句を許可するSQL構文はありません。

ORDER BYを使用する場合は、hasOneのSELECT戦略も使用する必要があります。

この問題を回避するには、カスタムファインダを使用します。

CommentsTableクラスでは、注文を設定するカスタムファインダーを定義します。

public function findFirstComment($q) { 
     return $q->order([$this->aliasField('created') =>'ASC']); 
    } 

カスタムファインダーで追加したときCakePHPはhasOneためORDER BY句を削除しません。

注:カスタムファインダは、ソーステーブルではなく、関連付けのターゲットである必要があります。

+0

同じ時間各記事の最新の3つのコメントを取得する方法を説明してください – Pankaj

+0

@Pankajあなたはもっと助けが必要ですが、あなたはupvoteまたは私の答えを受け入れることにも気にすることはできません。それはこのウェブサイトの仕組みではありません。 – cgTag

+0

私はupvoteしようとしたが、評判の問題に直面して – Pankaj

関連する問題