laravel中的return变量如何使用isset

问题描述 投票:0回答:2

我有某种条件,如果设置了请求或否,则在视图刀片laravel中像这样重新调谐:

$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');
  }

如果isset($ compare1,$ compare)运行,找不到$ laptop2,这种情况下有任何解决方案...?之前感谢

php laravel laravel-blade
2个回答
1
投票

您的结构不正确。当前,您的代码elseif(isset($compare1, $compare))将永远不会执行,因为如果设置了$compare1$compare2,则您的if语句在到达第三个语句之前已经退出。您也有很多冗余代码(根据执行哪个if块重复一行代码),可以很容易地减少到更少的行数和更简洁的代码。

简单方法

考虑这个; (您应该可以用它替换整个if块)

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

动态方法

如果您仅进行2个比较,这可能有点过大,但肯定有一些好处。

  • 类似数量的代码作为简单方法
  • 不需要为每个比较都定义单独的变量(例如$compare1 = $request->compare1;等)
  • 只需将它们添加到$comparisons数组即可轻松为您的回报添加更多比较
  • 未来证明

代码:

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

0
投票

也许最好将代码分成几部分以提高代码质量。

分析代码后的一些想法:

  • 总是返回view('compare.index')
  • Laravel请求包含has方法
  • 使用if elseif ..的多个条件串联(会降低可读性)
  • 将完整的模型而不是仅ID传递给视图更合乎逻辑。否则,将var重命名为laptop1Id或类似名称>
  • 注意代码重复
  • 提案

if($request->has('compare1')) {
    $laptop1 = Laptop::where('slug', $request->get('compare1'))->firstOrFail();
}

if($request->has('compare2')) {
    $laptop2 = Laptop::where('slug', $request->get('compare2'))->firstOrFail();
}

return view('compare.index', compact('laptop1', 'laptop2'));

如果查找/搜索Laptop是域规则,则可以将其封装在模型的方法/范围中,进行类似查询:

$laptop = Laptop::findOrFailBySlug($val);

$laptop = Laptop::slug($val)->firstOrFail();

© www.soinside.com 2019 - 2024. All rights reserved.