1

私はCakePHPの包含可能性について長い間探していましたが、どういうわけか、CakePHPコードに誤りがあるという印象を受けます...次の例を挙げましょう

「指示」に関連するモデル「会計」を想定します。

public $belongsTo = array('Instruction');

私はこのような参加をします:

$options['contain'] = array(
        'Instruction' => array(
           'fields'  => array('Instruction.id', 'Instruction.main_student_id', 'Instruction.teacher_id'),
           'Student' => array(
               'fields' => array('Student.id', 'Student.full_name', 'Student.invoice_payer_id'),
           ),
           'Teacher' => array(
                'fields' => array('Teacher.id', 'Teacher.full_name'),
                'conditions' => array('Teacher.id' => $teacher_id)
           ),
        )
);      
return parent::find('all', $options);

したがって、指示があり、この指示には生徒と教師が属します。私は「会計」モデルから検索を呼び出します

私が期待すること

  1. 結合は自動的に行われ、正しく行われます
  2. 含むに記載されているフィールドが取得されます

私が得るもの

  1. フィールドは結合されていますが、間違っています。したがって、結果の配列には、生徒と教師による指示が含まれます。ただし、命令に属する正しい教師を表示する代わりに、条件で指定された教師を常に表示します。

例:

  • 教師「1-ジョンアップルシード」、「2-ピーターグーグルシード」、「3ラリーマイクロシード」に関連する表の説明を想定します。
  • 3人の教師に属する複数の指示を想定します
  • $ Teacher_id = 3の場合、クエリはALL命令を返し、命令に属する正しい教師を表示する代わりに、常にid=3の教師が表示されます。より正確に言うと、[Instruction] [teacher_id]は正しい値に設定されていますが、[Instruction][Teacher]は常に条件の教師に設定されています

しかし、さらに一歩進んでみましょう。

  1. $ recursive = -1が設定されている場合、モデル「Accounting」のフィールドのみが返されます。Instruction、Student、Teacherのフィールドは取得されません

確認しましょう

  • 「public$actsAs = array('Containable');」と入力します。他のすべてのモデルが継承するAppModel内
  • はい、命令には「$ belongsTo = array('Teacher'、'Student' => array(...))」があります
  • 参加に必要なフィールドはすべて選択されています

だから何?

私が理解するのを手伝ってくれませんか...-なぜ結合が間違って行われるのですか?-なぜすべてのフィールドが取得されないのですか?

もうやってみました

  • 結合を明示的に設定するには:非常に奇妙な場合、[Instruction] [teacher_id]は空で、[Instruction] [Teacher]は設定されていません!
  • 取得するフィールドの明示的な選択を除外するには
4

1 に答える 1

1
Containable also goes a step deeper: you can filter the data of the associated models.

http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html#containing-deeper-associations

コンテナブルに指定した条件は、結合の制限としてではなく、フィルターとして使用されます。したがって、特定の教師の指示は返されませんが、すべての指示が関連付けられた教師とともに返され、教師が条件でフィルタリングされます。array('Teacher.id' => $teacher_id)

Teacher の代わりに Instruction に条件を追加してみてください。何かのようなもの:

'Instruction' => array(
    'Student','Teacher',
    'conditions' => array('Instruction.teacher_id' => $teacher_id)

これにより、すべてのアカウンティングが返され、特定の教師の指示のみがフィルタリングされます。

結合はいつでも手動で行うことができます (見栄えは悪いかもしれませんが、機能します)。実行する場合は、containable を false に設定することを忘れないでください。

お役に立てれば

于 2012-10-12T09:38:33.570 に答える