2012-07-18 63 views
0

我有一个CakePHP应用程序,其中包含许多使用来自特定模型的数据的多个屏幕。大多数情况下,我需要检查特定的字段(例如cookbook中的“user_active => 1”示例),但是我仍然希望能够将该字段指定为条件并覆盖默认值。我的代码有效,但是这是做到这一点的最佳方式吗?在CakePHP中设置默认搜索值的正确方法

此外,$ queryData字段是混合的 - 除数组之外还有什么可能?只是NULL?

<?php public function beforeFind($queryData) { 
    if(is_array($queryData)) { 
     //query data was an array 
     if(!is_array($queryData['conditions'])) { 
      $queryData['conditions'] = array('Course.semester_id'=>SEMESTER_ID); 
     } else if (!isset($queryData['conditions']['Course.semester_id'])) { 
      $queryData['conditions']['Course.semester_id'] = SEMESTER_ID; 
     } 
    } 
} ?> 

回答

0

我会建议在您的模型中自定义findCourses($options)函数。这样,您可以设置所有默认条件,并覆盖在$options中传递的所有内容。

下面是一个例子:

//Article model 

public function articles($opts = null) { 

    //initialize 
    $params = array(); 
    $findType = 'all'; 
    $params['conditions'] = array(); 

    //status 
    if(!empty($opts['status'])) { 
     array_push($params['conditions'], array('Article.status'=>$opts['status'])); 
    } else { 
     array_push($params['conditions'], array('Article.status'=>1)); 
    } 

    //id 
    if(!empty($opts['id'])) { 
     $params['limit'] = 1; 
     $findType = 'first'; 
     array_push($params['conditions'], array('Article.id'=>$opts['id'])); 
    } 

    //slug 
    if(!empty($opts['slug'])) { 
     $params['limit'] = 1; 
     $findType = 'first'; 
     array_push($params['conditions'], array('Article.slug'=>$opts['slug'])); 
    } 

    //limit (and find type) 
    if(!empty($opts['limit'])) { 
     $params['limit'] = $opts['limit']; 
     if($opts['limit'] == 1) $findType = 'first'; 
    } 

    //order by 
    $params['order'] = array('Article.created DESC'); 
    if(!empty($opts['order'])) { 
     $params['order'] = $opts['order']; 
    } 

    //type 
    if(!empty($opts['type'])) { 
     array_push($params['conditions'], array('type'=>$opts['type'])); 
    } 

    //find type 
    if(!empty($opts['find_type'])) $findType = $opts['find_type']; 

    //slug 
    if(!empty($opts['slug'])) { 
     array_push($params['conditions'], array('slug'=>$opts['slug'])); 
    } 

    //search 
    if(!empty($opts['search'])) { 
     array_push($params['conditions'], array('Article.title LIKE' => '%'.$opts['search'].'%')); 
    } 

    //contain 
    $params['contain'] = array('MetaData', 'Tag', 'Upload'); 

    //paginate options or results 
    if(!empty($opts['paginate'])) { 
     return $params; 
    } else { 
     return $this->find($findType, $params); 
    } 

} 

在我的控制,我可以做到这一点:

$opts = array('limit'=>6, 'type'=>'gaming'); 
$articles = $this->Article->articles($opts);