CakePHP:表单输入(呈现为select)无法正确处理hasOne关系

时间:2013-10-04 10:32:44

标签: cakephp

澄清我的问题是什么,我想使用个人资料< - > CakePHP文档中的用户示例。这里定义的关系是:

  • 个人资料属于用户
  • 用户hasOne个人资料

在数据库中,配置文件表有一个用于存储关系的字段user_id。

在大多数示例中,用户在“配置文件”区域中设置或编辑此关系。含义:在配置文件的编辑视图中,有一个输入字段,允许为配置文件设置另一个用户。它通过将以下内容放在“个人档案/编辑”视图中自动运行:

echo $this->Form->input('user_id');

我们权利管理的变化要求我们改变这种关系的设定方式。我们必须将它从“个人档案”区域中取出,而是将其显示在“用户”区域中。

当读取UsersController中的用户记录数据时($ this-> request-> data = $ this-> User-> read(null,$ id);),CakePHP自动绑定配置文件数据到用户数据(如果存在)。但是,由于users表中没有字段profile_id(因为关系存储在“另一边”),显然是echo $ this-> Form-> input('profile_id'));在用户/编辑视图中不起作用。

我已经了解到必须首先在Controller的编辑操作中构建一个配置文件列表:

$this->set('profiles', $this->User->Profile->find('list'));

然后让CakePHP创建一个选择列表:

echo $this->Form->input('Profile');

然而,似乎缺少一些东西。在我们查看CakePHP创建的HTML输出的情况下,选择列表中的几个选项元素具有所选属性集,尽管用户只有一个特定的配置文件,并且该配置文件存储在$ this->数据中。

不知何故,我认为我必须设置一些其他选项才能让它工作(如果有办法让它自动运行 - 可能没有)。

我的意思是我可以设置Form-> input()调用的'selected'属性。由于CakePHP创建的表单元素的名称是“data [Profile]”,我不确定CakePHP是否会正确地自动保存更改,或者我是否必须手动执行此操作。步骤将是:

  • 查找user_id设置为当前用户记录的id的(以前和仍然)当前配置文件记录,并将该user_id设置为0(或NULL)。
  • 查找数据[配置文件]中设置了ID的配置文件,并将其user_id设置为当前用户的ID。

但是我必须自己做,还是我错过了一些让CakePHP能够做到的事情?

2 个答案:

答案 0 :(得分:0)

我试一试

我认为你真的不希望有一个选择输入列出你数据库中的所有配置文件。

事实上,您可以同时修改User数据Profile数据:

假设您在个人资料表

中有addressphone个字段

您可以在View/User/edit.ctp中以这种方式构建表单:

echo $this->Form->create('User');
echo $this->Form->input('User.name');
echo $this->Form->input('User.family_name');
echo $this->Form->input('Profile.id'); //this is automatically an hidden field
echo $this->Form->input('Profile.address');
echo $this->Form->input('Profile.phone');
echo $this->Form->close();

在您的控制器中,您应该使用

$this->User->saveAssociated($this->request->data);

用户和他的个人资料将一起保存

希望这是你想要做的。

答案 1 :(得分:0)

我还没有找到任何线索,CakePHP会自动执行我需要的操作,所以我自己就像上面所说的那样做了。保存用户记录时:

  • 查找user_id设置为当前用户记录的id的(以前和仍然)当前配置文件记录,并将该user_id设置为0(或NULL)。
  • 查找数据[个人资料]中设置了ID的个人资料,并将其user_id设置为当前用户的ID。