Страница 1 из 1

CActiveDataProvider и MANY_MANY

Добавлено: 2011.03.15, 13:15
undsoft
Добрый день,

Есть две таблицы Users и Email_groups. Между ними есть отношение email_groups, определенное как MANY_MANY.

Я хочу в CActiveDataProvider получить пользователей одной группы.

Код: Выделить всё

$r = Users::model()->findAll(array(
            'with'=>array(    
                'email_groups'=>array(
                    'alias'=>'group',
                    'condition'=>'group.id = :group_id',
                    'params'=>array(
                        ':group_id'=>$group->id
                    ),
                    'joinType'=>'INNER JOIN'
                )
            )
        ));
            
        $members = new CActiveDataProvider('Users', array(
            'criteria'=>array(    
                'with'=>array(    
                    'email_groups'=>array(
                        'alias'=>'group',
                        'condition'=>'group.id = :group_id',
                        'params'=>array(
                            ':group_id'=>$group->id
                        ),
                        'joinType'=>'INNER JOIN'
                    )
                )
            )
        ));
        
        $r2 = $members->data;
 
Результат в $r - пустой массив (как и должно быть).
Результат в $r2 - массив из всех пользователей, что есть в базе.

Почему так?
При том, что я разбирал дебаггером работу CActiveDataProvider и нашел, что там вызывается:

Код: Выделить всё

return $this->model->findAll($criteria); 
То есть, вызов вроде такой же как в $r, но уже вот здесь, возвращаемое значение - опять все пользователи. Мистика.

Re: CActiveDataProvider и MANY_MANY

Добавлено: 2011.03.15, 20:31
undsoft
Отвечу сам себе. Использование
together=>true
в критерии CActiveDataProvider магическим образом решает проблему.

Re: CActiveDataProvider и MANY_MANY

Добавлено: 2011.03.15, 20:55
slavcodev
ответ есть, может кто-то из ассов MySQL ответит почему так, для чего это магический together=>true нужен.
а то у меня сегодня с утра тоже была такая проблема :(

Re: CActiveDataProvider и MANY_MANY

Добавлено: 2011.03.15, 21:28
because
together определяет способ выполнения запроса по связи. если false то он выполнится как отдельный select, если true то все выполнится одним большим запросом. я понял для себя так.

Re: CActiveDataProvider и MANY_MANY

Добавлено: 2011.03.15, 21:37
slavcodev
ну тогда это баг, что без него провайдер тупит