Iftikhar uddin
Iftikhar uddin

Reputation: 3192

Why laravel query is not fetching right data?

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();
}

Upvotes: 3

Views: 73

Answers (5)

ssi-anik
ssi-anik

Reputation: 3714

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.

Upvotes: 2

Davit Zeynalyan
Davit Zeynalyan

Reputation: 8618

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();
}

Upvotes: 3

Jignesh Joisar
Jignesh Joisar

Reputation: 15175

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();

Upvotes: 4

Ionel Lupu
Ionel Lupu

Reputation: 2811

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.

Upvotes: 4

Chin Leung
Chin Leung

Reputation: 14941

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();
}

Upvotes: 4

Related Questions