Yii搜索自定义字段

时间:2013-05-20 18:29:16

标签: php yii

我是yii的新手,并且已经暂时停留在这个问题上一段时间了,所以如果它显而易见的话,请光临我!

我必须将名字看作是名字和姓氏的组合,即fname&的结尾。 lname并返回所有可能的匹配项。现在,通过查看into this post,我已经取得了很大的成功。

所以现在我有我的模型课,我在这里搜索学生名称:

class StudentRegistration extends CActiveRecord
{

    /**
     * Public Varibale that defines the full name 
     */

     public $full_name;


     //my search function has something like this
     public function search()
     {
          $criteria=new CDbCriteria;
          $criteria->addSearchCondition('concat(fname, " ", lname)', $this->full_name); 
     .
     .
     .

     //my rules defining this
     full_name', 'safe', 'on'=>'search'),

    //my getter method like this
    public function getFull_Name()
    {
            return $this->fld_fname.' '.$this->fld_lname;
    }

}

通过这种结构,我可以在我的视图中添加一个全名属性,并且能够在表单视图中搜索全名。

现在这里是我完全难倒的部分。我正在尝试访问我已定义的搜索条件,以在另一个具有不同模型的视图中的ajax函数中搜索全名。

我已经为名称字段定义了一个变量,并指定了一个控制器来返回studentReg模型搜索中的搜索结果。但我没有成功(我的netbeans / xdebug毫不客气地崩溃,如果我把断点抱怨手表存在,当我没有时)

这是我的搜索操作类

  class StudentRegChecklistController extends Controller
  {
      .
      .
      .
      .
      .
        public function actionSearchStudent()
        {
        if(Yii::app()->request->getIsAjaxRequest() && isset($_POST["autoField"]))
        {
            $models=  StudentSearch::searchStudent($_POST["autoField"]);                
            $criteria=new CDbCriteria;
            $criteria->compare("full_name",$_POST["autoField"],true);
            $models=  StudentRegistration::model()->findAll($criteria);
            foreach($models as $model)
            {
              echo "<option value=$model->gno style=\"font-size:18px;cursor:pointer\">".$model->fname." ".$model->lname."</option>";
              echo "</br>";
            }
        }

我在控制器中做错了什么?试图实现like this

1 个答案:

答案 0 :(得分:1)

您好像在使用StudentRegistration::model()->findAll($criteria)而不是StudentRegistration::model()->search()

第一种方法将使用 $ criteria 信息查看您的模型表,并尝试匹配相关的表列。但* full_name *不是表列。

search()方法使用 $ this 作为过滤器。 $ this StudentRegistration 实例,* $ this-&gt; full_name *是已知属性, search()知道如何处理它。

如果要添加更多过滤器,只需在用作过滤器的实例中设置相关属性即可。类似的东西:

$filter = new StudentRegistration();
$filter->setAttributes(array('full_name' => "John Doe", 'registration_date' => '2013-01-01'));
$results = $filter->search();

NB:,您可能希望使用CActiveRecord处理的大量分配,而不是 setAttributes(),只要您的所有输入都“安全搜索”: / p>

$filter->attributes = $my_array_of_parameters; // likely $_POST['something']

如果它们不“安全搜索”,请将setAttributes()的第二个参数设置为false。 或者使用 setAttribute() ...