当前位置: 首页 > 知识库问答 >
问题:

Laravel-属性关系在自定义枢轴模型不工作

石博艺
2023-03-14
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');
}

现在,如果我只是尝试从pivot获取角色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个答案

陆寒
2023-03-14
Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$id 

它告诉您,您正试图访问属于构建器实例上的$id属性,而不是实际的相关模型。

差别很小,但值得理解,因为它会让你的生活更快乐。

这将直接调用role()方法,并准确返回您在定义中看到的内容。访问此方法对于聚合函数非常方便—例如获取HasMany或BelongToMany关系的相关记录计数。例如:$user-

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

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

雷国兴
2023-03-14

试着改变成

@foreach($company->users as $user)
    {{$user->pivot->role->id}}
@endforeach
 类似资料:
  • 希望你今天过得愉快。 我用的是Laravel 8。我有三个模型,我需要这些模型“纠缠”,可以说。 所以,我有三个基本的表 null null 我最后的方法是查询保存的自定义枢轴模型,并附加模型,但我想先问一下是否有更干净、更有说服力的方法来实现这一点。 任何建议都有帮助。提前感谢您慢慢来。

  • 问题内容: 我希望能够在加载Laravel / Eloquent模型时为其添加自定义属性/属性,类似于使用RedBean的 方法可以实现的那样。 例如,目前,在我的控制器中,我有: 能够省略循环并已经设置并填充了“ available”属性将是很好的选择。 我尝试使用文档中描述的一些模型事件在对象加载时附加此属性,但到目前为止还没有成功。 笔记: “可用”不是基础表中的字段。 是作为JSON对象作

  • 有没有可能通过使用属性在Laravel模型上延迟加载自定义属性,而不必每次都加载它?我正在寻找一种类似于你们可以懒散地加载雄辩的关系的方式。 例如,给定模型上的这个访问器方法: 我希望能够做这样的事情: 这个问题与在加载时向Laravel/Elount模型添加自定义属性不同吗?因为它希望在每次模型加载时加载一个自定义属性,所以我希望仅在指定时延迟加载该属性。 我想我可以为模型实例分配一个与自定义属

  • 我想执行每个产品的平均评级,存储在数据透视表中称为“评论”。下面是我现有的代码。 产品型号: 用户模型: 审查的迁移 我试图使用下面的代码构造预期的输出,但它导致了N+1个问题,因为它没有利用Laravel口才的急切加载。 预期产出:

  • 我在连接Laravel中的数据库模型时遇到问题。 现在,我想把它们连接起来,就像,每个用户可以有多个公司,每个公司都有自己的company_details。 我的用户。php模型如下所示: 如何从company_details表中获取值?

  • 我有如下表格和: 我的型号分类如下:和: 这样做