gpt4 book ai didi

yii - CGridview 与 Yii Active Record 关系

转载 作者:行者123 更新时间:2023-12-01 12:57:35 25 4
gpt4 key购买 nike

我有以下结构的两个表 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 下得到空白值 .. 可以有人请帮我理解错误吗? :(

最佳答案

所以您正在尝试使用 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',
),

关于yii - CGridview 与 Yii Active Record 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8848068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com