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);

所以有一个指令,学生和老师都属于这个指令。我从“会计”模型中调用 find

我的期望

  1. 连接是自动完成且正确的
  2. 检索包含中提到的字段

我得到了什么

  1. 字段已连接,但错误;所以结果数组包含一个有学生和教师的指令。但不是显示属于指令的正确教师,而是始终显示条件中指定的教师。

例子:

  • 假设与教师“1 - John Appleseed”、“2 - Peter Googleseed”、“3 Larry Microseed”相关的表格指令
  • 假设属于 3 位教师的多个指令
  • 如果 $teacher_id = 3,则查询返回所有指令,而不是显示属于该指令的正确教师,而是始终显示 id = 3 的教师;更准确地说: [Instruction][teacher_id] 设置为正确的值,但 [Instruction][Teacher] 始终设置为条件的教师

但让我们更进一步:

  1. 如果设置了 $recursive = -1,那么我只会返回模型“会计”的字段;未检索到 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# contains-deeper-associations

您在可包含项上提供的条件用作过滤器,而不是连接的限制。所以它不会返回某个教师的指令,而是返回所有指令及其关联的教师,过滤具有条件的教师array('Teacher.id' => $teacher_id)

尝试在指令而不是教师上添加条件。就像是:

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

这将返回所有的会计,它只会过滤某个老师的指令。

您总是可以手动进行连接(它可能看起来不太好,但它可以工作),如果您正在这样做,请记住将 containsable 设置为 false。

希望这可以帮助

于 2012-10-12T09:38:33.570 回答