1

なんらかの理由で、HABTM アソシエーションについて頭を悩ませています。私は誰かが何かをしているのを見て、その理由を説明することで最もよく学びます. とにかく、関連付けたい 2 つのテーブルがあります。Drugs と SideEffects です。中間テーブル Drugs_side_effects を作成しました (現在データはありません)。Cake は自動的にデータを入れますか、それとも何かをする必要がありますか? 本の 3.7.6.5 hasAndBelongsToMany (HABTM) は指定されていませんでした。

私はモデルを正しく設定しましたが (私はそう思います)、この時点でどのように進めればよいかわかりません。とてもシンプルに思えます。Drug ビューで SideEffects テーブルから side_effect を表示する必要があります。edit_french コントローラー関数では、次のようなものが必要になると思います

$side_effect = $this->Drug->SideEffect->read(
    array('SideEffect.id','SideEffect.side_effect'), $id);
$this->set('side_effect',$side_effect);

しかし、それは期待どおりに機能しないように感じます。それとも、もっと効率的な方法がありますか?アドバイスやヘルプをいただければ幸いです。

薬物モデル:

  var $hasAndBelongsToMany = array(
    'SideEffect' => array(
      'className' => 'SideEffect',
      'joinTable' => 'drug_side_effects',
      'foreignKey' => 'drug_id',
      'associationForeignKey' => 'side_effect_id'
      )
  );
}
?>

副作用モデル:

  var $hasAndBelongsToMany = array(
     'Drug' => array(
        'className' => 'Drug',
        'joinTable' => 'drug_side_effects',
        'foreignKey' => 'side_effect_id',
        'associationForeignKey' => 'drug_id'
     )
  );
}
?>

薬物管理者:

<?php
class DrugsController extends AppController {
  var $name = 'Drugs';
  var $helpers = array('Html','Form','Paginator');
  var $paginate = array(
    //'contain' => array('SideEffect'),
    //'fields' => array('Drug.id', 'Drug.generic'),
    'fields' => array('Drug.id', 'Drug.generic','Drug.date_altered'),
    'limit' => 50,
    'order' => array(
        'Drug.generic' => 'asc'
      )
  );

  function index() {
    $data = $this->paginate('Drug');
    $alldrugs = $this->set('drugs', $this->Drug->find('all'));
    $this->set('drugs', $data);
    $this->set('alldrugs', $data);
    //$this->set('lessdrugs', $this->paginate());
    $this->set('title_for_layout','List of all current drugs');
  }

  function edit_french($id = null) {
    $this->Drug->id = $id;
    $drug = $this->Drug->read(
      array(
          'Drug.id','Drug.generic','Drug.ahl','Drug.aap','Drug.rid','Drug.oral','Drug.mw','Drug.clinical_recommendations'
      ),
      $id
    );
    $this->set('title_for_layout', 'Translate clinical recommendations - ' . $drug['Drug']['generic']);
    $this->set('drug',$drug);

    if (empty($this->data)) {
       $this->data = $this->Drug->read();
    } else {
       if ($this->Drug->save($this->data)) {
         $this->Session->setFlash('The drug has been updated.');
         $this->redirect(array('action' => 'index'));
       }
    }
  }
}
?>
4

1 に答える 1

3

を使用して関連データを取得できますContainableBehavior。これを行うには、単純に Drug モデルで検索を実行し、関連する SideEffect データを含めるように指示します。

$drug = $this->Drug->find('first', array(
  'conditions' => array(
    'Drug.id' => $id
  ),
  'contain' => array(
    'SideEffect'
  )
));

必要に応じて、使用する前に包含を設定することもできread()ます。

$this->Drug->contain(array('SideEffect'));
$drug = $this->Drug->read(null, $id);

Containable を使用すると、関連するすべてのデータを 1 回のfind()リクエストで収集できます。

于 2012-04-23T14:55:12.020 に答える