-1

我正在使用 Cake 1.2.6,昨晚我注意到提交表单时没有保存 HABTM 关系。

Committee我在和之间有 HABTM 关系Volunteer。a 的主键Volunteer是 UUID,而 a 的主键Committee是人类可读的字符串(例如BOARDOFDIRECTORS, FAIRCOMMITTEE,FAIRASSOCIATES等)。我有一个创建/编辑志愿者的表单,该表单包括一个选择框,其选项正是您所期望的,并且填充了从 Cakefind( 'list' )方法返回的选项。虽然我想不出有什么重要的原因,但只能为志愿者选择一个委员会(HABTM 是为了满足预期的未来需求)。

初步结果表明,选择该BOARDOFDIRECTORS选项按预期工作,但其他选项则不然。通过核心代码跟踪执行导致我Model->__saveMulti()第 1393 行中执行此代码:

 $data[$this->hasAndBelongsToMany[$assoc]['foreignKey']] = $id;

如果我$data在该代码之前转储,则输出为FAIRASSOCIATES。紧接着,它的值为4AIRASSOCIATES。假设这就是为什么没有保存关系似乎是安全的,但我还没有弄清楚为什么数据在执行过程中会发生变化。

有没有其他人看过这个?我错过了一些关键的部分吗?据我所知,这在 v1.2.1 中运行良好(我大约一周前升级了)。

更新

我看到的第一个明显的奇怪之处是,虽然 my$row是一个字符串,但第 1366 行中的条件计算结果为,true所以我进入了那个代码块。如果我的数据是一个字符串,它怎么会有一个成员值呢?

更新

我显然有一些想法要做,但这是底线。如果我在第 1394 行之前和之后立即删除日志写入,如下所示:

$this->log( 'Setting ' . $data . '[' . $this->hasAndBelongsToMany[$assoc]['foreignKey'] . '] = ' . $id, LOG_DEBUG );

$data[$this->hasAndBelongsToMany[$assoc]['foreignKey']] = $id;

$this->log( 'Creating ' . json_encode( $data ) . ' on ' . $join, LOG_DEBUG );

相关输出是:

2010-03-05 18:57:08 Debug: Setting FAIRASSOCIATES[volunteer_id] = 4b78717f-8ad4-4671-b81c-4e8745591fb4
2010-03-05 18:57:08 Debug: Creating "4AIRASSOCIATES" on CommitteesVolunteer

可能的问题:

  1. 我不确定 Cake 如何/为什么尝试将volunteer_id成员设置在字符串上
  2. “FAIRASSOCIATES”是志愿者所属的委员会的ID,而不是任何类型的模型,所以我根本不明白它的相关性FAIRASSOCIATES[volunteer_id]
  3. 我不知道那一行代码是如何或为什么将 的值$data转变为的。4AIRASSOCIATES
4

2 回答 2

1

我写了一个小修复程序,它正在测试中,(atm 它可以工作):它覆盖 uuid 检测(愚蠢的如果只是询问数据的长度是 16 还是 32)并假设它是一个有效的 id,如果它是一个字符串或一个输入数据的编号。

只需添加函数(复制整个函数):

函数 __saveMulti($joined, $id)

从 lib 的 model.php 到您应用的 app_model.php

然后替换之前在 model.php 1355 行中的 IF :

if ((is_string($row) && (strlen($row) == 36 || strlen($row) == 16)) || is_numeric($row)) {

现在你的 app_model.php 用于这个(不要编辑你的 lib 的 model.php,在你的 app_model.php 中执行此操作):

if( (is_string($row) && ((strlen($row) == 36 || strlen($row) == 16) || !$this->{$assoc}->autoPrimaryKey )) || ( is_numeric ($行) ) ) {

然后在你的 app_model.php 添加这个变量:

    var $autoPrimaryKey = true;

并且在您希望此行为的模型中添加相同的变量但为 false,它将假定模型没有为 HABTM 自动生成的 UUID 并修复问题

    var $autoPrimaryKey = false;

我再说一遍,这只是测试中的一个修复,它为我解决了问题,您有任何问题,请将其发送到我的邮箱 zydriel AT gmail.com

于 2010-03-12T21:28:09.343 回答
0

看起来我的问题是由做一些非常规的事情引起的。对于值很少更改的查找表(并且没有计划通过应用程序更改),我喜欢 PK 值是人类可读的。这使我可以直接查看数据库中的数据并以有意义的方式读取相关记录。在这种情况下,我可以查看一条Volunteer记录,并且不需要任何形式的连接,就可以看到他/她在CommitteenamedFAIRCOMMITTEE中。在查看应用程序外部的数据时很方便。

在这种情况下,我的 3 个Committee值中的一个恰好是 16 个字符长——CakePHP 解释为 UUID 的长度——所以它的行为正确。其他不是 16 个字符,并且行为不正确。

失败的条件在第 1355 行。我已经输入了一张票,以查看 UUID 检测智能是否有任何改进空间。

于 2010-03-07T01:45:55.183 回答