私は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-ピーターグーグルシード」、「3ラリーマイクロシード」に関連する表の説明を想定します。
- 3人の教師に属する複数の指示を想定します
- $ Teacher_id = 3の場合、クエリはALL命令を返し、命令に属する正しい教師を表示する代わりに、常にid=3の教師が表示されます。より正確に言うと、[Instruction] [teacher_id]は正しい値に設定されていますが、[Instruction][Teacher]は常に条件の教師に設定されています
しかし、さらに一歩進んでみましょう。
- $ recursive = -1が設定されている場合、モデル「Accounting」のフィールドのみが返されます。Instruction、Student、Teacherのフィールドは取得されません
確認しましょう
- 「public$actsAs = array('Containable');」と入力します。他のすべてのモデルが継承するAppModel内
- はい、命令には「$ belongsTo = array('Teacher'、'Student' => array(...))」があります
- 参加に必要なフィールドはすべて選択されています
だから何?
私が理解するのを手伝ってくれませんか...-なぜ結合が間違って行われるのですか?-なぜすべてのフィールドが取得されないのですか?
もうやってみました
- 結合を明示的に設定するには:非常に奇妙な場合、[Instruction] [teacher_id]は空で、[Instruction] [Teacher]は設定されていません!
- 取得するフィールドの明示的な選択を除外するには