3

したがって、afterFindは、対応するモデル/コントローラー内にいるときに正常に機能します。ただし、関連付けられたモデルを呼び出す場合、afterFindコールバックに送信されるデータの形式は異なります。これにより、afterFindは、元のモデル/コントローラー内で作業しているときに行ったのと同じ配列インデックスを見つけることができないため、機能しなくなります。

誰もが理由を知っていますか、または修正が何である可能性がありますか?

4

3 に答える 3

3

$primaryあまり役に立たないかもしれません。false最初の深さを超えて ContainableBehaviour を使用する場合は常にそうであることがわかりました。

$this->Model->find('first', array(
  'contain' => array(
    'SecondaryModel' => array(
      'TertiaryModel',
    ),
  ),
));

関連するモデルに基づいて値を設定している場合は、その存在を確認して、次のようにいずれかの構造を処理できます。

function afterFind($results, $primary) {
  if (isset($results['TertiaryModel'])) {
    $results['secondary_model_field'] = 'value';
  }
  else {
    foreach ($results as &$result) {
      if (is_array($result) && isset($result['TertiaryModel'])) {
        $result[$this->alias]['secondary_model_field'] = 'value';
      }
    } unset($result);
  }

  return $results;
}

または、モデル自体のフィールドの場所を確認することもできます。フィールドが最上位に存在しない場合は、一連の結果を反復処理する必要があります。

于 2012-08-08T00:08:05.110 に答える
2

これがafterFindcallback の 2 番目のパラメーターの目的です。

$primaryfind がこのモデルから直接呼び出された ( true ) か、関連付けられたモデルによって呼び出された ( false ) かを示します。

本からのメモ:

$primary パラメーターは、現在のモデルがクエリの元のモデルであったかどうか、またはこのモデルが関連付けとしてクエリされたかどうかを示します。モデルが関連付けとしてクエリされる場合、$results の形式は異なる場合があります。

$primary が true であることを期待するコードは、再帰的な検索が使用されている場合、PHP から「文字列オフセットを配列として使用できません」という致命的なエラーを受け取る可能性があります。

したがって、値に応じて異なる処理ロジックが必要になる場合があります$primary

于 2012-06-05T19:30:59.110 に答える