用户模型上不存在最新的Laravel刀片方法

时间:2019-03-14 17:27:02

标签: php laravel methods laravel-blade

在我的用户模型(App\User.php)中,我声明以下关系:

public function actionables() {
  return $this->hasMany(Actionable::class, 'owner_id', 'id');
}

在针对actionables表的迁移方案中,我指定以下外键:

$table->foreign('owner_id')->references('id')->on('users')->onDelete('cascade');

当我打电话

{{ auth()->user()->actionables->where('act_type', 'order')->latest()->content }}

在刀片视图中,出现以下错误消息:

Method Illuminate\Database\Eloquent\Collection::latest does not exist. 

我尝试使用->get()和其他方式访问用户模型(Auth::user),但到目前为止,没有任何方法可以解决问题。

5 个答案:

答案 0 :(得分:4)

其他答案掩盖的区别是使用查询生成器还是使用集合。当您使用属性调用关系时,Eloquent将获取所有结果,然后返回一个集合(基本上只是一个增强的数组)。因此,当您这样做

auth()->user()->actionables 

Laravel执行SQL查询,然后返回 all 作为集合的结果。

SELECT * FROM actionables WHERE owner_id = ?

集合类具有一个where方法,其功能类似于查询生成器方法,但重要的是要意识到它是在PHP中而不是SQL中执行搜索,因为查询已经执行并且无法更改不再。 latest()存在于查询生成器上,但不存在错误所在的集合。

要利用查询构建器中的关系,您需要将该关系作为一个函数进行调用。 user()->actionables()

auth()->user()->actionables()->where('act_type', 'order')->latest()->first() 

上面的代码将执行SQL查询,然后仅返回您要查找的记录。

SELECT * FROM actionables WHERE act_type = order AND WHERE owner_id = ? ORDER BY created_at DESC LIMIT 1

答案 1 :(得分:1)

您应该使用查询生成器actionables()而不是集合actionables,即:

{{ auth()->user()->actionables()->where('act_type', 'order')->latest()->first()->content }}

答案 2 :(得分:1)

latestCollection方法中不存在。

要获取数据库查询的最后一个元素,您应该应用以下查询:

*请注意,created_at表中应包含Actionable

auth()->user()->actionables()->where('act_type', 'order')->orderBy('created_at', 'desc')->first()->content

答案 3 :(得分:0)

它必须是{ "type": "chrome", "request": "attach", "name": "Attach to Chrome", "port": 9222, "urlFilter": "http://localhost:4200/*", "webRoot": "${workspaceFolder}" } 而不是->last()

->latest()

答案 4 :(得分:0)

Collection没有最新的方法,而是具有该方法的查询生成器。

最后尝试。

参考:https://laravel.com/docs/5.8/collections#available-methods