如何从 CakePHP 3 结果对象中获取第一项
How do I get first item from CakePHP 3 results object
TLDR:如何使用结果对象中的第一项?
从数据库中获取数据后,我想将第一个拉出并单独使用,然后再重复其余视频。 (全部在我的 template/view 文件中)。如果它是一个数组,我可以使用类似 array_shift
的东西,但到目前为止,对于对象,我是空的。
首先,我在控制器中获取数据,并将其传递给视图:
$videos = $this->Videos->find();
$this->set(compact('videos'));
然后,在视图(模板文件)中,我试过这个:
$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()
只是 returns 查询对象,直到您告诉它通过 ->all()
或 ->first()
或 运行 它通过一个 foreach()
循环。
因此,我不能只访问第一个子对象,因为查询尚未执行以显示结果。
当我在设置上面的变量后尝试执行 ->first()
时,它实际上是在将限制设置为 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_ 帮助我澄清这一点。
TLDR:如何使用结果对象中的第一项?
从数据库中获取数据后,我想将第一个拉出并单独使用,然后再重复其余视频。 (全部在我的 template/view 文件中)。如果它是一个数组,我可以使用类似 array_shift
的东西,但到目前为止,对于对象,我是空的。
首先,我在控制器中获取数据,并将其传递给视图:
$videos = $this->Videos->find();
$this->set(compact('videos'));
然后,在视图(模板文件)中,我试过这个:
$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()
只是 returns 查询对象,直到您告诉它通过 ->all()
或 ->first()
或 运行 它通过一个 foreach()
循环。
因此,我不能只访问第一个子对象,因为查询尚未执行以显示结果。
当我在设置上面的变量后尝试执行 ->first()
时,它实际上是在将限制设置为 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_ 帮助我澄清这一点。