CakePHP:forminput(呈现为select)不能正确处理hasOne关系

CakePHP:forminput(呈现为select)不能正确处理hasOne关系,cakephp,Cakephp,为了澄清我的问题是什么,我想使用CakePHP文档中的Profile用户示例。其中定义的关系包括: 属于用户的配置文件 用户只有一个配置文件 在数据库中,profiles表有一个用于存储关系的已归档用户id 在大多数示例中,用户在配置文件区域中设置或编辑此关系。含义:在配置文件的编辑视图中有一个输入字段,允许为配置文件设置其他用户。它通过将以下内容放在Profiles/edit视图中自动工作: echo $this->Form->input('user_id'); 我们权利管理

为了澄清我的问题是什么,我想使用CakePHP文档中的Profile用户示例。其中定义的关系包括:

  • 属于用户的配置文件
  • 用户只有一个配置文件
在数据库中,profiles表有一个用于存储关系的已归档用户id

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

echo $this->Form->input('user_id');
我们权利管理的变化要求我们改变建立这种关系的方式。我们必须将其从配置文件区域中取出,并将其显示在用户区域中

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

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

$this->set('profiles', $this->User->Profile->find('list'));
然后让CakePHP创建一个选择列表,其中包含:

echo $this->Form->input('Profile');
然而,似乎缺少了一些东西。在我们的例子中,当我查看CakePHP创建的HTML输出时,选择列表中的几个选项元素都设置了selected属性,尽管用户只有一个特定的配置文件,并且该配置文件存储在$this->data中

不知何故,我认为我必须设置一些进一步的选项,以使其工作(如果有一种方法使其自动工作-也许没有)

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

  • 查找用户id设置为当前用户记录id的(以前和现在)当前配置文件记录,并将该用户id设置为0(或NULL)
  • 查找data[profile]中设置了id的配置文件,并将其用户id设置为当前用户的id
但是我必须自己做吗,或者我只是错过了一些让CakePHP能够做的事情吗?

我尝试一下

我不认为您真的想要一个select输入,列出数据库中的所有配置文件

事实上,您可以同时编辑您的
用户
数据和his
配置文件
数据:

假设profiles表中有
地址
电话
字段

您可以在
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);
用户和他的个人资料将一起保存


希望这就是您正在尝试做的。

我没有发现任何线索表明CakePHP会自动完成我需要的操作,所以我自己做了如上所述的操作。保存用户记录时:

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

我不确定我是否理解您的要求,但我没有尝试
$this->Form->input('profile\u id'))
尝试
$this->Form->input('profile.id'))
我也很难跟上。您是否希望保持用户只有一个配置文件关系?或者你正在试图修改它,以便用户拥有许多个人资料?感谢您花时间阅读,我为造成的混乱道歉。我想维持hasOne的关系。当我以前尝试$this->Form->input('Profile.id')时,它没有按预期工作(没有呈现任何内容)。与此同时,我了解到我必须使用$profiles列表(我以前在控制器中设置的)显式地输入。现在缺少的是,在保存配置文件时,必须取消设置(或分别设置为0或NULL),该配置文件以前的User\u id字段中包含User.id。我从一个用户的选择列表中选择了另一个配置文件,保存后,另一个配置文件的user.id写入了它的user\u id字段(这很好),但前一个配置文件的记录保持不变(不太好)。但也许我必须自己去做…可能是因为那个答案而被隐藏了很多。我知道我可以同时编辑用户和配置文件信息,但这不是我们(或客户)想要的。我们实际上需要一个选择列表,列出所有的配置文件。web应用程序是一个内部网,没有数百万个配置文件,因此列表长度可以,我们可以使用selected.js进行搜索。