How to Call function on laravel pivot model

时光怂恿深爱的人放手 提交于 2020-06-12 07:34:56

问题


I was trying to get the attendance of each user in a course where the users and the courses have many to many relationship and the attendance table is based on the relationship. But i couldn't call $user->pivot->attendance(); directly i had to call for the pivot object it self so i can call a function to it as you can see in the answer

The Following is a sample of my Database scheme

I need to run

$users=$course->users;
foreach($users as $user)
{
    $user->pivot->attendance(); //error in this line
}

this line gives and error

Call to undefined method Illuminate\Database\Query\Builder::attendance()

users

id
name
etc

courses

id
name
startDate
endDate

course_user

id
course_id
user_id
payment
regDate
status

userattendance

id
course_user_id
time
inOrOut

And here is the CourseUserPivot Class

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');
    }
}

P.S: $user->pivot->payment works and displays the attribute but i cant call methods


回答1:


You can't use $user->pivot->attendance(); as this calls attendance on the user object not on the pivot object

You will have to fetch the pivot object then call the function like so

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

make user that where you used withPivot() function you include the id in the array

like in

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

                    );
    }
}



回答2:


I was trying to accomplish the same thing, and I was having trouble getting it to work like I wanted until I included the 'id' column of my custom pivot model in the withPivot() method.

For some context, my database structure is:

  • User table
    • id
  • Items Table
    • id
  • Sets table (defines a set and the items that can be in an instance of it)
    • id
  • Set_User table (Custom Pivot Model, instances of a set created by a user)
    • id, set_id, user_id
  • Items_SetUser table (items that belong to a set instance that belong to a user)
    • item_id, setuser_id

I do this in the controller to get all the sets that user has made an instance of, with custom pivot table data:

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

And then in blade I can access the items associated with each set instance like this:

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

Without including 'id' in the call to withPivot(), the above is not possible. Note that set_items() is a method on the custom pivot model that defines a relationship with the items table.



来源:https://stackoverflow.com/questions/25234650/how-to-call-function-on-laravel-pivot-model

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!