我有一个用户模型,用于存储基本用户信息,如用户名,密码等。
还有3种类型的用户,Student
,Staff
和Parent
。每种类型也有一个单独的模型。例如,有Student
模型属于User
模型。
我还有一个关系表,用于存储学生和家长之间的关系。此关系存储在用户模型中。
如果我这样做:
App\Student::first()->user->relations;
很高兴地回复了一系列相关的父母。
在我的Students
模型中,我有一个名为hasParent()
的方法,它接受给定的用户ID,并检查以确保学生拥有该ID的父级。在那种方法中,我有以下内容:
public function hasParent($parent)
{
return $this->user->relations->where('id', $parent)->count() === 1;
}
但是,这会返回错误Cannot call 'where' on a non-object
。如果我进一步调试,$this->user->relations
将返回一个空数组。
问题是,如上所述,如果我单独调用这些方法,我会得到我想要的结果。
所以要澄清一下,如果我跑:
App\Student::first()->user->relations;
这会很好地返回一组用户。
在我的Student
模型中,如果我打电话:
$this->user
然后我得到了正确的学生
如果我打电话
$this->user->relations
我得到一个空数组。这没有意义!任何人都可以对此有所了解,或者我可能做错了什么?如果您需要任何进一步的信息,请告诉我。
答案 0 :(得分:0)
您需要就下面的关系调用where
。
public function hasParent($parent)
{
return $this->user->relations()->where('id', $parent)->count() === 1;
}
见关系后的括号。如果你在没有括号的情况下调用关系,Laravel会返回一个集合。要获取构建器,您需要使用括号调用关系。
答案 1 :(得分:0)
我建议 - 避免创建巨大的查询开销(您可以通过调用“查询”构建器而不是集合来调用位置和计数) - 执行您已经执行的操作,除了使用Illuminate Collections filter
- 方法:
public function hasParent($parent)
{
return $this->user->relations->filter(function($relation) use ($parent){return $entity->id === $parent;})->count() === 1;
}