在__saveMulti()期间HABTM数据是否已损坏?

时间:2010-03-05 21:10:56

标签: cakephp cakephp-1.2

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

我在CommitteeVolunteer之间有HABTM关系。 Volunteer的主键是UUID,而Committee的主键是人类可读的字符串(例如BOARDOFDIRECTORSFAIRCOMMITTEEFAIRASSOCIATES等)。我有一个表单来创建/编辑志愿者,该表单包含一个选择框,其选项正是您所期望的,并且填充了Cake的find( 'list' )方法返回的选项。虽然我无法想出它的重要性,但只有一个委员会可以被选为志愿者(HABTM是为了预期的未来需求)。

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

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

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

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

更新

我看到的明显的奇怪的第一点是,虽然我的$row是一个字符串,但Line 1366中的条件评估为true所以我放弃了进入那个代码块。如果我的数据是字符串,它怎么会有成员值?

更新

我显然有一些想法,但这是底线。如果我在Line 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

2 个答案:

答案 0 :(得分:1)

我写了一个小修补程序,它在TESTING中,(atm它可以工作):它覆盖了uuid检测(愚蠢的IF只是询问数据是否有16个长度或32个长度)并且如果它是一个有效的id,则认为它是字符串或输入数据的数字。

只需添加功能(复制整个功能):

  

function __saveMulti($ joined,$ id)

从lib的model.php到你的app的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} - &gt ; autoPrimaryKey))||(is_numeric($ row))){

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

    var $autoPrimaryKey = true;

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

    var $autoPrimaryKey = false;

我重申这只是测试的一个修复,它解决了我的问题,你有任何问题,发送到我的邮件zydriel AT gmail.com

答案 1 :(得分:0)

看起来我的问题是由做非传统的事情引起的。对于其值很少改变的查找表(并且没有计划通过应用程序这样做),我喜欢PK值是人类可读的。这允许我直接在数据库中查看数据并以有意义的方式读取相关记录。在这种情况下,我可以查看Volunteer记录,并且无需任何类型的加入,即可看到他/她在名为Committee的{​​{1}}中。在查看应用程序之外的数据时非常方便。

在这种情况下,我的3个FAIRCOMMITTEE值中的一个恰好是16个字符长 - 一个长度CakePHP解释为UUID - 所以它表现正常。其他人不是16个字符,行为不正确。

失败的情况是Line 1355。我已经输入a ticket以查看UUID检测情报是否有任何改进空间。