2012-06-05 46 views
3

因此,当我在相应的模型/控制器中时,afterFind可以正常工作并且很漂亮。但是,在调用关联模型时,发送到afterFind回调的数据格式不同。这会导致afterFind出来,因为它无法找到它在原始模型/控制器中工作时所做的相同的数组索引。CakePHP:afterFind与关联很奇怪

任何人都知道为什么,或者是什么修复?

回答

2

这是afterFind回调的第二个参数。

$primary告诉你,如果找到的是该模型直接()调用,或者如果它是由相关的模型()进行调用。

从书的说明:

的$主参数指示当前模式是否是 该查询起源于或者判断这种模式 被质疑为关联模型。如果模型被查询为 关联,$结果的格式可能不同;

如果使用递归查找 ,则希望$ primary为true的代码可能会得到一个“不能使用 字符串偏移量作为数组”PHP的致命错误。

所以,你可能取决于$primary值需要不同的处理逻辑

+0

我检查主,在2个不同的场景中我得到了初级错误,结果结构是不同的。我认为我能解决这个问题的唯一方式就像人们在这里建议检查结果的结构。 –

3

$primary可能不会有很大的帮助;我发现,它始终是false使用ContainableBehaviour超出第一深度时:

$this->Model->find('first', array(
    'contain' => array(
    'SecondaryModel' => array(
     'TertiaryModel', 
    ), 
), 
)); 

如果您正在设置基于相关模型的值,你可以检查它的存在,以对付这样无论是结构:

function afterFind($results, $primary) { 
    if (isset($results['TertiaryModel'])) { 
    $results['secondary_model_field'] = 'value'; 
    } 
    else { 
    foreach ($results as &$result) { 
     if (is_array($result) && isset($result['TertiaryModel'])) { 
     $result[$this->alias]['secondary_model_field'] = 'value'; 
     } 
    } unset($result); 
    } 

    return $results; 
} 

或者,您也许可以只检查模型本身的字段位置。如果该字段不存在于顶层,则需要迭代该组结果。

+0

此外,我发现'$ primary == false'不一定*意味着数据的格式不同,如果它是真的。它可能是,但它取决于发现。 – eaj

+0

那么这个问题仍然没有解决?对我来说,有时在Find $ results返回一个多维数组后,有时它返回一个键值数组。正如此处所述,$ primary标志总是为false,因为我使用的是可容纳的。对这个问题的任何更新将不胜感激。 – vinhboy

+0

我写了关于CakePHP 1.3的这个答案,但我认为2.0中没有任何改变。 唯一的解决方案是检查是否存在已知密钥,以确定结果是单个结果还是结果集,并对它们进行适当的操作。 – gapple

1

看来Cake 2.6包含a fix for this,确保所有$results阵列的格式一致。我已经用RC版本做了一些测试,它似乎工作,数组全部以格式{n}.ModelName.data传递。

此修复默认情况下处于启用状态,但如果需要,您也可以恢复到原有行为。只需添加以下到您的模型(或AppModel)定义:

public $useConsistentAfterFind = false;