2014-06-24 1 views
0

Laravel에서 나는 projects 테이블을가집니다. 프로젝트는 다른 프로젝트의 하위 프로젝트 일 수 있습니다. 이 parent-child 관계를 같은 projects 테이블에 유지합니다.Laravel 부모 자식 관계, 부모로서 자신을 확인하지 마십시오

프로젝트를 편집 할 때 사용자는 선택 상자에서 상위 프로젝트를 선택합니다. 그러나 나는 편집중인 동일한 프로젝트를 선택하는 사용자를 방지하려면; 부모 프로젝트로 이것은 루프를 일으킬 것이므로 에러가된다.

어떻게하면됩니까? 가장 좋은 해결책은 내가 생각할 수있는 사용자 정의 유효성 검사 규칙을 작성하는 것입니다, 그러나, 그 경우, 어떻게 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

Laravel 4의 같은 설명과 함께 모든 검증 종류, 난 그냥 선택 상자에 사용하지 않도록한다. 가장 직접적인 방법. 또한 몇 가지 코드를 게시하는 것이 마음에 드십니까? Project_id가 부모를 포함한다고 가정한다면 왜 그렇습니까? – KyleK

+0

편집 양식입니다. 그것은 단지 부모를 포함하지 않습니다. 편집 양식의 선택 상자에는 모든 프로젝트가 포함되어 있으므로 사용자는 상위 프로젝트를 현재 프로젝트 중 하나로 변경할 수 있습니다. –

답변

4

그것은 솔루션이 바로 Laravel의 모든 측면에서처럼, 아주 간단 것으로 나온다.

이 모델의

'project_id' => 'different:id', 

유효성 검사 규칙을 포함하기에 충분하다. (Ardent 구문)

Here 솔직히

+0

와우 ... 알아두면 좋구나. – KyleK

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>