php - 如何从 CakePHP 3 结果对象中获取第一项

标签 php object cakephp resultset cakephp-3.0

TLDR:如何使用结果对象中的第一项?


从数据库中获取数据后,我想拉出第一个单独使用,然后再重复其余视频。 (都在我的模板/ View 文件中)。如果它是一个数组,我可以使用 array_shift 之类的东西,但到目前为止,对于对象,我是空的。

首先,我在 Controller 中获取数据,并将其传递给 View :

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

然后,在 View (模板文件)中,我试过这个:

$featuredVideo = $videos{0};

Error Cannot use object of type Cake\ORM\Query as array

还有这个:

$featuredVideo = $videos->0;

Error: syntax error, unexpected '0' (T_LNUMBER), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$'

还有这个:

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

这(有点)有效,但我必须使用 $featuredVideo 作为数组,这与其他地方不同,而且看起来不优雅。

还有这个:

$featuredVideo = $videos->first();

这很棒,但它将整个对象限制为只有第一个,所以我不再拥有其余的视频。

还有这个:

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

但是,显然因为它是一个对象,$allVideos 只是对 $videos 的引用,因为它们都被缩减为第一个视频。

我意识到这似乎是一个简单的问题,而且很可能是一个简单的答案,但我环顾四周,并尝试了有关如何从具有上述结果的对象中获取第一项的建议。

最佳答案

我未能理解的是,->find() 只是返回查询对象,直到您告诉它通过 ->all()->first() 或通过 foreach() 循环运行它。

因此,我不能只访问第一个子对象,因为尚未执行查询以显示结果。

当我在设置上面的变量后尝试执行 ->first() 时,它实际上是在将 limit 设置为 1 后对查询对象执行查询,因此使两者都只有1.

更多details here .

答案(在代码中):

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

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

此处有更多关于 when query objects are lazily evaluated 的详细信息.


感谢 jose_zap 和 marc_ 帮助我澄清这一点。

关于php - 如何从 CakePHP 3 结果对象中获取第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29610479/

相关文章:

cakephp - 如何在 cakephp 中定义可在整个应用程序中访问的变量?

php - 检查用户是否在页面上

php - jQuery 只获取最后一行的值

php - 从mysql解码utf-8字符

JavaScript 数组不使用 Ajax 发布到 PHP 文件

php - 使用列作为新的第一级键将对象的索引数组转换为对象的关联数组

mysql - 未找到列 : 1054 Unknown column 'PlantingBlock.id' in 'field list'

Cakephp 3 同型号多分页?

javascript - 将自定义事件绑定(bind)到 JavaScript 对象?

Javascript基于数组创建动态变量