我有两个表tbl_business和business_contacts具有以下结构:
tbl_business
---
business_id (PK)
othercolumns
和
business_contacts
---
contact_id (PK)
business_id
othercolumns
场景是一个业务行有很多联系人。我正在使用gii的CRUD生成器使用cGridview,并且需要为每个tbl_business记录显示business_contacts(表中多个可能行之一)中的firstname和lastname。
据我了解,我已将tbl_business模型中的关系函数更新为:
'businesscontacts' => array(self::HAS_MANY,'BusinessContact','business_id','select' => 'contact_firstname, contact_lastname')
同样,联系关系在business_contacts的模型中定义为:
'contactbusiness' => array(self::BELONGS_TO,'BusinessContact','business_id')
我希望这可以用来提取相关记录,这样我就可以在网格中找到一些东西,例如business_id,contact_firstname,contact_lastname,... otherbusinesstablecolumns ..但是我只在firstname和lastname下得到空白值。有人请帮我理解错误? :(
答案 0 :(得分:4)
所以你试图用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关系: / p>
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',
),
答案 1 :(得分:0)
只能实现第一次接触:
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'business-grid',
'dataProvider'=>$model->yourDataProviderFunction(),
'columns'=>
'business_id',
//....
array(
'name' => 'contacts.contact_firstname',
'value' => '$data->contacts[0]->contact_firstname', // <------------------------
'type' => 'raw'
);
//....
),