2013-09-24 64 views
1

我没有得到正确的过滤器为下面的行动。这里$val是一个检查值的数组。但是查询只对数组的最后一个元素执行,即使我使用了foreach循环。请帮助我吗?yii数据库查询内循环

if(isset($_POST['state']) && count($_POST['state']) > 0 ){ 
    foreach($_POST['state'] as $row => $val){ 
     $criteria = new CDbCriteria; 
     $criteria->select='*'; 
     $criteria->condition='pjt_user_id=:pjt_user_id && pjt_pdt_status=:pjt_pdt_status'; 
     $criteria->params=array(':pjt_user_id'=> $user_id, ':pjt_pdt_status'=> $val);  
     $criteria -> order = 'pjt_id';   
     $projects= ProjectModel::model() -> findAll($criteria); 



    } 
$this->render('index', array('projects'=>$projects)); 
+0

您将要覆盖的项目在循环变量,尝试$项目[] = ProjectModel ::模型() - >的findAll($标准);不要忘记在循环之前初始化它。 –

+0

谢谢你Martin Komara ... –

回答

0

这会更好 - 更可读:

if (isset($_POST['state']) && count($_POST['state']) > 0) { 
    $criteria = new CDbCriteria; 
    $criteria->addInCondition('pjt_pdt_status', $_POST['state']); 
    $criteria->addColumnCondition(array('pjt_user_id' => $user_id)); 
    $criteria->order = 'pjt_id'; 
    $projects = ProjectModel::model()->findAll($criteria);  
} 
1

感谢马丁农产会社.... 我在SQL的解决方案... 我只是使用或使用条件。

if(isset($_POST['state']) && count($_POST['state']) > 0){ 


     $i = 0; 
     foreach($_POST['state'] as $data){ 
      $condit[":$data"] = $data; 
      if($i!=0){ 
       $var .= ' || '; 
      } 
      $var .= " pjt_pdt_status=:$data"; 
      $i++;     
     } 
     $var = ' AND (' .$var.')';  
    } 
    $criteria = new CDbCriteria;  
    $criteria->select='*'; 
    $criteria->condition='pjt_user_id=:pjt_user_id' .$var ; 
    $criteria->params=$condit; 
    $criteria -> order = 'pjt_id';   
    $projects= ProjectModel::model() -> findAll($criteria);  
+0

我不知道这是否是最佳解决方案。但至少,这个答案解决了我的问题。感谢分享。 –