无法使用cakephp中的containsable从2个表中获取数据

时间:2015-04-12 03:23:30

标签: php cakephp

我无法从2个表中获取数据,每个表都有条件。 文档中没有示例。 我只需要学生表中的行,其中字段被标记为非活动状态,而Guardian表中的相应行,电子邮件字段不为空。 卫报有很多学生。 我得到了结果,但我得到了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'
    )
)

http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html

1 个答案:

答案 0 :(得分:2)

看起来您的查询按预期工作,但您可能希望排除guardian_email为空或空的位置。

要在CakePHP中为字段指定多个值,通常可以将其包装在另一个数组中,但对于您的情况,由于您要否定NULL并清空,由于CakePHP处理的方式,它有点复杂db字段类型。有关详细信息,请参阅此问题:Cake PHP complex find 'OR' is not working properly with null and empty string。因此,为了简化它,您可以像这样设置Guardian条件:

'conditions' => array(
    'guardian_email IS NOT NULL',
    'guardian_email != ""'
)

您不需要recursive密钥,因为您正在使用可包含的内容指定要包含的内容。所以最后的查找电话将是:

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