首页 > 解决方案 > 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

解决方案


根据您在帖子底部遇到的错误,这里的问题是您的代码中的错误。

但是,我认为您误解了 Laravel 关系的运作方式。它们本质上在模型上以两种形式出现,一种是属性,一种是方法。

relateditems是一个神奇的属性,如果已经执行,它将返回对关系的简单选择的结果。如果一个还没有被执行,它将执行一个然后返回它,这被称为急切加载。

relateditems()是一种返回该关系的查询构建器实例的方法。

通过调用relateditems->last(),您正在从数据库中加载所有相关项目,然后获取最后一个,这不是最佳的。

对你来说最好的事情是:

$course->relateditems()->orderBy('id', 'desc')->first();

这将返回第一个项目,但是,由于我们已按id降序对其进行排序,它将与可能被视为其默认排序的顺序相反。随意更改id为您想要的任何内容。


推荐阅读