Yii: поиск HAS_MANY

У меня есть следующие таблицы:

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, ...) 

В моей модели User я определил следующие отношения:

  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), «language_name» (из cv_languages) и т. д. Я не могу найти решение для поиска полей, которые исходят из отношения HAS_MANY. Я попытался добавить в метод search () класса User инструкцию 'with' к критериям $, чтобы попытаться найти позицию пользователя в трудовом опыте, но безуспешно:

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

Как видите, существует много отношений, которые формируют CV пользователя. Я был бы очень благодарен, если бы кто-нибудь мог помочь мне решить эту проблему, даже если это подразумевает изменение структуры базы данных / модели.

Related of "Yii: поиск HAS_MANY"

Вам действительно нужно объявить переменную-член для рассматриваемой модели, здесь это User . Проблема с тем, что вы делаете, это this (in 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, ie 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, вам нужно будет позаботиться о том, как конечный пользователь вводит значения.