2015-10-16 105 views
1

我有存储基本用户信息,例如用户名,密码等的用户模型Laravel嵌套关系不工作

也有3种类型的用户,StudentStaffParent。每种类型也有一个单独的模型。例如,有一种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

你能解释更多关于关系吗? – whyguy

+0

为什么不使用与coresponding值的学生,工作人员,家长和与用户模型涉及它用于此目的的榜样?它会不会简化你的结构? – geoandri

回答

0

你需要调用where像下面的关系。

public function hasParent($parent) 
{ 
    return $this->user->relations()->where('id', $parent)->count() === 1; 
} 

查看关系后的括号。如果您在没有括号的情况下调用关系,Laravel会返回一个集合。要获得构建器,需要使用括号调用关系。

0

我建议 - 以避免(通过调用其中并依靠查询生成器,而不是收集你会做)创造了巨大的查询的负荷 - 做你正在做的事情已经,但是使用了照亮集合filter -method:

public function hasParent($parent) 
{ 
    return $this->user->relations->filter(function($relation) use ($parent){return $entity->id === $parent;})->count() === 1; 
}