在我的用户模型(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
),但到目前为止,没有任何方法可以解决问题。
答案 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)
latest
在Collection
方法中不存在。
要获取数据库查询的最后一个元素,您应该应用以下查询:
*请注意,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