【问题标题】:Laravel parent child relationship, Don't validate self as parentLaravel 父子关系,不验证自己为父子关系
【发布时间】:2018-04-04 15:41:52
【问题描述】:

在 Laravel 中,我有 projects 表。一个项目可以是另一个项目的子项目。我将这个parent-child 关系保留在同一个projects 表中。

编辑项目时,用户从选择框中选择父项目。但是我想阻止用户选择正在编辑的同一个项目;作为父项目。这会导致循环,从而导致错误。

我怎样才能做到这一点?我能想到的最佳解决方案是编写自定义验证规则,但是,在这种情况下,如何获取 id 属性来检查 project_id 字段?或者除了验证器之外还有更好的解决方案吗?

我知道我可以在选择框中排除该项目,但这不是正确的解决方案,以防有人篡改发布数据并修改 project_id 值(将其设置为正在编辑的项目的相同值),无限循环将发生。

更新: 这是我的父项目输入生成代码:

<div class="form-group">
    {{ Form::label('project_id', 'Parent Project:') }}
    {{ Form::select('project_id', [null => null] + Project::lists('name', 'id'), null, ['class' => 'form-control']) }}
</div>

如上所述,“在选择框中不包括当前项目 ID”不是一个合适的解决方案。该应用程序仍然存在漏洞。应该以更恰当的方式加以预防。

【问题讨论】:

  • 老实说,我只是在选择框中禁用它。最直接的方法。您还介意发布一些代码吗?比如为什么 project_id 应该包含自己,如果它应该只包含父母?
  • 这是一个编辑表单。它不仅包含父母。编辑表单中的选择框包含所有项目,因此用户可以将父项目更改为当前项目中的任何一个。

标签: laravel laravel-4


【解决方案1】:

结果证明解决方案非常简单,就像 Laravel 的各个方面一样。

包含就足够了

'project_id' => 'different:id',

模型中的验证规则。 (Ardent 语法)

Here 都是自 Laravel 4 起带有解释的验证类型。

【讨论】:

    【解决方案2】:

    只检索没有当前项目的关系。

      $project = Project::find($thisProject);
      $related = Project::where('project_id','=',$project->id)->where('id','!=',$project->id)->get();
    

    假设您使用的是刀片...

      <select name="projects">
      @foreach($related as $r)
      <option value="{{$r->id}}">{{$r->projectName}}</option>
      @endforeach
      </select>
    

    【讨论】:

      猜你喜欢
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多