簡體   English   中英

Yii CActiveDataProvider 多對多

[英]Yii CActiveDataProvider Many to Many

我不明白如何在 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}}創建一個模型並使用它,但我認為它不是正確的方法,不是嗎?

您可以嘗試以下操作:

$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 將由Company模型返回,因此它是邏輯封裝的。

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

我希望解決方案可以幫助某人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM