1

为了澄清我的问题,我想使用 CakePHP 文档中的 Profile <-> User 示例。定义的关系有:

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

在数据库中,profiles 表有一个归档的 user_id 用于存储关系。

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

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

我们权利管理的改变要求我们改变这种关系的设定方式。我们必须将其从 Profiles 区域中取出,而将其显示在 Users 区域中。

当在 UsersController 中读取用户记录的数据时 ($this->request->data = $this->User->read(null, $id);),CakePHP 自动将 Profile 数据绑定到 User 数据(如果存在)。但是,由于 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 输出时,选择列表中的几个选项元素具有 selected 属性集,尽管用户只有一个特定的配置文件,并且该配置文件存储在 $this->data 中。

不知何故,我认为我必须设置一些进一步的选项才能让它工作(如果有办法让它自动工作——也许没有)。

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

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

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

4

2 回答 2

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);

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

希望这是你想要做的。

于 2013-10-04T11:51:34.917 回答
0

我还没有发现任何线索表明 CakePHP 会自动执行我需要的操作,所以我按照上面的说明自己做了。保存用户记录时:

  • 查找将 user_id 设置为当前用户记录的 id 的(以前的和仍然的)当前配置文件记录,并将该 user_id 设置为 0(或 NULL)。
  • 查找在 data[Profile] 中设置了 id 的配置文件,并将其 user_id 设置为当前用户的 id。
于 2013-10-08T08:49:26.417 回答