Изменить значение свойства объекта в cakephp 3

Мое индексное действие похоже на

public function index() {
    $acos = $this->Acos->find('threaded');
    foreach ($acos as $aco) {
        $aco->children = doSomeOperations($aco->children);
    }
}

Я хочу заменить значение $acos->$aco->children новым значением, но не могу этого сделать.


person anghazi ghermezi    schedule 11.01.2015    source источник


Ответы (1)


Вам просто нужно использовать оператор ссылки

public function index() {
    $acos = $this->Acos->find('threaded');
    foreach ($acos as &$aco) {
        $aco->children = doSomeOperations($aco->children);
    }
}

Другой способ — использовать методы коллекции в наборе результатов:

$acos = $this->Acos->find('threaded')
    ->map(function ($aco) {
        $aco->children = doSomeOperations($aco->children);
        return $aco;
    });
person José Lorenzo Rodríguez    schedule 11.01.2015
comment
Спасибо, дорогой @Jose. Я тестирую ваши решения, но первое решение приводит к этой ошибке Итератор не может использоваться с foreach по ссылке, а результаты второго решения Сериализация «Закрытия» не разрешена - person anghazi ghermezi; 12.01.2015
comment
Где вы сериализуете замыкание? Вы можете вызвать ->toArray() в конце, чтобы убедиться, что вы не собираетесь сериализовать замыкание. Если вы не делаете этого самостоятельно, убедитесь, что вы обновили подключаемый модуль DebugKit до его последней версии, так как это была известная ошибка. - person José Lorenzo Rodríguez; 12.01.2015
comment
Ты прав. Я отключил отладчик, и он работал правильно. 1) Не могли бы вы дать прямую ссылку на скачивание отладки. У меня нет доступа к cmd для использования php composer.phar require cakephp/debug_kit 2) Как вы думаете, в чем проблема &$aco в первом решении? - person anghazi ghermezi; 12.01.2015
comment
Проблема в том, что запрос возвращает итератор, а не массив. Но вы можете вызвать ->toArray(), чтобы вы могли выполнять итерацию и изменять, как обычный массив. - person José Lorenzo Rodríguez; 12.01.2015