Yii2 findOne() превышает время выполнения

У меня есть действие, которое выполняет простой запрос findOne($id) и возвращает одну строку из базы данных. Это превышает максимальное время выполнения. Этот метод наследуется несколькими классами, где он отлично работает. Я не переопределяю какие-либо методы find() или afterFind() в соответствующей модели.

   public function actionGetone($id)
    {
        $classname = $this->model;
        $model = new $classname;
        return $model::findOne($id);
    }

Я не получаю никаких ошибок и работаю, как ожидалось, если я переопределяю метод с помощью:

public function actionGetone($id){
        $items = Job::find()->where(['id' => $id])->all();
        return $items;
    }

но как только я меняю его, чтобы вернуть return $items[0]; id снова умирает с той же ошибкой Exceeded.

Не уверен, что это связано, но я получаю ошибку Maximum execution time of 30 seconds exceeded, когда действие не упоминается в методе behaviours() и когда оно добавляется в правило доступа, как показано ниже. Но это дает мне ошибку Call to a member function checkAccess() on null, когда я меняю роль доступа на ['*']. У меня нет настройки authManager.

public function behaviors()
{
    return [
        'contentNegotiator' => [
            'class' => \yii\filters\ContentNegotiator::className(),
            'formats' => [
                'application/json' => yii\web\Response::FORMAT_JSON,
            ],
        ],
        'authenticator' => [
            'class' => \yii\filters\auth\HttpBearerAuth::className(),
            'only' => [ 'delete','patch','getone'],
        ],
        'access' => [
            'class' => \yii\filters\AccessControl::className(),
            'only' => ['delete','patch','getone'],
            'rules' => [
                [
                    'actions' => ['delete','patch','getone'],
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ]
    ];
}

Буду признателен за любые идеи :)

Обновить

$items = Job::find()->where(['id' => $id]);
return $items;

Дает:

{
  "sql": null,
  "on": null,
  "joinWith": null,
  "select": null,
  "selectOption": null,
  "distinct": null,
  "from": null,
  "groupBy": null,
  "join": null,
  "having": null,
  "union": null,
  "params": [],
  "where": {
    "id": "3"
  },
  "limit": null,
  "offset": null,
  "orderBy": null,
  "indexBy": null,
  "modelClass": "common\models\Job",
  "with": null,
  "asArray": null,
  "multiple": null,
  "primaryModel": null,
  "link": null,
  "via": null,
  "inverseOf": null
}

person JPickup    schedule 29.02.2016    source источник
comment
Является ли id первичным ключом? Если нет, то индексируется ли он? Сколько у вас рядов? Если вы распечатаете SQL и вставите его прямо в свою БД, он будет работать нормально? Пробовали ли вы распечатать запрос с помощью print_r перед использованием ->all()?   -  person h2ooooooo    schedule 29.02.2016
comment
вы можете распечатать активный запрос с помощью этой команды: $query->createCommand()->rawSql;   -  person Ruben    schedule 29.02.2016
comment
У меня всего 28 строк в моей БД. var_dump($model->primaryKey()) ; дает мне [0=>'id']   -  person JPickup    schedule 29.02.2016
comment
попробуйте удалить все модели поведения и проверьте, работает ли это.   -  person Ruben    schedule 29.02.2016
comment
queryall работает нормально и возвращает только один результат, как и ожидалось. Почему захват первого элемента массива приводит к превышению времени выполнения?   -  person JPickup    schedule 29.02.2016
comment
удаление всех поведений дает мне ту же ошибку превышения времени выполнения   -  person JPickup    schedule 29.02.2016
comment
Вы пытались распечатать запрос и вставить его прямо в свою БД, как предложил @h2ooooooo?   -  person Ruben    schedule 29.02.2016
comment
@JPickup Судя по вашему недавнему редактированию, это не имеет никакого отношения к запросу - я уверен, что по какой-то причине это какой-то бесконечный цикл. У вас есть IDE, которая может делать точки останова? Не могли бы вы просмотреть код и посмотреть, что происходит? Что произойдет, если вы создадите новую модель с нуля без каких-либо причудливых вещей, но с тем же именем таблицы и попробуете с ней? Не могли бы вы попробовать, просто для удовольствия, return [$items[0]] (возможно, он снова вызывает метод, если получает не массив, и поэтому он работает с массивом?   -  person h2ooooooo    schedule 29.02.2016
comment
@h2oooooooo ты прав, понял одновременно :) спасибо   -  person JPickup    schedule 29.02.2016
comment
@JPickup Пожалуйста, рад, что вы это поняли! Не могли бы вы обновить свой ответ информацией о том, как вы это исправили, а не только о том, где была ошибка? :)   -  person h2ooooooo    schedule 29.02.2016


Ответы (1)


Нашел проблему, связанную с рекурсивным флагом в методе модели toArray(). В моем случае user имеет jobs, а job имеет users, указанное в fields() методах модели. Что приводит к бесконечному циклу.

Добавьте это в модель отношения, чтобы избежать бесконечного цикла:

public function toArray(array $fields = [], array $expand = [], $recursive = true)
{
    return parent::toArray($fields, $expand, false);
}
person JPickup    schedule 29.02.2016