Laravel嵌套关系无法正常工作

时间:2015-10-16 10:08:28

标签: php laravel laravel-5.1

我有一个用户模型,用于存储基本用户信息,如用户名,密码等。

还有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

我得到一个空数组。这没有意义!任何人都可以对此有所了解,或者我可能做错了什么?如果您需要任何进一步的信息,请告诉我。

2 个答案:

答案 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;
}