我有以下表格:
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关系的字段。我尝试在User类的search()方法中向$ criteria添加’with’语句,以尝试搜索用户辛苦工作的位置,但未成功:
$criteria->compare('cvLaboralExps.position',$this->cvLaboralExps,true); $criteria->with = array('cvLaboralExps'=>array('select'=>'cvLaboralExps.position','together'=>true));
如您所见,有很多关系构成用户的简历。如果有人可以帮助我解决这个问题,我将不胜感激,即使这意味着更改数据库/模型结构也是如此。
实际上,您实际上需要为该模型声明一个成员变量,这里是 User 。您正在做的问题是this(in compare())$this->cvLaboralExps:,这里cvLaboralExps只是类的一个关系,而不是一个可以存储值的变量,因此比较的$value值为空。检查这行,$value在比较文档中解释第二个参数:
compare()
$this->cvLaboralExps
cvLaboralExps
$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,因此您必须注意最终用户如何输入值。