3

次の構造の2つのテーブルtbl_businessとbusiness_contactsがあります。

  tbl_business
  ---
  business_id (PK)
  othercolumns

  business_contacts
  ---
  contact_id (PK)
  business_id 
  othercolumns

シナリオでは、1つのビジネス行に多くの連絡先があります。私はgiiのCRUDジェネレーターを使用してcGridviewを使用しており、各tbl_businessレコードのbusiness_contacts(テーブル内の複数の可能な行の1つ)からの名と姓を表示する必要があります。

私が理解している限り、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 リレーションの 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',
),
于 2012-01-13T17:50:38.400 に答える