Laravel - 属于自定义枢轴模型中的关系不起作用

时间:2017-10-12 10:48:18

标签: php mysql laravel laravel-5

Edit:
I dont think its the same issue as:
https://stackoverflow.com/questions/40022929/laravel-relationship-error-undefined-property-illuminate-database-eloquent-col
because in that issue hasMany relationship is used which returns an array but i used belongsTo which should return a certain object.

我有一个数据库结构,我在用户和公司表之间有很多关系。为此,我有一个交叉引用表company_user。此外,每个用户在公司中都有一定的角色,因此交叉引用表也具有role_id。问题是,由于某些原因,当我尝试从交叉引用表中检索角色时,我得到一个异常。

以下是我如何定义公司模式中的关系:

public function users() {
    return $this->belongsToMany('App\User')->withPivot('role_id')->using('App\CompanyUser');
}

现在,如果我只是尝试从枢轴获取role_id,一切正常:

@foreach($company->users as $user)
    {{$user->pivot->role_id}} // this displays correct role_id
@endforeach

但是我还需要角色的数据,所以我在自定义数据透视中定义了一个关系。这是整个模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class CompanyUser extends Pivot
{
    public function role()
    {
        return $this->belongsTo('App\Role');
    }
}

我试图像这样访问它:

@foreach($company->users as $user)
    {{$user->pivot->role()->id}}
@endforeach

但这给了我一个例外:

Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$id 

我错过了什么?

2 个答案:

答案 0 :(得分:4)

尝试更改为

@foreach($company->users as $user)
    {{$user->pivot->role->id}}
@endforeach

答案 1 :(得分:0)

异常本身会为您提供答案。

Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$id 

这是在告诉您您正在尝试访问“属于”构建器实例的$ id属性,而不是实际的相关模型。

差异很小,但值得理解,因为它将使您的幼虫生活更加幸福。


访问关系构建器:$user->role()

这将直接调用role()方法,并完全返回您在定义中看到的内容。对于聚合函数来说,访问此方法很方便-例如获取HasMany或BelongsToMany关系的相关记录的数量。例如:$user->role()->count()


访问相关记录:$user->role

这实际上将从数据库中检索相关记录并为您合并,从而为您提供相关雄辩模型的功能,并可以访问其作为属性的列。 :D

您可以通过深入Laravel的源代码并查看Illuminate\Database\Eloquent\Model类来了解其工作原理/原因。特别是getAttribute()方法。