【问题标题】:Using 'OR' in CakePHP find在 CakePHP 中使用“或”查找
【发布时间】:2017-03-29 15:54:12
【问题描述】:

我正在使用 CakePHP 3.2 和 find()。

if($filter_data_array['age_younger'] != '')
        {
            $conditions["icases.age <= "] = $filter_data_array['age_younger'];
        }

        if($filter_data_array['age_older'] != '')
        {
            $conditions["icases.age >= "] = $filter_data_array['age_older'];
        }

        if($filter_data_array['go_date_after'] != '')
        {
            $conditions["icases.go_date >= "] = $filter_data_array['go_date_after'];
        }

        if($filter_data_array['go_date_before'] != '')
        {
            $conditions["icases.go_date <= "] = $filter_data_array['go_date_before'];
        }

        if($filter_data_array['client'] != '')
        {
            $conditions["icases.client_id = "] = $filter_data_array['client'];
        }

        if($filter_data_array['case_name'] != '')
        {
            $conditions["icases.name = "] = $filter_data_array['case_name'];
        }

        if($filter_data_array['case_ref'] != '')
        {
            $conditions["icases.case_reference_i_d = "] = $filter_data_array['case_ref'];
        }

        if($filter_data_array['instruction_date'] != '')
        {
            $conditions["icases.date_instruction_received >= "] = $filter_data_array['instruction_date'];
        }

        $cases_data = TableRegistry::get('icases')->find('all')
                ->select(['icases.id', 'icases.state', 'icases.client_id', 'icases.name', 'icases.age', 'icases.case_reference_i_d', 'icases.go_date', 'clients.name'])
                ->innerJoin('icases_users', 'icases_users.icase_id = icases.id')
                ->where($conditions)
                ->innerJoin('clients', 'clients.id = icases.client_id')
                ->order(['clients.name' => 'ASC', 'icases.name' => 'ASC'])
                ->execute()
                ->fetchAll('assoc');

现在 icases 表中有一个状态列,我想过滤

icases.state='active' OR icases.state='pending' OR icases.state='archive'

我的问题是如何将它集成到我现有的 $conditions 数组中?

提前谢谢你。

【问题讨论】:

  • $conditions['status IN'] = ['active', 'pending', 'archive'];

标签: cakephp cakephp-3.0


【解决方案1】:

我认为你应该使用 cake 提供的Advanced Conditions。据我了解,第一个示例适合您的需要。

所以你应该在执行查询之前添加这个

$conditions['OR'] = [['icases.state' => 'active'], ['icases.state' => 'pending'], ['icases.state' => 'archive']];

【讨论】:

    【解决方案2】:

    这里是找到所有匹配OR 条件的解决方案

    $conditions = [];     #For storing all of your conditions as an array
    
    if($filter_data_array['age_younger'] != ''){
        $conditions[]["icases.age <= "] = $filter_data_array['age_younger'];
    }
    
    if($filter_data_array['age_older'] != ''){
        $conditions[]["icases.age >= "] = $filter_data_array['age_older'];
     }
    
    if($filter_data_array['go_date_after'] != ''){
        $conditions[]["icases.go_date >= "] = $filter_data_array['go_date_after'];
    }
    
    if($filter_data_array['go_date_before'] != ''){
        $conditions[]["icases.go_date <= "] = $filter_data_array['go_date_before'];
    }
    
    if($filter_data_array['client'] != ''){
        $conditions[]["icases.client_id = "] = $filter_data_array['client'];
    }
    
    if($filter_data_array['case_name'] != ''){
        $conditions[]["icases.name = "] = $filter_data_array['case_name'];
    }
    
    if($filter_data_array['case_ref'] != ''){
        $conditions[]["icases.case_reference_i_d = "] = $filter_data_array['case_ref'];
    }
    
    if($filter_data_array['instruction_date'] != ''){
        $conditions[]["icases.date_instruction_received >= "] = $filter_data_array['instruction_date'];
    }
    
    $cases_data = TableRegistry::get('icases')->find('all')
            ->select(['icases.id', 'icases.state', 'icases.client_id', 'icases.name', 'icases.age', 'icases.case_reference_i_d', 'icases.go_date', 'clients.name'])
            ->innerJoin('icases_users', 'icases_users.icase_id = icases.id')
            ->where(['OR'=>$conditions])   #All of your `OR` conditions here
            ->innerJoin('clients', 'clients.id = icases.client_id')
            ->order(['clients.name' => 'ASC', 'icases.name' => 'ASC'])
            ->execute()
            ->fetchAll('assoc');
    

    注意:您的代码已更改为 -

    $conditions[INDEX] to $conditions[][INDEX]
    

    ->where($conditions) to ->where(['OR'=>$conditions])
    

    【讨论】:

      【解决方案3】:

      首先,我建议关注CakePHP Conventions。您的代码将变得更具可读性。

      我还建议在 Table 对象中使用 connect your relations。这使您的代码保持干燥,您可以使用 contain 加载关联的模型,而不是使用 innerJoin '手动'。

      查看以下代码。它没有经过测试,但应该可以工作。使用Advanced conditions 有点“蛋糕式”并且易于维护。如果你不关心其余的,只需看一下代码中的$orConditions

      $query = TableRegistry::get('Cases')->find('all')
          ->select([
              'Cases.id', 
              'Cases.state', 
              'Cases.client_id', 
              'Cases.name', 
              'Cases.age', 
              'Cases.case_reference_i_d', 
              'Cases.go_date', 
              'Clients.name'
          ])
          ->order([
              'Clients.name' => 'asc', 
              'Cases.name' => 'asc'
          ])
          ->contain([
              'Clients',
              'Users'
          ])
          ->where(function ($exp) use ($filter_data_array) {
      
              if (!empty($filter_data_array['age_younger'])) {
                  $exp = $exp->lte('Cases.age', $filter_data_array['age_younger']);
              }
              if (!empty($filter_data_array['age_older'])) {
                  $exp = $exp->gte('Cases.age', $filter_data_array['age_older']);
              }
              if (!empty($filter_data_array['go_date_after'])) {
                  $exp = $exp->gte('Cases.go_date', $filter_data_array['go_date_after']);
              }
              if (!empty($filter_data_array['go_date_before'])) {
                  $exp = $exp->lte('Cases.go_date', $filter_data_array['go_date_before']);
              }
              if (!empty($filter_data_array['client'])) {
                  $exp = $exp->eq('Cases.client_id', $filter_data_array['client']);
              }
              if (!empty($filter_data_array['case_name'])) {
                  $exp = $exp->eq('Cases.name', $filter_data_array['case_name']);
              }
              if (!empty($filter_data_array['case_ref'])) {
                  $exp = $exp->eq('Cases.case_reference_i_d', $filter_data_array['case_ref']);
              }
              if (!empty($filter_data_array['instruction_date'])) {
                  $exp = $exp->gte('Cases.date_instruction_received', $filter_data_array['instruction_date']);
              }
      
              $orConditions = $exp->or_([
                  'Cases.state' => 'active',
                  'Cases.state' => 'pending',
                  'Cases.state' => 'archive'
              ]);
      
              return $exp->add($orConditions);
          });
      
      $cases_data = $query->execute();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-14
        • 1970-01-01
        • 2017-02-13
        相关资源
        最近更新 更多