出于某种原因,我真的很难在HABTM协会周围徘徊。通过观察某人做某事并解释原因,我学得最好。无论如何,我有两个我想要关联的表,药物和SideEffects。我已经创建了中间表drug_side_effects(现在没有数据)。蛋糕会自动将数据放入其中还是需要做某些事情?书中的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'
)
);
}
?>
SideEffect模型:
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'));
}
}
}
}
?>
答案 0 :(得分:3)
您可以使用ContainableBehavior
提取相关数据。为此,只需在Drug模型上运行find,并告诉它包含相关的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可以在一个find()
请求中收集所有相关数据。