我正在使用Cake 1.2.6,昨晚我注意到在提交表单时没有保存HABTM关系。
我在Committee
和Volunteer
之间有HABTM关系。 Volunteer
的主键是UUID,而Committee
的主键是人类可读的字符串(例如BOARDOFDIRECTORS
,FAIRCOMMITTEE
,FAIRASSOCIATES
等)。我有一个表单来创建/编辑志愿者,该表单包含一个选择框,其选项正是您所期望的,并且填充了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
可能的问题:
volunteer_id
成员FAIRASSOCIATES[volunteer_id]
的相关性。$data
的值是如何或为何被这一行代码变为4AIRASSOCIATES
。答案 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个字符,行为不正确。