警予:HAS_MANY搜索(Yii: HAS_MANY search)

2019-09-16 16:23发布

我有以下表格:

user (id, cv_personal_data_id),
cv_personal_data (id, firstname, surname, gender, address, ...),
cv_laboral_exp (id, user_id, position, seniority,... ),
cv_study (id, user_id, name, institution, average, ...),
cv_language (id, user_id, language_name, writing_level, ...)

在我的用户模型,我已经定义了以下关系:

    public function relations()
{
    return array(
        'cvLaboralExps' => array(self::HAS_MANY, 'CvLaboralExp', 'user_id'),
        'cvLanguages' => array(self::HAS_MANY, 'CvLanguage', 'user_id'),
        'cvStudies' => array(self::HAS_MANY, 'CvStudy', 'user_id'),
        'cvPersonalData' => array(self::BELONGS_TO, 'CvPersonalData', 'cv_personal_data_id'),
}

问题是:登录为一个公司,我需要显示CGridView列出所有用户,并能够由任何相关表的字段,如“位置”(从cv_laboral_exp),“语言名称”进行搜索(从cv_languages),等等。 我似乎无法找到一个解决方案来搜索来自HAS_MANY关系领域。 我尝试添加的用户类的搜索()方法“与”语句到$标准,试图搜索的用户体验LABORAL的位置,但没有成功:

                $criteria->compare('cvLaboralExps.position',$this->cvLaboralExps,true);
                $criteria->with = array('cvLaboralExps'=>array('select'=>'cvLaboralExps.position','together'=>true)); 

正如你看到有很多是形成用户的CV关系。 我会很感激,如果有人可以帮助我解决这个问题,即使这意味着改变数据库/模型结构。

Answer 1:

您实际上需要声明一个成员变量有问题的模型,在这里它是用户 。 你在做什么,问题是这样的(以compare() $this->cvLaboralExps ,这里cvLaboralExps是类的只是一种关系,而不是一个变量,可以存储的值,因此比较的$value是空的。 检查这条线,解释的第二个参数$value ,则在比较文档 :

如果字符串或数组为空,现有的搜索条件将不会被修改。

这可以通过声明一个成员变量的模型,并修改可以避免compare()调用,以使用新的变量。

...
class User extends CActiveRecord{
    // declare the variables that we need
    public $cvLaboralExpsLocal,$cvLanguages,$cvStudies;

    // now put these variables in rules array, so that massive assignment can be done, i.e. safe rule
    public function rules(){
         return array(
              // other rules ...
              array('attributesxyz, cvLaboralExpsLocal, cvLanguages, cvStudies', 'safe', 'on'=>'search')
         );
    }

    // other functions

    // the search can be kept just the way you have in the question but with the new variables
    public function search(){
          // other statements
          $criteria->compare('cvLaboralExps.position',$this->cvLaboralExpsLocal,true);
          $criteria->with = array('cvLaboralExps'=>array('select'=>'cvLaboralExps.position','together'=>true));
    }
}

注:1。请记住,改变_search.php形式来接受新的变量。
2.由于这是的has_many,你必须照顾好如何向最终用户输入的值。



文章来源: Yii: HAS_MANY search