【问题标题】:Yii Search for a custom defined fieldYii 搜索自定义字段
【发布时间】:2013-05-15 09:19:39
【问题描述】:

我必须将名称查找为名字和姓氏的组合,即 fname 和 lname 的 concat 并返回所有可能的匹配项。现在通过查看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 函数中的全名。

我已经为 name 字段定义了一个变量,并分配了一个控制器来返回来自 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

【问题讨论】:

    标签: php yii


    【解决方案1】:

    您似乎使用的是StudentRegistration::model()-&gt;findAll($criteria) 而不是StudentRegistration::model()-&gt;search()

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

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

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

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

    注意:您可能希望使用由 CActiveRecord 处理的大量分配,而不是 setAttributes(),前提是您的所有输入都是“搜索安全”:

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

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

    【讨论】:

    • 所以,我想我明白你想说什么。我基本上需要使用 yii 内置的attribute search query,而不是我目前正在做的基本上是各种 sql 查询的操作? I have rewritten the function 根据我的理解,但不幸的是,即使这样也会抛出错误 =/
    • @Shouvik:我在我的一个项目中测试了一个类似的代码,它可以工作。至少我在调用 search() 后得到了数据。抛出了什么错误?
    • 我已在评论中附加了一个 pastebin。 pastebin.com/GJuuevuA能否检查一下函数的定义是否有误?
    • 我也在使用 NetBEans + xdebug。无论如何,如果您抛出错误,它们必须显示在日志或浏览器中的某个位置。请告诉我们更多有关错误消息的信息。 $_POST['autoField'] 的内容是什么?您对解析结果有错误吗?然后还要检查:stackoverflow.com/questions/12170102/…。没有细节很难说更多;o)
    • :) 我也很茫然!实际上,如果我看到错误消息,我更喜欢谷歌。我能够看到回发的结果,这是一个部分名称,我正在使用 jquery 回发。我的浏览器说服务器响应 500 内部错误,我的调试日志我不知道去哪里找。但是Apache日志在这里pastebin.com/QrRC7uNS
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多