我有两个表Contact和Quote,这是一对多的关系(即一个联系人可以有很多引号)。外键都设置正确。
当我创建新报价时,我希望能够从联系人下拉列表中进行选择。
我的代码如下所示:
联系型号:
class Contact extends AppModel {
public $hasMany = array('Quote' => array('className' => 'Quote', 'foreignKey' => 'contact_id'));
}
引用模型
class Quote extends AppModel {
public $belongsTo = array('Contact' => array('className' => 'Contact', 'foreignKey' => 'contact_id'));
public $validate = array(
'name' => array(
'rule' => 'notEmpty'
),
'amount' => array(
'rule' => 'notEmpty'
)
);
}
在QuotesController中添加方法:
public function add() {
// TODO: Update this so the user can select the id from a drop down list.
$this->request->data['Quote']['contact_id'] = '1';
if ($this->request->is('post')) {
$this->Quote->create(); // This line writes the details to the database.
if ($this->Quote->save($this->request->data)) {
$this->Session->setFlash('Your quote has been saved.');
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash('Unable to add your quote.');
}
}
}
正如您所看到的,我目前只是将用户ID硬编码为添加过程的一部分。
答案 0 :(得分:1)
我假设您已阅读并在您的视图中使用此方法。
http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html#FormHelper::select
不容易找到(或更容易被忽视)是:
http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#find-list
所以在你想要的控制器中
$contacts = $this->Article->find('list', array('fields' => array('Contact.id', 'Contact.name'));
$this->set(compact('contacts'));
然后在视图中:
echo $this->Form->select('contact_id', $contacts);
修改查找字段以反映模型中的实际内容。如果您需要组合字段,则可以使用虚拟字段:http://book.cakephp.org/2.0/en/models/virtual-fields.html。否则,您可以选择需要合成的字段,并使用foreach循环将它们组合成id => [显示值]数组以传递给视图。只有id是重要的东西,并且必须与Contacts表中的id对应。