Yii CActiveDataProvider Многие ко многим

Я не понимаю, как реализовать отношение многих ко многим в CActiveDataProvider.

Сначала ситуация, у меня есть одна модель "Компания" со следующими отношениями:

return array(

        'owner'     => array(self::HAS_ONE, 'User', 'user_id'),
        'admins'    => array(self::MANY_MANY, 'User', '{{company_user}}(company_id,user_id)', 'condition' => 'is_admin = 1'),
        'members'   => array(self::MANY_MANY, 'User', '{{company_user}}(company_id,user_id)'),
        'standard_members' => array(self::MANY_MANY, 'User', '{{company_user}}(company_id,user_id)', 'condition' => 'is_admin = 0'),
);

Теперь я хочу получить всех администраторов компании. Обычно я делал:

$company = Company::model()->find('company_id=1');
var_dump($company->with('admins')->findAll());

Итак, у меня есть все администраторы компании.

Но я не разобрался, как это сделать с CActiveDataProvider.

$dataProvider_admins = new CActiveDataProvider('Company', array(

'criteria' => array(

    'with' => array(

        'admins' => array('condition' => 'company_id='.$company->id)
    ),
),
'pagination' => array(

    'pageSize' => 20,
),
));

var_dump($dataProvider_admins->getData());

Но таким образом я получаю запись компании со всеми администраторами, но не массив, содержащий всех администраторов.

Обновление: я мог бы создать модель для таблицы отношений {{company_user}} и использовать это, но я не думаю, что это правильный путь, не так ли?

2 ответа

Решение

Я нашел хорошее решение. Я использую модель, которую хочу отобразить. В этом случае администратор является пользователем.

Теперь я присоединяюсь к таблицам вручную.

$dataProvider_admins = new CActiveDataProvider('User', array(

    'criteria' => array(

        'join' => 'LEFT JOIN `{{company_user}}` ON `id` = `user_id` AND `company_id` = '.intval($company->id),
        'with' => array('profile'),
    ),
    'pagination' => array(
        'pageSize' => 20,
    ),
));

Весь CActiveDataProvider будет возвращен Companyмодель, поэтому она логически инкапсулирована.

$dataProvider = Company::model()->find('id=5')->adminsDataProvider;

Надеюсь, решения помогут кому-нибудь.

Вы можете попробовать следующее:

$dataProvider_admins = new CActiveDataProvider('Company', array(
    'criteria' => array(
        'with' => array('admins'),
        'condition' => 'company_id=:id', 
        'params' => array("id" => $company->id) 
    ),
    'pagination' => array(
        'pageSize' => 20,
    ),
));

Изменить: выше создаст поставщика данных, который будет возвращать список моделей компании. Если вы хотите получить список пользователей, вам нужно указать модель "Пользователь". свойство 'with' использует отношение для построения условия соединения.

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

Попробуйте что-то вроде следующего, пожалуйста, проверьте, что отношение компаний определено в пользовательской модели.

$dataProvider_admins = new CActiveDataProvider('User', array(
    'criteria' => array(
        'with' => array('companies'),
        'condition' => 'companies.company_id=:id and is_admin = 1', 
        'params' => array("id" => $company->id) 
    ),
    'pagination' => array(
        'pageSize' => 20,
    ),
));
Другие вопросы по тегам