Laravel父子关系,不要将自我验证为父母

时间:2014-06-24 21:43:24

标签: laravel laravel-4

在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”不是一个合适的解决方案。该应用程序仍然很脆弱。应该以更恰当的方式加以预防。

2 个答案:

答案 0 :(得分:4)

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

包含

就足够了
'project_id' => 'different:id',

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

Here都是验证类型,包含Laravel 4中的解释。

答案 1 :(得分:0)

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

  $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>