无法在cakephp中使用containable从2个表中获取数据

无法在cakephp中使用containable从2个表中获取数据,php,cakephp,Php,Cakephp,我无法从两个表中获得数据,每个表都有条件。 文档中没有示例。 我只需要来自students表的行,其中一个字段被标记为非活动,来自Guardian表的相应行email字段不为空。 卫报有很多学生。 我得到了结果,但是我得到了Guardian电子邮件的空值。 我尝试了很多ID、型号名称等组合,但我就是不明白 $guardianFound = $this->Student->find('all', array( 'contain' => array( 'Guardian',

我无法从两个表中获得数据,每个表都有条件。 文档中没有示例。 我只需要来自students表的行,其中一个字段被标记为非活动,来自Guardian表的相应行email字段不为空。 卫报有很多学生。 我得到了结果,但是我得到了Guardian电子邮件的空值。 我尝试了很多ID、型号名称等组合,但我就是不明白

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