Обратный вызов CakePHP Model::afterFind() выглядит следующим образом:
afterFind(array $results, boolean $primary = false)
Согласно документации:
Параметр
$primaryуказывает, была ли текущая модель моделью, на которой возник запрос, или была ли эта модель запрошена как ассоциация. Если модель запрашивается как ассоциация, формат$resultsможет отличаться.
Они могут отличаться, но эксперименты показывают, что они не всегда различаются. Насколько я могу судить, параметр $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.
Явно заявляю, что мои вопросы:
- Что такое флаг
$primary, который действительно полезен для? - Правильно ли, что это не полезно для определения структуры массива
$resultsили я что-то пропустил там?