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 リレーションの 1 つだけを出力したい場合、同じテーブルに対して新しい (追加の) 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',
),