CGridview和Yii活动记录关系

时间:2012-01-13 09:00:31

标签: yii active-record-query

我有两个表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下得到空白值。有人请帮我理解错误? :(

2 个答案:

答案 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' 
     );
     //....
),