如何在Laravel pivot模型上调用函数

3
我试图获取每个用户在课程中的出勤情况,其中用户和课程之间存在多对多的关系,并且出勤表基于这种关系。但是我无法直接调用$user->pivot->attendance();,我必须先调用pivot对象本身,以便我可以像答案中所示调用它的函数。
以下是我的数据库方案示例。
我需要运行:
$users=$course->users;
foreach($users as $user)
{
    $user->pivot->attendance(); //error in this line
}

这一行代码出现了错误

调用 Illuminate\Database\Query\Builder::attendance() 方法未定义

用户们

id
name
etc

课程

id
name
startDate
endDate

课程用户

id
course_id
user_id
payment
regDate
status

用户出勤记录

id
course_user_id
time
inOrOut

这里是CourseUserPivot类。

class CourseUserPivot extends Eloquent {


    protected $table ="course_user";



    public function course()
    {
        return $this->belongsTo('Course'); 
    }

    public function user()
    {
        return $this->belongsTo('User'); 
    }

    public function attendance()
    {
        return $this->hasMany('Userattendance','course_user_id');
    }
}

附言:$user->pivot->payment可以工作并显示属性,但我无法调用方法。


你必须重写newPivot方法,以便它使用你自己的枢轴类。 - Joseph Silber
2
@JosephSilber 你能详细说明一下吗? - Dustin Griffith
2个回答

5

您不能使用$user->pivot->attendance();,因为这会在用户对象上调用attendance而不是pivot对象。

您需要获取pivot对象,然后像下面这样调用函数

CourseUserPivot::find($user->pivot->id)->attendance();

请确保在使用withPivot()函数时,将id包含在数组中。

例如:

class Course{
...
...
public function users()
    {
        return $this->belongsToMany('Candidate')
                    ->withPivot('id',
                    'summary',
                    'status',
                    'payment'

                    );
    }
}

很奇怪我是第一个为这个问题点赞的人。感谢你,但我希望如果有更好的方法,因为在我的情况下,我是从视图中调用该函数的。 - Mohamed Mo Kawsara
@MohamedKawsara 你可以在控制器中调用 $courses->with('users');,然后在视图中只需对 $courses 进行 foreach 循环,再对 $course->users 进行 foreach 循环即可正常使用预加载。 - Bakly

0

我也曾尝试实现同样的功能,但一直无法按照自己的意愿使其正常工作,直到我在 withPivot() 方法中包含了自定义枢轴模型的 'id' 列。

为了更好地理解,我的数据库结构如下:

  • 用户表
    • id
  • 物品表
    • id
  • 集合表(定义一个集合以及可以包含其中的物品)
    • id
  • Set_User 表(自定义枢轴模型,由用户创建的集合实例)
    • id、set_id、user_id
  • Items_SetUser 表(属于用户集合实例的物品)
    • item_id、setuser_id

以下是我在控制器中执行的代码,用于获取用户创建的所有集合实例以及自定义枢轴表数据:

$user_sets = \Auth::user()->sets()->withPivot('id', 'name')->get();

然后在 Blade 中,我可以像这样访问与每个集合实例相关联的项目:

$set->pivot->set_items()->count()

如果在调用withPivot()时不包括'id',则上述操作是不可能的。请注意,set_items()是自定义枢轴模型上的一个方法,它定义了与items表之间的关系。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接