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