我不明白如何在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}}
创建一个模型并使用它,但我不认为它是正确的方式,不是吗?
答案 0 :(得分: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,
),
));
答案 1 :(得分: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;
我希望解决方案可以帮助某人。