[英]Laravel nested relationship not working
我有一个存储基本用户信息(例如用户名,密码等)的用户模型。
还有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
我得到一个空数组。 哪个没有道理! 谁能对此有所启示,否则我可能做错了什么? 如果您需要更多信息,请告诉我。
您需要调用以下关系中的where
。
public function hasParent($parent)
{
return $this->user->relations()->where('id', $parent)->count() === 1;
}
关系见后括号。 如果您在不带括号的情况下调用该关系,Laravel将返回一个集合。 要获得构建器,您需要调用带有括号的关系。
我建议-为了避免产生巨大的查询开销(您可以通过调用“查询”构建器而不是集合,并依靠Query构建器来定位)来做您已经在做的事情,除了使用Illuminate Collections filter
-method:
public function hasParent($parent)
{
return $this->user->relations->filter(function($relation) use ($parent){return $entity->id === $parent;})->count() === 1;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.