【发布时间】:2015-03-01 04:39:27
【问题描述】:
这是对我之前提出的问题的扩展,即如何设置relationship between users, ideas, and 'likes'。一个用户可以创建多个想法。任何用户都可以“喜欢”或“不喜欢”任何想法。
如前文所述,以下是我在 Laravel 中的关系:
用户
public function ideas(){
return $this->hasMany('Idea');
}
public function liked(){
return $this->belongsToMany('Idea', 'ideas_likes')->withPivot('liked');
}
想法
public function likes(){
return $this->belongsToMany('User', 'ideas_likes')->withPivot('liked');
}
public function user(){
return $this->belongsTo('User');
}
我的“ideas_likes”表如下所示:
ideas_likes
------------
id primary key
user_id foreign key
idea_id foreign key
liked boolean
我有一个网页,其中列出了来自不同用户的想法。只有经过身份验证的用户才能访问此页面。每个想法旁边都有一个 like 和 dislike 按钮。当点击 like 按钮时,会将一个条目添加到 idea_likes 表中,并将“liked”布尔值设置为 true。当点击 dislike 按钮时,会添加条目并将“liked”布尔值设置为 false。
当用户不喜欢某个想法时,该想法不应再出现在该用户的列表中。如果用户喜欢一个想法,那么该想法将在列表中突出显示。
当在我的视图中显示这些想法时,我将像这样循环它们:
@foreach ($ideas as $idea)
<div class="idea">
<h1>{{ $idea->title }}</h1>
<p>{{ $idea->description }}</p>
</div>
@endforeach
但是,如前所述,我想突出显示已被查看列表的用户“点赞”的想法。也许它看起来像这样:
@foreach ($ideas as $idea)
<div class="idea@if($idea->liked) highlight@endif">
<h1>{{ $idea->title }}</h1>
<p>{{ $idea->description }}</p>
</div>
@endforeach
另外,我还希望显示创意作者的用户名(不一定与登录用户相同):
@foreach ($ideas as $idea)
<div class="idea@if($idea->liked) highlight@endif">
<h1>{{ $idea->title }}</h1>
<p>{{ $idea->description }}</p>
<p>{{ $idea->user->username }}</p> <=== SOMETHING LIKE THIS
</div>
@endforeach
在我的应用程序中引入“喜欢”的概念之前,我收集想法和用户信息的查询如下所示:
$ideas = Idea::with('user')->orderBy('created_at', 'desc')->get();
这是返回所有想法的列表,以及相关的用户信息。然而,现在它变得更加棘手。我想要所有的想法,加上他们相关的用户信息(无论是谁发布的),除了那些被当前认证用户不喜欢的想法,如果他们被认证用户喜欢,也会突出显示。呸!
任何帮助将不胜感激。
【问题讨论】:
标签: laravel eloquent blade relationships