我无法从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
答案 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')
));