正确的值而不是数组

时间:2017-02-14 20:39:59

标签: activerecord yii2

方案是crm with tables account,account_contact,contact和account_contact_role。后者包含联结表中定义的组合的“项目主管”或“客户经理”等角色。

我的挑战是帐户视图,即列出具有角色的关联人员。我希望我的网格显示:Doe |约翰|雇员。

现在的问题是联系人在联结表中有2个以上的条目。如何打印行的正确角色?正如您在代码中看到的那样,我解决了静态方式,它只显示n次正确值中的1次。尝试使用内部连接而没有成功。这是模型中的搜索问题还是视图中的访问问题?

从帐户模型到联系人的关系:

    public function getContacts($role = null)
{
    // many-to-many
    return $this->hasMany(ContactRecord::className(), ['id' => 'contact_id'])
        ->via('accountContacts')
        ->innerJoinWith(['accountContacts.role'])
        ->andWhere(['account_contact.account_id' => $this->id])
        ->andWhere(['account_contact_role.type' => $role])
        ;
}

视图

    <?= \yii\grid\GridView::widget([
    'dataProvider' => new \yii\data\ActiveDataProvider([
        'query' => $model->getContacts('internal'),
        'pagination' => false
    ]),
    'columns' => [
        'lastname',
        'firstname',
        [
            'label' => 'Role',
            'attribute' => 'accountContacts.0.role.name',
        ],
        [
            'class' => \yii\grid\ActionColumn::className(),
            'controller' => 'contacts',
            'header' => Html::a('<i class="glyphicon glyphicon-plus"></i>&nbsp;Add New', ['contact-records/create', 'account_id' => $model->id]),
            'template' => '{update}{delete}',
        ]
    ]
]); ?>

定义的关系是:

帐户有很多帐户联系人有一个联系人
accountContacts有一个accountContactRole

非常感谢提前!

1 个答案:

答案 0 :(得分:0)

您正在显示帐户的联系人,因此您必须从联系人模型列出。

内部联系模式(或联系ActiveQuery文件):

public static function queryContactsFromAccountAndRole($account, $role = null)
{
    // many-to-many
    return ContactRecord::find()->innerJoinWith(['accountContacts' => function($q) use($account, $role) {
        $q->innerJoinWith(['accountContactsRole'])
        ->andWhere(['account_contact.account_id' => $account->id])
        ->andWhere(['account_contact_role.type' => $role]);
    }]) 
    ->andWhere(['account_contact.account_id' => $account->id]);
}

现在每个联系人都有一条记录,gridview将显示所有联系人。