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
потому что они оба сводятся к первому видео.
Я понимаю, что это кажется простым вопросом, и это, вероятно, простой ответ, но я осмотрелся и попробовал предложения о том, как получить первый элемент из объекта с вышеуказанными результатами.
Что я не смог понять, так это ->find()
просто возвращает объект запроса, пока вы не скажете ему выполнить через ->all()
или ->first()
или запустив его через foreach()
петля.
Таким образом, я не мог просто получить доступ к первому дочернему объекту, так как запрос еще не был выполнен, чтобы показать результаты.
И когда я пытался сделать ->first()
после установки переменной над ней, он фактически выполнял запрос к объекту запроса после установки предела равным 1, следовательно, оба имели только 1.
Больше подробности здесь.
Ответ (в коде):
// Controller
$videos = $this->Videos->find()->all();
$this->set(compact('videos'));
// View
$featuredVideo = $videos->first();
Подробнее здесь о когда объекты запроса лениво оцениваются.
Спасибо jose_zap и marc_ за помощь в разъяснении этого для меня.
Других решений пока нет …