Вызов функции-члена find() для не-объекта()

Начав с CakePHP 3.0, я нахожу документацию очень запутанной, поскольку, следуя фрагментам кода, я сгенерировал следующий код:

    if($this->Auth->User('role') != 'Admin' ){
             $query = $users->find('all')
                ->where(['Users.group_id' => $this->Auth->User('group_id')]);
             $this->set('users', $this->paginate($query->all()));
    }else{
        $this->set('users', $this->paginate($this->Users));
    }

Что отлично работает, если пользователь является администратором, однако, если он не является, код прерывается в этой строке: $query = $users->find('all')

Предоставляется следующее сообщение:

Call to a member function find() on a non-object 

Код запускается в users controller.

Любая помощь или руководство очень ценятся.


person WpDoe    schedule 06.01.2016    source источник
comment
Пожалуйста, напишите $query = $this-›Users-›find('all')   -  person Er.KT    schedule 06.01.2016
comment
Я тоже пробовал это, но потом получаю следующую ошибку: Ошибка: вызов неопределенного метода Cake\ORM\ResultSet::alias()   -  person WpDoe    schedule 06.01.2016
comment
Надеюсь, вы уже загрузили пользовательскую модель   -  person Er.KT    schedule 06.01.2016
comment
У меня это работает, передавая $query в разбиение на страницы вместо $query->all(). Но это ни в коем случае не то, что предлагает документация.   -  person WpDoe    schedule 06.01.2016
comment
Если бы вы прочитали раздел весь, вы бы нашли это в документации, даже примеры, которые это показывают. book.cakephp.org/3.0/en/ controllers/components/ Проверьте нижнюю часть этого раздела. У многих людей есть ужасная привычка использовать документацию, например, набор кода для копирования и вставки. Прочитайте всю главу/раздел прежде чем реализовать его.   -  person floriank    schedule 06.01.2016


Ответы (1)


Попробуйте это вместо этого:

if($this->Auth->User('role') != 'Admin' ){

    $options = [ 
            'conditions' => array(
                "Users.group_id" => $this->Auth->User('group_id')
            )];

         $query = $users->find('all', $options);


    $this->set('users', $this->paginate($query));
}else{
    $this->set('users', $this->paginate($this->Users));
}

Я думаю, ваша проблема в том, что вы неправильно называете «найти».

$query = $users->find('all') ->$options

(не ваш точный код, а то, что вы сделали, чтобы сравнить с моим решением) должно быть

$query = $users->find('all', $options)

с $options, объявленными выше. Это гораздо более чистый способ (по крайней мере, на мой взгляд) управления параметрами поиска, который можно использовать повторно, если необходимо, после того, как они будут установлены в переменную.

person Ash Betts    schedule 07.01.2016