三元运算符:
<div class='votingContainer'>
<a href='#' class='vote {{ ( auth()->user()->votes()->whereImageId($image->id)->first() && auth()->user()->votes()->whereImageId($image->id)->first()->vote == 1 ) ? "liked" : "like" }}' id='{{$image->id}}'></a>
<a href='#' class='vote {{ ( auth()->user()->votes()->whereImageId($image->id)->first() && auth()->user()->votes()->whereImageId($image->id)->first()->vote == 0 ) ? "disliked" : "dislike" }}' id='{{$image->id}}'></a>
</div>
这将执行以下操作-检查当前经过身份验证的用户是否对当前图像进行了投票,并且如果他已对liked
元素添加了<a>
类,这可以防止用户喜欢再来一次。如果他尚未投票,则将like
类添加到<a>
元素中,以允许他投票。
第二个<a>
元素的逻辑基本相同,只是这次是出于讨厌。
不幸的是,我不确定如何将三元运算符从刀片视图移到控制器。我有一个PagesController.php,在其中返回视图并传递图像:
public function index(){
$images = Image::orderBy('created_at', 'desc')->get();
return view('home', ['images' => $images]);
}
我也有ImagesController.php,其中有我的uploadImage()
和deleteImage()
函数。
是否有可能以某种方式将这种逻辑从我的观点转移到控制器上,如果是的话,我将非常感谢有关此操作的任何指导。
答案 0 :(得分:3)
我喜欢khartnett在模型中处理此问题的想法,但出于效率考虑,尤其是在处理许多图像时,您可能希望从控制器加载具有与当前用户匹配的条件的投票关系。
$images = Image::with(['votes' => function($q) { $q->where('user_id', auth()->id()); }])
->orderBy('created_at', 'desc')
->get();
然后每个图像将具有该用户的选票集合:
$vote = $image->votes->first();
因此,虽然它不能完全解决您的问题,但最好的部分是,它只需要2个查询,而不是n + 1个查询。
答案 1 :(得分:2)
您可以尝试遍历$images
并将附加属性'class'传递给具有图像的数组,并在刀片中执行以下操作:
<a href='#' class='vote {{ $image->classlike }}' id='{{$image->id}}'></a>
<a href='#' class='vote {{ $image->classdislike }}' id='{{$image->id}}'></a>
在控制器上:
$images = $images->map(function ($image) {
$image['classlike'] = ( auth()->user()->votes()->whereImageId($image->id)->first() && auth()->user()->votes()->whereImageId($image->id)->first()->vote == 1 ) ? "liked" : "like";
$image['classdislike'] = ( auth()->user()->votes()->whereImageId($image->id)->first() && auth()->user()->votes()->whereImageId($image->id)->first()->vote == 0 ) ? "disliked" : "dislike";
return $image;
});
使用@Devon方法,您可以通过以下优化方式进行操作:
$images = Image::with(['votes' => function($q) {
$q->where('user_id', auth()->user()->id);
}])
->orderBy('created_at', 'desc')
->get();
$images = $images->map(function ($image) {
$image['classlike'] = ( $image->votes->first() && $image->votes->first()->vote == 1 ) ? "liked" : "like";
$image['classdislike'] = ( $image->votes->first() && $image->votes->first()->vote == 0 ) ? "disliked" : "dislike";
return $image;
});
return view('home', ['images' => $images]);