CakePhp:使用包含条件的查找

时间:2016-08-31 11:34:17

标签: cakephp cakephp-2.8

我有以下型号:

  1. 公司(身份证,姓名)
  2. 员工(id,name,company_id,isRemoved)[公司有很多员工]
  3. 在指定的关联中,员工具有默认条件

    public $hasMany = array(
          'Employee' => array(
            'className' => 'Employee',
            'foreignKey' => 'company_id',
            'dependent' => true,
            'conditions' => array(
              'Employee.isRemoved' => 0
            ),
          )
      );
    

    该关联具有未删除员工的默认条件。我在公司上使用以下查询查询仅获取名称与字符串匹配的员工:

    $this->Company->find('all', array(
        'contain' => array(
            'Employee' => array(
                'conditions' => array(
                    'Employee.name LIKE' => '%'.$search_text.'%')
                ),
                'fields' => array('Employee.id, Employee.name')
            )
        )
    ));
    

    我面临的问题是,当我在contains中使用条件时,不会应用关联中指定的默认条件,并且未指定条件键时,将应用关联中指定的默认条件。

    这是Cakephp的默认行为吗?如何继续?我正在使用Cakephp 2.8.4

1 个答案:

答案 0 :(得分:1)

我无法告诉您模型中的条件是否被覆盖是CakePHP的默认行为。但是,我可以为您提供一个可能的选择:

通过在模型中使用beforeFind()回调,您可以添加'Employee.isRemoved' => 0条件。

因此,在您的Company模型中,您可以执行以下操作:

function beforeFind(array $queryData) {
    if(isset($queryData['contain']['Employee'])) {
        //Notice the extra [] to not overwrite the conditions set in the controller
        $queryData['contain']['Employee']['conditions'][]['Employee.isRemoved'] = 0;
    }
    return $queryData;
}

免责声明:我没有测试此代码。

来源:https://stackoverflow.com/a/17544106/6786476