3

我有以下结构的两个表 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(表中多个可能行之一)的名字和姓氏。

据我了解,我已将 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 下得到空白值 .. 有人可以帮忙吗我明白错误吗?:(

4

2 回答 2

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 关系:

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',
),
于 2012-01-13T17:50:38.400 回答
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' 
     );
     //....
),
于 2013-02-13T13:48:51.433 回答