2012-04-23 4 views
3

У меня есть следующие таблицы: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. Я попробовал, добавив в методе поиска() из пользовательского класса «с» заявление на $ критериев, в попытке поиска позицию опыта пользователя Лабораль, но без успеха:

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

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

+0

has_many означает много связанных записей, поэтому прежде всего, как вы планируете отображать записи has_many? как выпадающие списки в каждом столбце? или что-то еще, может быть? –

+0

Я мог отображать каждую запись пользователя в строке, а затем применять функцию implode к массиву связанных записей, поэтому пользователь user1 будет иметь «Developer, Tester, Designer» в столбце позиций. Моя основная проблема заключается в том, как искать эти записи в такой ситуации. – Vika

+0

ok..it должно быть возможно, давайте c –

ответ

5

Вам действительно нужно объявить переменную-член для рассматриваемой модели, вот она User. Проблема с тем, что вы делаете это (в compare()): $this->cvLaboralExps, здесь cvLaboralExps - это просто отношение класса, а не переменная, которая может хранить значение, поэтому $value сравнения пуст. Проверьте эту линию, объясняя второй параметр $value в compare documentation:

Если строка или массив пуста, существующее условие поиска не будет изменен.

Этого можно избежать, объявив переменную-член для модели и изменив вызовы 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, вам нужно будет позаботиться о том, как конечный пользователь вводит значения.

+0

дайте мне знать, если вам нужны какие-либо разъяснения. –

+1

СПАСИБО ВАМ ПОДРОБНЕЕ: D – Vika

+0

WOW, я рад, что это сработало! –