Ad

How To Use Isset In If Return Variable In Laravel

- 1 answer

i have some condition if request isset or no and retun in view blade laravel like this:

$compare1 = $request->compare1;
$compare2 = $request->compare2;

if (isset($compare1)) {
    $laptop1 = Laptop::where('slug', $compare1)->firstOrFail();
    return view('compare.index', ['laptop1' => $laptop1->id]);
  } elseif(isset($compare2)) {
    $laptop2 = Laptop::where('slug', $compare2)->firstOrFail();
    return view('compare.index', ['laptop1' => $laptop1->id, 'laptop2' => $laptop2->id]);
  }elseif(isset($compare1, $compare)) {
    $laptop1 = Laptop::where('slug', $compare1)->firstOrFail();
    $laptop2 = Laptop::where('slug', $compare2)->firstOrFail();
    return view('compare.index', ['laptop1' => $laptop1->id, 'laptop2' => $laptop2->id]);
  }else {
    return view('compare.index');
  }

if isset($compare1, $compare) run, $laptop2 not found, any solution for this case...? Thanks before

Ad

Answer

The structure you have is incorrect. Currently, your code elseif(isset($compare1, $compare)) will never execute because if either $compare1 or $compare2 are set, your if statement will already exit before it gets to the 3rd one. You also have a lot of redundant code (repeating a line of code depending on which if block is executed) which is easily reduced to fewer lines and cleaner code.

Simple Approach

Consider this; (You should be able to replace your entire if block with this)

//set up an empty array to return
$return = [];

//check if `$compare1` is set, and add to return array if it is
if(isset($compare1)) {
    $return['laptop1'] = (Laptop::where('slug', $compare1)->firstOrFail())->id;
}

//same as above but for `$compare2`
if(isset($compare2)) {
    $return['laptop2'] = (Laptop::where('slug', $compare2)->firstOrFail())->id;
}

return view('compare.index', $return);

Dynamic Approach

This may be a little bit overkill if you are just doing 2 comparisons but it definitely has some upsides.

  • Similar amount of code as the simple approach
  • No need to define separate variables for every comparison (e.g $compare1 = $request->compare1;, etc)
  • Easily add more comparisons to your return by simply adding them to the $comparisons array
  • Future Proof

Code:

//empty array to return
$return = [];

//list of variables to compare
$comparisons = ['compare1', 'compare2'];

//loop through each comparison
foreach($comparisons as $key => $request_object) {

    $count = $key + 1; //keys start at 0, so we add 1 to make it count sequentially 1,2,3 ...
    $comparison = $request->{$request_object}; //grab your comparison object

    //check if comparison object is set, add it to return array if it is
    if(isset($comparison)) {
        $return["laptop{$count}"] = (Laptop::where('slug', $comparison)->firstOrFail())->id;
    }
}

return view('compare.index', $return);
Ad
source: stackoverflow.com
Ad