2016-11-07 1 views
0

사용자가 레이블과 값이있는 간단한 목록을 추가 할 수있는 기본 UI가 있습니다. 그 목록을 반복하여 "Detail"모델에 데이터를 저장하고 싶습니다.Laravel 5의 입력 배열을 반복합니다.

다음 코드가 있습니다.

컨트롤러 :

$details = $request->input('detail_label'); 

foreach($details as $key => $value) 
{ 
    if(!empty($request->input('detail_value.'.$key))) { 

     // if the detail has an existing ID 
     if($request->input('detail_id.'.$key)) { 
      $detail = Detail::find($request->input('detail_id.'.$key)); 
     } else { 
      $detail = new Detail; 
     } 

     $detail->type = $request->input('detail_type.'.$key); 
     $detail->label = $request->input('detail_label.'.$key); 
     $detail->value = $request->input('detail_value.'.$key); 

     if($request->input('detail_privacy.'.$key) == 1) { 
      $detail->privacy = 1; 
     } else { 
      $detail->privacy = 0; 
     } 

     $user->details()->save($detail); 

    } 

} 

보기 : 나는 detail_privacy 필드를 제외하고 계획했던대로 내 코드의 모든 측면 작동

@foreach($user->details as $detail) 
    <div class="detail"> 

     <input type="hidden" name="detail_id[]" value="{{ $detail->id }}"> 

     <label>Type 
     <select name="detail_type[]"> 
      <option @if($detail->type == '1')selected @endif value="1">Phone</option> 
      <option @if($detail->type == '2')selected @endif value="2">Phone (mobile)</option> 
      <option @if($detail->type == '3')selected @endif value="3">URL</option> 
      <option @if($detail->type == '4')selected @endif value="4">Email</option> 
     </select> 
     </label> 

     <label>Label 
     <input type="text" name="detail_label[]" value="{{ $detail->label }}"> 
     </label> 

     <label>Value 
     <input type="text" name="detail_value[]" value="{{ $detail->value }}"> 
     </label> 

     <label>Private? 
     <input type="checkbox" name="detail_privacy[]" @if($detail->privacy == true) checked @endif value="1"> 
     </label> 

     <label>Delete? 
     <input type="checkbox" name="detail_delete[]" value="{{ $detail->id }}"> 
     </label> 

    </div><!--/detail --> 
@endforeach 

. 부울 프라이버시 속성을 설정하고 설정을 해제하지만 원하는 $ 키에 아무런주의를 기울이지 않습니다. 그것은 항상 루프의 순서에 따라 설정합니다. 개인 정보를 하나만 설정하면 가장 먼저 표시됩니다. 내가 두 개를 설정하면 (둘 중 어느 것이 든), 그것은 첫 번째와 두 번째가 될 것입니다.

내 논리에는 분명히 잘못된 것이 있지만 무엇을 말할 수 없습니다.

도움이 될 것입니다. 감사!

+0

왜 필드에 대한 모든 이름을 배열로 사용 했습니까? – iLLin

+0

@iLLin -이 상황에서 내 대안은 무엇입니까? –

+0

이 질문에 왜 투표가 내려 졌습니까? –

답변

1

가 작동하지 않는 이유는 체크되지 않은 체크 박스는 포스트 데이터에 포함되지 않은 것입니다. 덤핑 값 $request->input('detail_privacy')으로 볼 수 있습니다.

기존 내용을 편집하고 새로운 세부 사항을 추가 할 수 있으려면 양식의 입력에 키를 설정해야합니다. 정말로 당신이 그것을 추적하는 한 아무거나. 작업을 쉽게하기 위해 확인란과 동일한 숨겨진 입력을 추가 할 수 있으므로 detail_privacy이 항상 게시물 데이터에 나타납니다. 예를 들면 다음과 같습니다.

@foreach ($user->details as $key => $detail) 
    <input type="hidden" name="detail_id[{{ $key }}]" value="{{ $detail->id }}"> 
    ... 
    <input type="hidden" name="detail_privacy[{{ $key }}]" value="0"> 
    <input type="checkbox" name="detail_privacy[{{ $key }}]" @if($detail->privacy == true) checked @endif value="1"> 
    ... 
@endforeach 

새 필드를 동적으로 추가하는 경우 즉, javascript를 사용하면 해당 키를 존중해야합니다. 아주 간단하지만, 마지막 값인 $key을 js에 전달하면 설정됩니다.

detail_id[{{ $key }}] 대신 details[{{ $key }}][id] 입력 이름에 다른 표기법을 사용하는 것이 좋습니다. 이런 식으로 제어기 작업이 훨씬 더 간단해질 것입니다 :

foreach ($details as $detail) { 
    if (! empty($detail['id'])) { 
     ... 
    } 
} 
+0

기존 세부 정보의 개인 정보 설정을 변경하는 동안 사용자가 새로운 세부 정보를 추가하는 경우도 있습니다. 따라서 항상 $ detail-> id에 액세스 할 수있는 것은 아니므로 첫 번째 솔루션이 마음에 든다. 그것이 동작을 변경 시켰습니다 ... 세부 정보가 비공개로 설정 될 때마다 항상 루프의 세부 정보가 적용되는 설정입니다. –

+0

나는 실제로 틀렸어.체크 박스의 값이 무엇이든간에 추가 필드가 폼에 추가되기 때문에 숨겨진 입력 트릭을 입력 이름에'[]'와 함께 사용할 수 없습니다. 나는 대답을 업데이트했다. – Paul

+0

폴 감사합니다. 당신의 대답은 적어도 옳은 길에서 다소 해로운 해결책을 찾았습니다. 어쨌든 자바 스크립트에 의존하기 때문에 확인란을 선택할 때마다 숨겨진 필드를 비활성화하기 위해 간단히 사용했습니다. 따라서 루프의 각 반복에 하나의 프라이버시 값만 저장되었습니다. 현재는 컨트롤러 로직의 일부분을 완전히 다시 작성해야한다고 생각하기는하지만, 현재는 효과가 있습니다. –

0

부울 값이 데이터베이스에 TINYINTS으로 저장된 경우 (0 또는 1); 부울 true || false을 꺼내면 문제가 해결 될 수 있습니다.

<!-- JUST TRY IT LIKE SO: @if($detail->privacy) checked @endif --> 
    <label>Private? 
    <input type="checkbox" 
      name="detail_privacy[]" 
      @if($detail->privacy) checked @endif value="1" 
    > 
    </label> 

또는 꼽은 : 특정 있지만, 추측하지 그것은 시도 가치가

<!-- YOU MAY ALSO USE "1" LIKE SO: @if($detail->privacy==1) checked @endif --> 
    <label>Private? 
    <input type="checkbox" 
      name="detail_privacy[]" 
      @if($detail->privacy==1) checked @endif value="1" 
    > 
    </label> 
+0

감사합니다. 명확히하기 위해, 문제는 값이 데이터베이스의 잘못된 행에 저장된다는 것입니다. –