Php Yii CActiveDataProvider多对多

Php Yii CActiveDataProvider多对多,php,yii,yii-relations,Php,Yii,Yii Relations,我不明白如何在CActiveDataProvider中实现多对多关系 $dataProvider_admins = new CActiveDataProvider('Company', array( 'criteria' => array( 'with' => array( 'admins' => array('condition' => 'company_id='.$company->id) ), ), 'pagination

我不明白如何在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());
首先,我有一个模型“公司”,其关系如下:

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\u user}}
创建一个模型并使用它,但我认为这不是正确的方法,不是吗?

您可以尝试以下方法:

$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,
    ),
));

我找到了一个好办法。我使用我想要显示的模型。在这种情况下,管理员是用户

现在我手动加入表

$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将由
公司
模型返回,因此它是逻辑封装的

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

我希望这些解决方案能帮助到一些人。

数组('condition'=>'company\u id='。$company->id)
放在
前面,用“=>数组('admins')保存
好的建议,但结果是一个公司条目,而不是一个管理员条目数组。问题是我使用的小部件将显示一个公司条目,而不是管理员列表。谢谢。但同样的问题。结果是一个公司条目,而不是管理员条目数组。问题是我正在使用的小部件将显示一个公司条目而不是管理员列表。像CGridView或类似的小部件将显示一个公司条目而不是管理员列表。我可以为关系表
{{company\u user}}
创建一个模型并使用它,但我认为这不是正确的方法,不是吗?