3

我不明白如何在 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}}并使用它,但我认为它不是正确的方法,不是吗?

4

2 回答 2

2

您可以尝试以下操作:

$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,
    ),
));
于 2012-11-12T13:47:03.007 回答
1

我找到了一个很好的解决方案。我使用我想要展示的模型。在这种情况下,管理员是用户。

现在我手动加入表格。

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

我希望解决方案对某人有所帮助。

于 2012-11-13T10:39:14.350 回答