laravel - Laravel - Eloquent Collection 方法的麻烦,例如 last()
问题描述
我有一个变量$courses
,在我的调试器中显示为类型App/Courses
在模型中,存在一对多关系,我在模型中检索这些相关项,然后以$courses->relateditems
在调试器中,$courses->relateditems
显示为类型Illuminate/Database/Eloquent/Collection
好吧,一切都说得通。
我想得到$courses->relateditems
集合中的最后一项。所以我尝试
$courses->relateditems->last()->startdate
但这并没有返回我知道存在的值。当我在调试器中评估表达式$courses->relateditems->last()
时,我在 laravel.log 中得到了这个:
Symfony\Component\Debug\Exception\FatalErrorException: Cannot access self:: when no class scope is active in /app/Courses.php:68
我只是不确定发生了什么。我知道我可以使用数据库查询来获取我需要的数据,但是我有一个触发函数的模型事件并且该函数接收$courses
对象/模型(或者我们命名它),我只是想让它像上面一样工作.
关于我做错了什么的想法?
谢谢,布赖恩
解决方案
根据您在帖子底部遇到的错误,这里的问题是您的代码中的错误。
但是,我认为您误解了 Laravel 关系的运作方式。它们本质上在模型上以两种形式出现,一种是属性,一种是方法。
relateditems
是一个神奇的属性,如果已经执行,它将返回对关系的简单选择的结果。如果一个还没有被执行,它将执行一个然后返回它,这被称为急切加载。
relateditems()
是一种返回该关系的查询构建器实例的方法。
通过调用relateditems->last()
,您正在从数据库中加载所有相关项目,然后获取最后一个,这不是最佳的。
对你来说最好的事情是:
$course->relateditems()->orderBy('id', 'desc')->first();
这将返回第一个项目,但是,由于我们已按id
降序对其进行排序,它将与可能被视为其默认排序的顺序相反。随意更改id
为您想要的任何内容。
推荐阅读
- c# - 表之间的 EF Core 关系
- kubernetes - Kubernetes 将一个 unqiue ID 传递给并行度 > 1 的作业中的每个 pod
- python - BadZipFile:文件不是 python 中 Jupyter 笔记本中的 zip 文件错误
- algorithm - 伯克利 AI 课 - 没有迷宫距离的 PacMan 食物启发式?
- c# - WindowsForms App - 如何在后台打开网站并执行操作?
- docker - Docker撰写两次创建服务
- static - 用于存储在闪存中的静态 const 结构
- java - 将用户的输入存储在不同的变量中
- javascript - 按下键时对象不移动(javascript + canvas)
- tensorflow-lite - 在 tflite 模型中查找动态张量