0

我想知道我是否做得对,我的代码是否符合语义和安全。

我需要从数据库中加载一个页面,但为此我需要交叉一些数据并且所有数据都必须兼容,验证如下:

网址:mysite.com/company/page/code

  • 1 - 检查第一个参数以查看公司是否存在。
  • 2 - 检查第二个参数以确定公司 X 是否有该页面
  • 3 - 检查第三个参数以确定页面 Y 是否有代码以及该代码是否与您键入的内容匹配。
  • 4 - 如果用户到达这里并且所有数据都正确,请加载页面和相应的数据。

在这里,他检查用户 X 是否有页面 Y,我怀疑我是否可以这样做或者是否有其他方法。

   $page = Page::where('name', $name)->where('page_name', $page_name)->first();
            if ($page === null) {
                  return view('company.pages.erros.404', compact('name', page)); 
            }

这里和另一个类似,他检查用户 X 是否有页面 Y 以及页面 Y 的代码是否正确,和其他人一样,我怀疑在代码中放置几个​​ WHERE 子句是否正确

$pagecode = Page::where('name', $name)->where('page_name', $pagen_name)->where('code', $pcode)->first();
if ($pagecode === null) {
      return view('company.pages.erros.invalid_code', compact('company, name', page, pcode)); 
}

正如我认为你会想要一般上下文中的代码,这里是完整的功能代码

public function loadpage($name, $page_name, $pcode)
{
    $company = Company::where('name', $name)->first();
    if ($company === null) {
          return view('company.not_register', compact('name')); 
    }
    $page = Page::where('name', $name)->where('page_name', $page_name)->first();
    if ($page === null) {
          return view('company.pages.erros.404', compact('name', page)); 
    }

    $pagecode = Page::where('name', $name)->where('page_name', $page_name)->where('code', $pcode)->first();
    if ($pagecode === null) {
          return view('company.pages.erros.invalid_code', compact('company, name', page, pcode)); 
    }

    $personality = DB::table('personalities')->where('name', $name)->first();

     return view('company.pages.index', compact('company', 'name', 'personality', 'page', pcode));
}
4

3 回答 3

0

根据laravel 的文档,我得出以下结果:

public function loadpage($name, $page_name, $pcode)
{
    $company = Company::where('name', $name)->first();
    if ($company === null) {
          return view('company.not_register', compact('name')); 
    }
    $page = Page::where([ ['name', $name],
['page_name', $page_name],])->first();
    if ($page === null) {
          return view('company.pages.erros.404', compact('name', page)); 
    }

    $pagecode = Page::where([ ['name', $name],
['page_name', $page_name], ['code', $pcode],])->first();
    if ($pagecode === null) {
          return view('company.pages.erros.invalid_code', compact('company, name', page, pcode)); 
    }

    $personality = DB::table('personalities')->where('name', $name)->first();

     return view('company.pages.index', compact('company', 'name', 'personality', 'page', pcode));
}

现在由比我更有经验的同事来看看这是否正确或者是否有可能改进/简化

于 2019-11-15T19:11:10.820 回答
0

如果您在单个模型中搜索并且不确定哪些字段何时出现,您可能需要使用 laravel 的when()方法。只有当该字段可供您使用时,它才会帮助您搜索数据库。例如:

$sortBy = null;

$users = DB::table('users')
                ->when($sortBy, function ($query, $sortBy) {
                    return $query->orderBy($sortBy);
                }, function ($query) {
                    return $query->orderBy('name');
                })
                ->get();

你会从这里的 laravel 条件查询中得到这个想法

于 2019-11-15T20:10:55.303 回答
0

如果您有多个 where 子句要传递给 where 子句,则可以拥有一个包含数组的数组,其结构与 where 方法中的结构相同,例如:

$where = [
    ['name', $name],
    ['page_name', $page_name],
    ['code', $pcode],
    /* 
         the arrays should have one of this two structure
         ["field", "value"], //using = operator as default
         ["field", "operator", "value"], 
     */
];

而不是->where()将此数组作为参数调用,例如:

Page::where($where)->first();

所以你的代码可以变成

public function loadpage($name, $page_name, $pcode)
{
    $name = ['name', $name];
    $pageName = ['page_name', $page_name];
    $pageCode = [ 'code', $pcode ];
    $company = Company::where([$name])->first();
    if ($company === null) {
          return view('company.not_register', compact('name')); 
    }
    $page = Page::where([$name, $pageName])->first();
    if ($page === null) {
          return view('company.pages.erros.404', compact('name', page)); 
    }

    $pagecode = Page::where([$name, $pageName, $pageCode])->first();
    if ($pagecode === null) {
          return view('company.pages.erros.invalid_code', compact('company, name', page, pcode)); 
    }

    $personality = DB::table('personalities')->where([$name])->first();

     return view('company.pages.index', compact('company', 'name', 'personality', 'page', pcode));
}
于 2019-11-15T20:33:02.397 回答