Как получить первый элемент из объекта результатов CakePHP 3

TLDR: Как использовать первый элемент в объекте результатов?


После получения данных из базы данных я хочу извлечь первый и использовать его отдельно, а затем повторить оставшиеся видео. (Все в моем шаблоне / файле просмотра). Если бы это был массив, я мог бы использовать что-то вроде array_shift, но пока с объектом, я подхожу пустой.

Сначала я получаю данные в моем контроллере и передаю их в представление:

$videos = $this->Videos->find();
$this->set(compact('videos'));

Затем в представлении (файл шаблона) Я пробовал это:

$featuredVideo = $videos{0};

Ошибка: невозможно использовать объект типа Cake \ ORM \ Query в качестве массива.

И это:

$featuredVideo = $videos->0;

Ошибка: синтаксическая ошибка, неожиданный ‘0’ (T_LNUMBER), ожидаемый идентификатор (T_STRING) или переменная (T_VARIABLE) или ‘{‘ или ‘$’

И это:

$featuredVideo = $videos->toArray()[0];

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

И это:

$featuredVideo = $videos->first();

Это потрясающе, но оно ограничивает весь объект только первым, поэтому у меня больше нет остальных видео.

И это:

$allVideos = $videos;
$featuredVideo = $videos->first();

Но, видимо, поскольку это объект, $allVideos это просто ссылка на $videosпотому что они оба сводятся к первому видео.

Я понимаю, что это кажется простым вопросом, и это, вероятно, простой ответ, но я осмотрелся и попробовал предложения о том, как получить первый элемент из объекта с вышеуказанными результатами.

4

Решение

Что я не смог понять, так это ->find() просто возвращает объект запроса, пока вы не скажете ему выполнить через ->all() или ->first() или запустив его через foreach() петля.

Таким образом, я не мог просто получить доступ к первому дочернему объекту, так как запрос еще не был выполнен, чтобы показать результаты.

И когда я пытался сделать ->first() после установки переменной над ней, он фактически выполнял запрос к объекту запроса после установки предела равным 1, следовательно, оба имели только 1.

Больше подробности здесь.

Ответ (в коде):

// Controller
$videos = $this->Videos->find()->all();
$this->set(compact('videos'));

// View
$featuredVideo = $videos->first();

Подробнее здесь о когда объекты запроса лениво оцениваются.


Спасибо jose_zap и marc_ за помощь в разъяснении этого для меня.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]