Laravel 5.1 - 关系方法必须返回一个类型的对象

Posted

技术标签:

【中文标题】Laravel 5.1 - 关系方法必须返回一个类型的对象【英文标题】:Laravel 5.1 - Relationship method must return an object of type 【发布时间】:2015-11-05 04:14:53 【问题描述】:

我的应用程序从用户那里收取付款,但不得允许子帐户看到付款屏幕。

我有一个Route::group,它检查是否允许用户通过中间件付款。 handle 函数如下所示

    if(!\Auth::user()->isTeacher) 

    \Auth::logout();
     return redirect('/login')->withErrors([$error = 'Sorry there was a problem. Please notify your School']);
        

return $next($request);

isTeacher() 函数

if($this->school_id) 
$teachers = $this->school->find($this->id)->teachers;
$isTeacher = false;
foreach ($teachers as $teacher) 
    if ($teacher->id == \Auth::user()->id) $teacher = true;


return $isTeacher;

最后 School 关系如下所示

return $this->hasOne('App\School', 'id', 'school_id');

我一直收到的错误是

Model.php 第 2667 行中的 LogicException: 关系方法必须返回 Illuminate\Database\Eloquent\Relations\Relation 类型的对象

在错误树的一部分??它显示了这个来自中间件

在 MustBeTeacherToMakePayment.php 第 19 行中的 Model->__get('isTeacher')

这是上面第一行的 if 语句。

有人能告诉我我做错了什么吗?这让我发疯了

【问题讨论】:

你的school 关系是什么样的? 我相信 jedrzej.kurylo 是正确的,但我也相信你应该仔细看看你的 isTeacher() 函数。您正在设置您不使用的变量,并且您可能希望在 $teacher 变为 true 时跳出该循环。否则,它将继续运行并可能返回 false。 【参考方案1】:

您访问的是 isTeacher 属性,而不是调用 isTeacher() 函数。 Eloquent 看到该名称的方法并将其标识为应返回关系定义的方法。然后你会得到错误,因为关系定义方法应该返回 Relation 对象。

你必须替换

if(!\Auth::user()->isTeacher)

if(!\Auth::user()->isTeacher())

错误就会消失。

【讨论】:

以上是关于Laravel 5.1 - 关系方法必须返回一个类型的对象的主要内容,如果未能解决你的问题,请参考以下文章

laravel:关系方法必须返回 Illuminate\Database\Eloquent\Relations\Relation 类型的对象

Laravel/Ardent - 在 save() 上,错误:关系方法必须返回 Illuminate 类型的对象

Laravel 5.1通过急切加载返回连接字段

Laravel 模型必须返回一个关系实例

Laravel 5.1 AJAX - 即使我发送 POST 请求,也不允许返回 405 GET 方法

Laravel 5.1 删除关系