English 中文(简体)
HABTM数据在__saveMulti()期间损坏?
原标题:HABTM Data Corrupted During __saveMulti()?

I m使用Cake 1.2.6, 昨天晚上,我注意到,当我提交表格时,HABTM关系就得到拯救。

我在CommitteeVolunteer之间建立了一个HABTM关系。一个Volunteer的主键是UUID,而一个Committee的主键是可读的字符串(例如BOARDOFDIRECTORSFAIRCOMMITTEEFAIRASSOCIATES等)。我有一个表单来创建/编辑志愿者,该表单包括一个选择框,其选项与您所期望的完全相同,并且由从Cake的find(列表)方法返回的选项填充。虽然我想不出有什么理由能影响,但是一个志愿者只能选择一个委员会(HABTM是为了未来预期需要)。

初始结果显示选择BOARDOFDIRECTORS选项按预期工作,但其他选项不起作用。跟踪执行核心代码导致我到Model->__saveMulti(),在第1393行,执行此代码:

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

如果在此代码之前转储$data,输出结果为FAIRASSOCIATES。紧接着,它的值变成了4AIRASSOCIATES。看起来可以安全地假设这就是关系没有被保存的原因,但我还没有弄清楚为什么执行到这一点时数据会发生变化。

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

更新

我看到的第一个明显奇怪之处是,尽管我的$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. I m not sure how/why Cake is trying to set the volunteer_id member on a string
  2. "FAIRASSOCIATES" is the ID of a committee to which a volunteer is grouped, not a model of any sort, so I don t understand the relevance of FAIRASSOCIATES[volunteer_id] at all.
  3. I have no idea how or why the value of $data is being morphed into 4AIRASSOCIATES by that one line of code.
最佳回答

看起来我的问题是由于做一些非常规的事情引起的。对于那些值很少改变的查找表(并且没有计划通过应用程序来改变它们),我希望主键值是可读的。这使我能够直接在数据库中查看数据并以有意义的方式读取相关记录。在这种情况下,我可以查看一个志愿者记录,并且不需要任何连接,就能看到他/她在名为FAIRCOMMITTEE委员会中。在查看应用程序之外的数据时,这种方法很方便。

在这种情况下,我的3个“委员会”值之一恰好是16个字符长--这个长度被CakePHP解释为UUID--因此它表现正确。其他的不是16个字符,表现不正确。

失败的条件在第1355行。我已经提交了一个工单,以看看UUID检测智能是否有改进的余地。

问题回答

我写了一个小修复程序,现在正在测试阶段(目前它可以正常工作):它重写了UUID检测(愚蠢的IF只是询问数据是否具有16字符长度或32字符长度),并且假设输入的数据是一个有效的字符串或数字。

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

function __saveMulti($joined, $id) 的中文翻译:

从lib s 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中进行编辑):

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

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

    var $autoPrimaryKey = true;

在您想要这种行为的模型中添加相同的变量,但将其设置为 false,它将假定该模型没有自动生成的 HABTM UUID,并解决这个问题。

    var $autoPrimaryKey = false;

我再次强调,这只是一个测试中的修复,它已经解决了我的问题,如果你有什么问题,可以发邮件到我的邮箱zydriel AT gmail.com。





相关问题
PHP Framework: Ebay Like Site

I am going to be builiding a site like ebay - with all the features of ebay. Please note my payment method is limited to paypal. What would be the best PHP framework to use to build this quickly, ...

specifying date format when using $form->inputs() in CakePHP

I am wondering if there is a way to specify the date format in the forms created using CakePHP s $form->inputs(); Please note that this is not the individual $form->input() but instead $form->inputs() ...

Using DISTINCT in a CakePHP find function

I am writing a CakePHP 1.2 app. I have a list of people that I want the user to be able to filter on different fields. For each filterable field, I have a drop down list. Choose the filter ...

Assistance with CakePHP model relationships

How would I represent the following in a CakePHP model? Product ======= product_id .... Cart ==== cart_id .... Carts_Products ============== cart_id product_id quantity

Prevent controller from trying to autoload model

I am a beginning Cake user and trying to do some work on an already existing application. Running into a problem when I create a new controller. I have created StoreController and when I try to call ...

热门标签