3

CActiveDataProvider で多対多の関係を実装する方法がわかりません。

最初の状況では、次の関係を持つ 1 つのモデル「会社」があります。

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 に答える