2015-08-28 3 views
0

В моем приложении Yii у меня есть 2 модели, профили и группы. Каждый профиль относится к группе, определенной профилем Profiles.GroupID, который является FK для групп. GroupID. Кроме того, у каждой группы есть менеджер (Group.ManagerID), который является в основном другим профилем (поэтому он ссылается на user_id в таблице Users).Yii Определить отношение к той же модели с помощью другой модели

В профилях модели я хотел бы определить отношение, так что для данного профиля я могу легко получить Менеджер.

Ниже некоторые примеры данных из двух таблиц, которые представляют 2 модели профили, группы:

Table Profiles 
user_id firstname lastname  group_id 
------- ----------- ---------- ------- 
1  John   Doe   100 
2  Walter  White  200 
3  Gus   Fring  100 
4  Biggie  Smalls  200 


Table: Groups 
group_id manager_id 
------- --------- 
100  2 
200  4 

Любые предложения будут оценены.

ответ

0

Вы можете использовать отношения, вы должны создать два "BELONGS_TO" и "HAS_ONE" отношений один в Profiles модели и второй в Groups модели:

, например, в Profiles:

public function relations() { 
    'group' => ... 
} 

в Groups:

public function relations() { 
    'manager' => ... 
} 

и чем вы можете получить управление r конкретного пользователя, подобного этому $user->group->manager.

Но в этом случае возникает запрос с двумя JOINs, который может быть медленным, если ваши столы большие.

Или вы можете использовать только один соотношение (для получения группы пользователей) и еще один запроса для получения менеджера: В Profiles моделей создают открытую переменную $manager и добавить его в правилах модели (Ом в поисках)

public $manager = null; 

и способ коррекции afterFind:

public function afterFind() { 
    $this->manager = self::model()->findByAttributes('user_id' => $this->group->manager_id); 
    return parent::afterFind() 
} 

EDITED

Если вы используете первый метод (два отношения), вы можете переопределить Sort объект вашего DataProvider (f.e. в методе "sort" вашей модели):

public function search() { 
     $criteria = new CDbCriteria; 
     $sort = new CSort; 
     $sort->defaultOrder = 'someField ASC'; 
     $sort->attributes = array(
      '*', 
      'managerLastname' => array(
       'ASC' => 'group.manager.lastname ASC', 
       'DESC' => 'group.manager.lastname DESC', 
      ) 
     ); 
     // .....other criterias 
     $criteria->compare('managerLastname', $this->group->manager->lastname, true); // for filtering 

     return new CActiveDataProvider($this, array(
      'criteria' => $criteria, 
      'sort' => $sort 
     )); 
    } 

и в CGgridView колонках добавить/колонки изменить

array(
    'name'=>'managerLastname', 
    'value'=>'$data->group->manager->lastName' 
) // be sure that each user has manager 

и добавить также общественную собственность managerLastname в вашей модели.

Спасибо.

+0

Спасибо за вашу помощь, работал как шарм. Тем не менее, я рассматриваю новый вызов, который пытается отсортировать по столбцу Manager.Lastname, которое вместо этого сортирует CGridView по User.lastname, lastname - тот же столбец для обоих объектов. – user5276229

+0

@ user5276229 Я добавил эту часть, чтобы ответить. Он доступен только в первом случае, во втором случае yii не может генерировать запрос sortid каким-то атрибутом менеджера, например, таблицу профилей, не связанную с результатом в качестве менеджера. –

0

Я думаю, что это так (непроверенные):

public function getManager() { 
    $this->hasOne(Profiles::className(), ['user_id' => 'manager_id'])->viaTable('{{%groups}}', ['group_id' => 'group_id']); 
} 

Разместите эту функцию в модели профилей.

+0

Значит, это должна быть функция, а не модельное отношение? – user5276229

Смежные вопросы