我在我的应用程序中添加了一个公告功能。
我有一个存储公告的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循环中时,我哪里出错了?
答案 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()
希望这会有所帮助