CGridview与Yii活动记录关系

CGridview与Yii活动记录关系,yii,active-record-query,Yii,Active Record Query,我有两个表tbl_business和business_contacts,结构如下: tbl_business --- business_id (PK) othercolumns 及 该场景是一个业务行有多个联系人。我使用的是cGridview,它使用的是gii的CRUD生成器,需要为每个tbl_业务记录显示来自业务_联系人(表中多个可能行之一)的名字和姓氏 据我所知,我已将tbl_业务模型中的关系函数更新为: 'businesscontacts' => array(s

我有两个表tbl_business和business_contacts,结构如下:

  tbl_business
  ---
  business_id (PK)
  othercolumns

该场景是一个业务行有多个联系人。我使用的是cGridview,它使用的是gii的CRUD生成器,需要为每个tbl_业务记录显示来自业务_联系人(表中多个可能行之一)的名字和姓氏

据我所知,我已将tbl_业务模型中的关系函数更新为:

  'businesscontacts' => array(self::HAS_MANY,'BusinessContact','business_id','select' => 'contact_firstname, contact_lastname')
  'contactbusiness' => array(self::BELONGS_TO,'BusinessContact','business_id')
同样,在business_contacts的模型中,联系人关系定义为:

  'businesscontacts' => array(self::HAS_MANY,'BusinessContact','business_id','select' => 'contact_firstname, contact_lastname')
  'contactbusiness' => array(self::BELONGS_TO,'BusinessContact','business_id')

我希望这可以用于提取相关记录,这样我就可以在网格中有一些东西,比如,business\u id,contact\u firstname,contact\u lastname。。。OtherBusinessTable列。。但我只得到firstname和lastname下的空白值。。有人能帮我理解这个错误吗(

那么您正试图使用CGridView?显示一个业务表(tbl_业务),并在每个业务行中列出多个联系人(业务联系人)

CGridView不支持显示默认情况下的多个关系。CGridView可以轻松列出联系人所属的业务(即,您可以使用类似
contactbusiness.Business\u id
)的列名,但不能列出业务中的所有联系人

不过,您可以通过自定义CDATA列来完成此操作。(注意:这将不允许您对列进行排序和筛选,只需查看即可。您需要在中做更多的工作才能使这些工作正常进行。)

首先,在您的业务模型中,添加如下方法打印所有联系人:

public function contactsToString() {
  $return = '';
  foreach ($this->businesscontacts as $contact) {
    $return .= $contact->contact_firstname.' '.$contact->contact_firstname.'<br />';
  }
  return $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
)); ?>
然后,在CGridView中,您可以设置如下列:

'columns'=>array(
  'firstBusinesscontact.contact_firstname',
),

仅获得第一次接触也可以这样实现:

$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' 
     );
     //....
),
$this->widget('zii.widgets.grid.CGridView',数组(
'id'=>'business-grid',
'dataProvider'=>$model->yourDataProviderFunction(),
“列”=>
“业务id”,
//....
排列(
“姓名”=>“联系人。联系人姓名”,
'value'=>'$data->contacts[0]->contact_firstname',//'raw'
);
//....
),

非常感谢您的回复。但我想我无法更好地解释我的查询-我需要contact_firstname和contact_lastname的对应值(可能来自business_contacts的多条记录中的任意一条),这两个字段来自business_contacts表。即,您的查询,因此您试图显示一个business_contacts表(tbl_业务)使用CGridView?在每个业务行中,您希望列出多个联系人(业务联系人)?---不,只有相关表中的两个字段(firstname,lastname),这样业务列表就不会显得凌乱。希望您理解。因此,一个业务可以有多个联系人(有很多),但您只想在业务表中显示一个联系人?是的,例如,业务id、联系人名字、联系人姓氏、其他业务专栏。因此,我在这方面取得了一些进展,我可以进行搜索/排序工作,但现在单元格中的数据无法显示。我不得不遗憾地发布另一个场景以寻求更多答案。我的答案更新为你可以在你的模型中添加一些功能,只打印出第一个联系人。也许这就是你想要的。
$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' 
     );
     //....
),