访问关系的关系

时间:2016-10-10 11:21:39

标签: laravel eloquent laravel-5.1 relationship

我在我的应用程序中添加了一个公告功能。

我有一个存储公告的announcements表和一个存储每个用户的无主义公告的announcement_active表。

创建公告时,会在announcements表中生成一条记录以存储此记录,并为该公告的每个用户输入一条记录到announcement_active表。

我的用户模型包含有效通知的关系:

public function activeAnnouncements()
    {
        return $this->hasMany('App\ActiveAnnouncements');
    }

我正在访问此视图,以检查是否有任何无主义公告:

@if (Auth::user()->activeAnnouncements()->count() > 0)
    //code
@endif

以上工作正常,我正在尝试对我遇到问题的公告进行for each循环:

@if (Auth::user()->activeAnnouncements()->count() > 0)
    @foreach(Auth::user()->activeAnnouncements()->announcement as $announcement)
      //code to display announcement
   @endforeach
@endif

当我链接->announcement时,我遇到了麻烦。我已经定义了这样的关系:

public function announcement()
    {
        return $this->belongsTo('\App\Announcements');
    }

然而我收到错误:

  

未定义属性:Illuminate \ Database \ Eloquent \ Relations \ HasMany :: $ announcement

使用Tinker并运行\App\User::find(1)->activeAnnouncements()->first()->announcement时,会显示正确的通知。

在尝试将这些内容加载到foreach循环中时,我哪里出错了?

2 个答案:

答案 0 :(得分:1)

您实际上从未真正检索过您的数据。相反,Laravel认为你正在说"建立这个查询,不执行它,然后寻找一个名为“宣布'在它上面#34;如果您只是将其更改为get()来电,则应该有效:

@foreach(Auth::user()->activeAnnouncements()->get() as $announcement)

或者更好的是,使用自动属性版本:

@foreach(Auth::user()->activeAnnouncements as $announcement)

顺便说一下,您可能希望查看Blade @each功能:https://laravel.com/docs/5.3/blade#rendering-views-for-collections

答案 1 :(得分:0)

在您的班级用户中,定义announcements这样的关系:

public function announcements() {
    return $this->hasManyThrough(Announcement::class,ActiveAnnouncement::class);
}

然后,您可以使用announcement

访问用户的通知
@if (Auth::user()->announcements()->count() > 0)
    @foreach(Auth::user()->announcements as $announcement)
      //code to display announcement
   @endforeach
@endif

Nota: 也许你只需在公告中添加一列is_active并删除ActiveAnnouncement模型即可。这样,在您的班级announcements中定义User关系:

在您的班级用户中,定义announcements这样的关系:

public function announcements() {
    return $this->hasMany(Announcement::class);
}

并通过以下方式访问有效公告:

$activeAnnouncements = $user->announcements()->whereIsActive(true)->get()

希望这会有所帮助