无法在cakephp中使用containable从2个表中获取数据
我无法从两个表中获得数据,每个表都有条件。 文档中没有示例。 我只需要来自students表的行,其中一个字段被标记为非活动,来自Guardian表的相应行email字段不为空。 卫报有很多学生。 我得到了结果,但是我得到了Guardian电子邮件的空值。 我尝试了很多ID、型号名称等组合,但我就是不明白无法在cakephp中使用containable从2个表中获取数据,php,cakephp,Php,Cakephp,我无法从两个表中获得数据,每个表都有条件。 文档中没有示例。 我只需要来自students表的行,其中一个字段被标记为非活动,来自Guardian表的相应行email字段不为空。 卫报有很多学生。 我得到了结果,但是我得到了Guardian电子邮件的空值。 我尝试了很多ID、型号名称等组合,但我就是不明白 $guardianFound = $this->Student->find('all', array( 'contain' => array( 'Guardian',
$guardianFound = $this->Student->find('all', array(
'contain' => array( 'Guardian', array(
'conditions' => array('guardian_email !=' => null),
'fields' => array('id,guardian_email','guardian_first_name,guardian_last_name')
)),
'conditions' => array('student_inactive' => 1),
'fields'=> array('student_inactive' ),
'recursive'=> -1
));
结果:
(int) 0 => array(
'Student' => array(
'student_inactive' => true
),
'Guardian' => array(
'guardian_email' => '',
'guardian_first_name' => 'Tulay',
'guardian_last_name' => 'Karadavut',
'id' => '100'
)
)
看起来您的查询工作正常,但您可能希望排除
guardian\u电子邮件
为null或空的地方
要在CakePHP中为一个字段指定多个值,通常可以将其包装在另一个数组中,但对于您的情况,由于您要对NULL和空进行求反,这有点复杂,因为CakePHP处理db字段类型的方式不同。有关详细信息,请参阅此问题:。因此,为了简化它,您可以设置您的监护人条件,如下所示:
'conditions' => array(
'guardian_email IS NOT NULL',
'guardian_email != ""'
)
这里不需要递归
键,因为您正在使用containable指定要包含的内容。因此,最终的查找调用将是:
$guardianFound = $this->Student->find('all', array(
'contain' => array(
'Guardian' => array(
'conditions' => array(
'guardian_email IS NOT NULL',
'guardian_email != ""'
),
'fields' => array(
'id', 'guardian_email', 'guardian_first_name', 'guardian_last_name'
)
)
),
'conditions' => array('student_inactive' => 1),
'fields' => array('student_inactive')
));
请注意,您正在查找所有非活动学生,然后仅对与该学生关联的监护人执行监护人条件。如果没有符合条件的Guardian记录,该字段仍将返回,但所有值均为NULL
我在这里假设,因为学生属于监护人,而且每个学生只有一个监护人,所以您实际上只希望返回提供监护人电子邮件的学生记录。如果是这样的话,你只需要把守护者条件移到主条件中
$guardianFound = $this->Student->find('all', array(
'contain' => array(
'Guardian' => array(
'fields' => array(
'id', 'guardian_email', 'guardian_first_name', 'guardian_last_name'
)
)
),
'conditions' => array(
'student_inactive' => 1,
'Guardian.guardian_email IS NOT NULL',
'Guardian.guardian_email != ""'
),
'fields' => array('student_inactive')
));