如何使用cakephp 2.3正确地处理表单中的关联数据

时间:2013-02-06 11:20:28

标签: forms cakephp associations

我是cakephp的新手。 我有一个“用户”表和一个“类别”表

用户所属的类别(字段:users.id,users.name,users.category) category hasMany users(fields:category.id,category.name,users.category)

我正在解决这样的关联数据。

in(users)edit.ctp我把

// view/Users/edit.ctp

    echo $this->Form->input('name');
    echo $this->Form->input('categories', array( 'value' => $this->Form->value('User.category'), 
'name'=>'data[User][category]') );
</pre>

in users controller I have
<pre>
    public function edit($id = null) {
        $this->User->id = $id;
        if (!$this->User->exists()) {
            throw new NotFoundException(__('Invalid user'));
        }
        if ($this->request->is('post') || $this->request->is('put')) {
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('The user has been saved'));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        } else {
            $this->request->data = $this->User->read(null, $id);
        }
        $sexes = $this->User->Sex->find('list');
        $categories = $this->User->Category->find('list');
        $this->set(compact('categories'));

    }

一切正常,但我怀疑有一种更简单的方式来做这种形式。 这真的需要吗?
,array('value'=&gt; $ this-&gt; Form-&gt; value('User.category'),'name'=&gt;'data [User] [category]')
如果没有theese params,则选择框不会突出显示所选选项,也不会保存任何内容。

可能像

echo $this->Form->input('Category.name');
例如

?但是这样的代码没有显示选择框 它不会保存users.category字段。

我无法找到任何有关此示例的教程或代码。 链接将不胜感激。

1 个答案:

答案 0 :(得分:0)

尝试使用Cake的数据库表和字段的命名约定。如果按照惯例,Cake会为你做很多繁重的工作:

用户表:

users.id, users.name, users.category_id

类别表

categories.id, categories.name

用户模型

class User extends AppModel {

    public $belongsTo = array(
        'Category'
    );

}

类别模型

class Category extends AppModel {

    public $hasMany = array(
        'User'
    );

}

用户控制器:

class UsersController extends AppController {

    public function edit($id) {

        if (!empty($this->request->data) {

            // form submitted - try to save
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash('User updated');
            }
            else {
                $this->Session->setFlash('Please correct the errors');
            }
        }
        else {
           // prepopulate the form
           $this->request->data = $this->User->findById($id);
        }

        // populate the categories dropdown
        $this->set('categories', $this->User->Category->find('list');

    }

}

/app/views/Users/edit.ctp

<?php

echo $this->Form->create();
echo $this->Form->inputs();
echo $this->Form->end('Update');