0

我有两张表 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 硬编码为添加过程的一部分。

4

1 回答 1

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=>[displayed value] 数组以传递给视图。只有 id 是重要的,并且必须与 Contacts 表中的 id 相对应。

于 2013-05-23T20:07:06.423 回答