Kylian
Kylian

Reputation: 131

Display content for user and for admin

I would like that normal users don't see the pictures with a status of 0 (not visible) only the visible ones (status 1) but that admins can see everything.

Is this kind of solution viable or is there something cleaner to do? The gates/policies are not adapted for that, I don't see any other solution to my knowledge, that's why I come to you

Thanks in advance

public function show($name)
    {
        if(Auth::user()->isAdmin()) {
            $model = cache()->remember('model_show'.$name, Config::get('cache.ttl'), function() use ($name) {
                return Model::where('name', $name)->with('pictures')->first();
            });

            $pictures = $model->pictures()->latest()->paginate(18);
        } else {
            $model = cache()->remember('model_show'.$name, Config::get('cache.ttl'), function() use ($name) {
                return Model::where('name', $name)->with('visible_pictures')->first();
            });

            $pictures = $model->visible_pictures()->latest()->paginate(18);
        }

        return view('model.model')->with(['model' => $model, 'pictures' => $pictures]);
    }

Upvotes: 1

Views: 190

Answers (1)

Sandeep Dhakal
Sandeep Dhakal

Reputation: 469

You can clean it up by using when function in the query itself.

    public function show($name)
    {
        $model = cache()->remember('model_show'.$name, Config::get('cache.ttl'), function() use ($name) {
            return Model::where('name', $name)->when( Auth::user()->isAdmin() , function ($q)
            {
                return $q->with('pictures');
            }, function ($q)
            {
                return $q->with('visible_pictures');
            })->first();
        });

        $pictures = $model->pictures()->latest()->paginate(18);
        return view('model.model')->with(['model' => $model, 'pictures' => $pictures]);
    }

or we could also use arrow functions

    public function show($name)
    {
        $model = cache()->remember('model_show'.$name, Config::get('cache.ttl'), function() use ($name) {
            return Model::where('name', $name)->when( Auth::user()->isAdmin() ,
                fn($q) => $q->with('pictures') , 
                fn($q) => $q->with('visible_pictures')
            )->first();
        });

        $pictures = $model->pictures()->latest()->paginate(18);
        return view('model.model')->with(['model' => $model, 'pictures' => $pictures]);
    }

Upvotes: 1

Related Questions