afterFind(array $results,boolean $primary = false)
根据文件:
The
$primary
parameter indicates whether or not the current model was the model that the query originated on or whether or not this model was queried as an association. If a model is queried as an association the format of$results
can differ.
他们可以有所不同,但实验表明它们并不总是有差异.据我所知,$primary参数实际上并不是有用的.如果它设置为false,您可能会获得一个扁平的数据结构,也可能不会得到一个扁平化的数据结构,所以您可能会遇到这样一个可怕的“不能使用字符串偏移作为数组”的错误消息.
虽然我还没有尝试过,但我基于文档的思想是忽略$primary标志,只需检查数据:
public function afterFind($results,$primary = false) { if (array_key_exists(0,$results) { // operate on $results[0]['User']['fieldname'] } else { // operate on $results['fieldname'] } return $results; }
这是黑客,我不喜欢它,但它似乎比$primary更有用.
明确指出,我的问题是:
> $主标记实际有用的是什么?
我确实对于确定$results数组的结构是有用的,还是我错过了某些东西?
更多信息:https://groups.google.com/forum/?fromgroups=#!topic/cake-php/Mqufi67UoFo
这里提供的解决方案是检查!isset($results [$this-> primaryKey]),以查看$results是什么格式.这也是一个黑客,但可以说比检查键“0”更好.
我最终想到的解决方案是做这样的事情:
public function afterFind($results,$useless) { // check for the primaryKey field if(!isset($results[$this->primaryKey])) { // standard format,use the array directly $resultsArray =& $results; } else { // stupid format,create a dummy array $resultsArray = array(array()); // and push a reference to the single value into our array $resultsArray[0][$this->alias] =& $results; } // iterate through $resultsArray foreach($resultsArray as &$result) { // operate on $result[$this->alias]['fieldname'] // one piece of code for both cases. yay! } // return $results in whichever format it came in // as but with the values modified by reference return parent::afterFind($results,$useless); }
这样可以减少代码重复,因为您不必编写两次的字段更改逻辑(一次为阵列,一次为非数组).
您可以通过在方法结束时返回$resultsArray来完全避免引用的东西,但是我不知道如果CakePHP(或其他一些父类)期望$结果的方式为通过这种方式,没有复制$results数组的开销.