想不出将长三元运算符从刀片视图移动到控制器的方法

时间:2018-07-17 17:58:45

标签: php laravel laravel-blade

三元运算符:

<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()函数。

是否有可能以某种方式将这种逻辑从我的观点转移到控制器上,如果是的话,我将非常感谢有关此操作的任何指导。

2 个答案:

答案 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]);