【发布时间】:2012-10-02 23:54:12
【问题描述】:
我一直在寻找有关 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 - John Appleseed”、“2 - Peter Googleseed”、“3 Larry Microseed”相关的表格指令
- 假设多条指令属于 3 位教师
- 如果 $teacher_id = 3,则查询返回所有指令,而不是显示属于该指令的正确教师,而是始终显示 id = 3 的教师;更准确地说:[Instruction][teacher_id] 设置为正确的值,但 [Instruction][Teacher] 始终设置为条件的教师
但让我们更进一步:
- 如果设置了 $recursive = -1,那么我只会返回模型“会计”的字段;未检索到 Instruction、Student、Teacher 字段
让我们确定
- 我把“public $actsAs = array('Containable');”在所有其他模型继承的 AppModel 中
- 是的,指令有一个“$belongsTo = array('Teacher', 'Student' => array(...))”
- 加入所需的字段都被选中
那么,什么?
你能不能帮我理解... - 为什么连接错误? - 为什么不检索所有字段?
我已经试过了
- 显式设置连接:很奇怪,然后 [Instruction][teacher_id] 为空且 [Instruction][Teacher] 未设置!
- 省略要检索的字段的显式选择
【问题讨论】:
-
你试过没有字段的包含吗?就像
$this->find('all',array('contain'=>array('Instruction'=>array('Student','Teacher'))).. 它应该返回所有相关的学生和老师的指令。如果没有,你就会知道你的模型之间的关系有问题 -
是的,我试过了。很奇怪:它返回所有数据,但现在只在设置正确的情况下显示教师(即如果教师满足条件),否则不设置 [Instruction][Teacher]。我怎样才能在条件为真的情况下返回指令?看起来它是左连接而不是内连接
标签: cakephp cakephp-2.0