3

I'm trying to get records having mode easy and advanced but it's returning only easy records each time. i.e Those records having mode set to easy.

Query string: mywebsite.com/game?easy=easy&advanced=advanced

public function index(Request $request) {

    if($request->has('easy') {
        return GameMode::where('mode', $request->easy)->get();
    }

    if($request->has('advanced') {
        return GameMode::where('mode', $request->advanced)->get();
    }

    return GameMode::all();
}
2
  • 3
    Just a heads up; don't post "Thank you" comments; if the answers below are helpful, give them an upvote, and select one as the answer (which you've done, thanks for that) Commented Mar 1, 2019 at 19:22
  • sure @TimLewis I should thank you for the advice :) Commented Mar 1, 2019 at 19:23

5 Answers 5

4

You are returning the query with mode set to easy immediately if it's set. What you could do is build your query based on your request like this:

public function index(Request $request)
{
    $query = GameMode::query();

    if ($request->has('easy')) {
        $query->where('mode', $request->easy);
    }

    if ($request->has('advanced')) {
        $query->orWhere('mode', $request->advanced);
    }

    return $query->get();
}
Sign up to request clarification or add additional context in comments.

3 Comments

what about $request->has('easy') is false case??
@Davit Doesn't matter. The query would just proceed without the mode = 'easy'.
Thank you so much for your answer.
4

This means you have to create an empty query and then build it based on the inputs:

public function index(Request $request) {

    $query = GameMode::query();
    if($request->has('easy') {
        $query->where('mode', $request->easy);
    }

    if($request->has('advanced') {
        $query->orWhere('mode', $request->advanced);
    }

    return $query->get();
}

Refer to this article for more info.

4 Comments

what about $request->has('easy') is false case??
I don't think andWhere is right; you can't have a single row with both modes; WHERE mode = 'easy' AND mode = 'advanced' won't work. whereIn or orWhere are correct.
Thank you, @Davit and @TimLewis. I've edited the answer. You are right. If you want to have modes easy AND advanced you need to use orWhere
Thank you so much for your answer.
4

try to used when method here

return GameMode::when($request->easy,function($q,$request) {
             return $q->where('mode', $request->easy);
       })->when($request->advanced,function($q,$request) {
             return $q->orWhere('mode', $request->advanced);
       })->get();

2 Comments

This will return no result in his scenario. The mode is either easy or advanced. You need to use orWhere.
Thank you so much for your great answer.
3

Solution 1:

public function index(Request $request) {
    if($request->only('easy','advanced')) {
        return GameMode::whereIn('mode', $request->only('easy','advanced'))->get();
    }

    return GameMode::all();
}

solution 2:

public function index(Request $request) {

    if($request->has('easy') && $request->has('advanced')) {
        return GameMode::whereIn('mode', [$request->easy, $request->advanced])->get();
    }

    if($request->has('mode')) {
        return GameMode::where('mode', $request->easy)->get();
    }

    if($request->has('advanced')) {
        return GameMode::where('mode', $request->advanced)->get();
    }

    return GameMode::all();
}

1 Comment

Thank you so much for your answer.
2

In these scenarios I try to use scope* functions
GameMode.php model

...
public function scopeEasyMode($q, $easy) 
{
    if (!empty($easy)) { return $q->orWhere('mode', $easy); }
}

public function scopeAdvanceMode($q, $adv) 
{
    if (!empty($adv)) { return $q->orWhere('mode', $adv); }
}
...


In your controller GameModeController.php

...
$results = GameMode::easyMode($request->easy)->advanceMode($request->advance)->get();
...

This will filter out your required modes or all
Update: Rather than passing the value directory to those scope* methods rather you better filter/validate values first which is less error-prone.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.