Reputation: 3192
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
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
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
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
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
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