我有一个名为User的模型。在这个模型中,我有一个名为UserActivity的函数,我将其返回:
return $this->hasMany('App\UserActivity', 'userid');
在此之后我有一个从Activity表中获取活动名称的函数,但我不知道如何做到这一点,我现在得到了这个:
public function Activity() {
return $this->hasManyThrough('App\UserActivity', 'App\Activity', 'userid', 'activityid');
}
在我看来,我想这样使用:
$activiteiten = \App\User::find(Auth::user()->id);
dd($activiteiten->UserActivity()->Activity());
但是我得到一个错误说:
Call to undefined method Illuminate\Database\Query\Builder::Activity() (View: /var/www/vhosts/cpned.nl/intranet.cpned.nl/laravel/resources/views/dashboard.blade.php)
我可以使用内部连接来做到这一点,但我真的很想知道我是否可以使用Laravel模型做到这一点。我不知道目前是怎么回事,因为我不知道laravel中的功能名称是什么,我也找不到它,所以如果这是重复的话我很抱歉。 我的表有以下键和外键:
用户:pk:id
user_activities:pk:userid,activityid
活动:pk:id
提前谢谢!
答案 0 :(得分:1)
您可以尝试使用eager loading。
类似于:
$activiteiten = \App\User::with('UserActivity.Activity')->find(Auth::user()->id);
dd($activiteiten->UserActivity->Activity);
编辑那么你可以这样做:
foreach($activiteiten->UserActivity as $user_activity) {
foreach($user_activity->Activity as $activity) {
print_r($activity);
}
}
显示如何循环关系。
答案 1 :(得分:1)
Activity
函数应位于用户模型中。那么你可以这样称呼它:
$activiteiten = \App\User::find(Auth::user()->id);
dd($activiteiten->Activity); //gives you a collection of activities
但是,您需要belongsToMany函数而不是hasManyThrough,因为用户和活动之间的关系是多对多的。
这意味着你减少了通过中级模型。您可以查看文档on belongsToMany以了解要做得更好。
旁注:为什么您的函数名称以大写字母开头?
同样使用hasMany关系也会影响函数名称,以便' activity'成为'活动' (只是为了使功能和解释保持同步)。
更新
//User model
public function activities() {
return $this->belongsToMany('App\Activity', 'user_activity', 'userid', 'activityid');
}
这使用' user_activity'表,用于查找用户和活动之间的关系,以便您现在可以User::first()->activities
进行访问。