Laravel:通过另一张表

时间:2017-11-16 22:58:05

标签: php mysql laravel eloquent

我有一个名为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

提前谢谢!

2 个答案:

答案 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进行访问。