方案是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> Add New', ['contact-records/create', 'account_id' => $model->id]),
'template' => '{update}{delete}',
]
]
]); ?>
定义的关系是:
帐户有很多帐户联系人有一个联系人
accountContacts有一个accountContactRole
非常感谢提前!
答案 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将显示所有联系人。