【发布时间】:2013-09-24 11:05:07
【问题描述】:
我有 2 个模型,Client 和 Security。它们与 HATBTM 关系相关联。
我制作了一个名为clients_securities 的连接表。所以Client 可以有很多证券,Security 可以属于很多Clients。
这是我的关系定义:
//Client Model:
public $hasAndBelongsToMany = array(
'Security' =>
array(
'className' => 'Security',
'joinTable' => 'clients_securities',
'foreignKey' => 'client_id',
'associationForeignKey' => 'security_id',
'unique' => true,
)
);
//Security Model:
public $hasAndBelongsToMany = array(
'Client' =>
array(
'className' => 'Client',
'joinTable' => 'clients_securities',
'foreignKey' => 'security_id',
'associationForeignKey' => 'client_id',
'unique' => true,
)
);
然后我在客户端控制器中进行了编辑操作并执行了此操作:
public function edit($id = null) {
if (!$id) {
throw new NotFoundException(__('Invalid client'));
}
$client = $this->Client->findById($id);
if (!$client) {
throw new NotFoundException(__('Invalid client'));
}
if ($this->request->is('post') || $this->request->is('put')) {
$this->Client->id = $id;
if ($this->Client->saveAll($this->request->data)) {
$this->Session->setFlash(__('Client has been updated.'));
return $this->redirect(array('action' => 'edit', $id));
}
$this->Session->setFlash(__('Unable to update client.'));
}
if (!$this->request->data) {
$this->request->data = $client;
$this->set('securities', $this->Client->Security->find('list'));
}
}
在我的编辑视图中,我使用 HtmlHelper 构建表单,添加客户端表字段并生成多选:
echo $this->Form->create('Client'); //start the form for the client model
echo $this->Form->input('Security'); //generates a multi-select popuplated with securities
此外,我还以相同的形式为Client 提供了正常的直接形式输入。例如
echo $this->Form->input('name'); //Input for the client name
echo $this->Form->input('currency'); //Input for the client currency
...
在呈现表单时,所有这些输入都会生成并填充正确的值,但只保存直接客户端数据,而不是来自多选的 HABTM 数据。
当我提交表单时,clients_securities 表没有填充连接 ID。
我需要做些什么才能正确保存它,然后在我重新加载“编辑”视图时预先选择保存的证券。
编辑:为了澄清事情,这里是$this->request->data 的pr()。
(值(“ALLCMCT LX Equity”)是securities 表的正确外键):
Array
(
[Client] => Array
(
[id] => 1212
[name] => Example Client
[currency] => GBP
[partner] =>
[risk_category_id] => 4
[client_code_id] => 1
[min_cash_balance] => 0
[active] => 1
[model] => 0
[institutional] => 0
[non_uk_situs] => 0
[reporting_status] => 0
)
[Security] => Array
(
[Security] => Array
(
[0] => .1muslib3 index
[1] => .eurib3 index
[2] => .ukcpi2 index
)
)
)
所以基本上,假设我的客户 ID 是 12345,Cake 应该像这样在 clients_securities 表中插入 2 条记录:
id | client_id | security_id
----------------------------
1 | 12345 | ALLCMCT LX Equity
2 | 12345 | APMKNTD LX Equity
如果我手动将一些连接记录添加到clients_securities,当我去编辑客户时,多选中的证券会正确地预先选择,表明正在从连接表中读取数据。当我保存表单时,它实际上会删除连接记录,但不会保存新记录。
附加说明:我的安全 ID 存储为 CHAR(36)(如果有任何影响)。这不是一个自动递增字段,它包含证券的代码并且每个都是唯一的。
【问题讨论】:
-
我已经阅读了所有我能找到但没有成功的相关问题。
-
它应该按照您的方式工作。无论如何,您是否尝试过
'unique' => 'keepExisting'?另外,我认为 ID 格式不是问题,但只是为了确定您是否尝试过使用 INT 假 ID?最后:能否请您发布完整的pr($this->request->data)(当然没有敏感数据) -
修改问题以包含整个
$this-request->data。我想我想让unique保持真实,因为我希望在插入新链接之前删除旧链接。 -
我的一个项目中也有类似的情况,但我有数字 ID。我尝试将 id 更改为 char(30) 并停止工作。如果我混合使用数字和字符值,它只会保存数字!