【问题标题】:Laravel nested relationship not workingLaravel嵌套关系不起作用
【发布时间】:2015-10-16 10:08:28
【问题描述】:

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

还有 3 类用户,Student、Staff 和 Parent。每种类型也有一个单独的模型。例如,有一个Student 模型属于User 模型。

我还有一个关系表,用于存储学生和家长之间的关系。这种关系存储在 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

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

【问题讨论】:

  • 你能多解释一下关系吗?
  • 为什么不使用具有对应值的角色模型学生、员工、父母并将其与用户模型相关联呢?它会简化你的结构吗?

标签: php laravel laravel-5.1


【解决方案1】:

您需要在如下关系上调用where。

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

见关系后面的括号。如果你调用不带括号的关系,Laravel 会返回一个集合。要获取构建器,您需要使用括号调用关系。

【讨论】:

    【解决方案2】:

    我建议 - 为了避免产生巨大的查询开销(您将通过调用 where 并依靠查询构建器而不是集合来做到这一点) - 做您已经在做的事情,除了使用 Illuminate Collections @ 987654321@-方法:

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

    【讨论】:

      猜你喜欢
      • 2020-04-20
      • 2017-03-16
      • 2014-10-27
      • 2015-09-24
      • 2021-07-19
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多