因此,您正在尝试使用 CGridView 显示企业表 (tbl_business)?并且您想在每个商家的行中列出多个联系人 (business_contacts)?
CGridView 默认不支持显示 HAS_MANY 关系。CGridView 可以轻松列出联系人 BELONGS_TO 的业务(即您可以使用类似的列名contactbusiness.business_id
),但不能列出业务中的所有联系人。
不过,您可以通过自定义 CDataColumn 自己完成。(注意:这将不允许您对列进行排序和过滤,只是查看。您必须做更多的工作才能使它们正常工作。)
首先,在您的业务模型中,添加这样的方法来打印所有联系人:
public function contactsToString() {
$return = '';
foreach ($this->businesscontacts as $contact) {
$return .= $contact->contact_firstname.' '.$contact->contact_firstname.'<br />';
}
return $return;
}
(编辑:或者这样做只打印出第一个联系人):
public function contactsToString() {
if($firstContact = array_shift($this->businesscontacts)) {
return $firstContact->contact_firstname.' '.$firstContact->contact_firstname;
}
return '';
}
然后在您的网格中创建一个新列,并用这些数据填充它,如下所示:
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'business-grid',
'dataProvider'=>$model->yourDataProviderFunction(),
'columns'=>
'business_id',
array(
'header'=>'Business Contacts', // give new column a header
'type'=>'HTML', // set it to manual HTML
'value'=>'$data->contactsToString()' // here is where you call the new function
),
// other columns
)); ?>
EDIT2:另一种方法是,如果您只想打印一个 HAS_MANY 关系,则为同一个表设置一个新的(附加)HAS_ONE 关系:
public function relations()
{
return array(
'businesscontacts' => array(self::HAS_MANY,'BusinessContact','business_id','select' => 'contact_firstname, contact_lastname') // original
'firstBusinesscontact' => array(self::HAS_ONE, 'BusinessContact', 'business_id'), // the new relation
);
}
然后,在您的 CGridView 中,您可以像这样设置一个列:
'columns'=>array(
'firstBusinesscontact.contact_firstname',
),