2014-05-23 8 views
2

나는이 사건의 논리에 대한 도움을 요청하며 가능한 경우 코드에 대한 도움을 제공합니다.하나의 테이블에 Laravel 다중 삽입

그래서 여기 있습니다. 제가이 두 테이블을 가지고 있다고 가정 해 봅시다. 물론 하나 - 많은 관계를 가지고 있습니다 :

*These aren't the real tables, they're just to simplify things* 

**Table books** 
id 
name 

**Table books_reviews** 
id 
books_id 
user_id <-this would be the person who wrote a review 
details <-A varchar 140 field 
rating <-A 1 through 10 integer field 

이제 Ok. 내가하고 싶은 일은 링크를 만드는 것입니다. 그러면 링크가 하나의 테이블에 전체 양식이 추가됩니다.

<a href="#" id="myLink">Write one more review</a> 
<table id="mytable"> 

</table> 
<input type="submit"> <- This should sumbit all the rows for validation and insertion 

html로 ... 너무 좋아하는

$(document).ready(function(){ 
    var click=0; 
    $('#myLink').click(function(){ 
     click++; 
    $('#mytable').append('<tr> 
      <td><input type="text" class="form-control" id="details'+click+'" name="details'+click+'"</td> 
      <td><input type="text" class="form-control" id="rating'+click+'" name="rating'+click+'"</td> 
         </tr>'); 
    }); 
}); 

좋아 자바 스크립트, 그래서 나는이 꽤 분명하다 생각합니다. 물론 각 행에 특정 리뷰 ID를 추가 할 수도 있지만 여기서는 그렇게 할 필요가 없다고 생각합니다.

PHP로 무엇을 할 지 짐작할 수 없습니다. 내 컨트롤러에 쓸 내용으로 모든 행을 감지하고 각 행의 데이터 배열을 만든 다음 유효성을 검사하고 삽입합니다. 누구나 나에게 이걸 줄 수 있니? 당신이 당신의 자바 스크립트에 의해 생성 된 소스 코드를 보면

+0

그래서 컨트롤러에 서평을 게시하고 해당 리뷰를 데이터베이스에 삽입하려는 양식이 있습니까? Eloquent ORM을 사용하여 모델을 설정 했습니까? 리뷰가 개별적으로 제출됩니까? 누군가가 "리뷰를 더 작성"버튼을 클릭 한 다음 한 번의 요청으로 여러 리뷰를 제출할 수 있습니까? – Jeemusu

+0

도서 및 리뷰는 단지 예일뿐입니다. 이 링크를 두 번 이상 클릭 할 수 있기를 원하면 제출 버튼을 클릭하여 동일한 모델의 여러 형태를 채우고 표에 모두 삽입 할 수 있습니다. – arrigonfr

답변

4

, 당신처럼 입력의 이름이 될 것이라고보아야한다 : 나는 당신의 이름을 추천

details1 rating1 
details2 rating2 
... 

이 아마 최고의 옵션이 아닙니다 모두를 입력은 details[]rating[]입니다. 카운터를 사용할 필요가 없습니다.

laravel에서 알 수 있듯이 모든 양식 데이터를 가져 오기 위해 Input :: all()을 사용해야합니다. 이 기능은 당신에게 다음과 같은 배열을 반환해야합니다

# array: form data 
array(
    'details' => array(
     [0] => 'Content of details 1', 
     [2] => 'Content of details 2' 
    ), 
    'rating' => array(
     [0] => 'Content of rating 1', 
     [2] => 'Content of rating 2' 
    ) 
) 

이 기능은 데이터베이스에 추가 할 배열의 배열을 수신, 당신은 기능 BookReview::insert($array)을 사용할 수 있습니다 laravel로 한 번에 여러 행을 삽입합니다. 이 배열은이 같은되어야합니다 :

# array: eloquent ready 
array(
    array(
     'details' => 'Content of details 1', 
     'rating' => 'Content of rating 1', 
    ), 
    array(
     'details' => 'Content of details 2', 
     'rating' => 'Content of rating 2', 
    ), 
) 

그래서, 당신이해야 할 배열 '웅변 준비'에 배열 '폼 데이터를'변환입니다. 이 간단한 알고리즘을 사용하여 수행 할 수 있습니다 :

$input = Input::all(); 
$insert = array(); 
foreach($input['details'] as $key => $detail) { 
    $insert[$key]['details'] = $detail; 
} 
foreach($input['rating'] as $key => $rating) { 
    $insert[$key]['rating'] = $rating; 
} 
BookReview::insert($insert); 

추신 : 나는 user_id 및 book_id 같은 다른 필드를 추가하지 않았습니다. 이 정보를 모든 행에 추가하려면 foreach에 추가해야합니다.

+0

굉장! 그게 내가 정확히 필요한거야. 아직 시도하지 않았지만 코드를 읽는 것만으로 효과가 있음을 알았습니다.한 가지만 더 : 모든 행의 유효성을 검사하는 가장 좋은 방법은 아약스를 사용하므로 url은 다시로드되지 않으며 오류가있는 위치를 알려주시겠습니까? – arrigonfr

+1

클라이언트 측 또는 서버 측에서 유효성을 검사 할 수 있습니다. 클라이언트 측에서는 입력에'required' 매개 변수를 사용하거나 javascript를 사용할 수 있습니다 (저는 Parsley 라이브러리를 권장합니다). 서버 측에서는 훨씬 복잡한 모델입니다. 각 모델의 유효성을 검사해야하기 때문입니다. 서버 측에서이 작업을 수행하려면 배열 배열을 작성하고 BookReview 객체 배열을 작성하는 것이 좋습니다. 각 객체를 검토하고 laravel의'Validation' 클래스를 사용하여 하나씩 검증 할 수 있습니다. 이것은 자바 스크립트로 에러를 보내고 처리해야하기 때문에 많은 작업이 될 것입니다. – LucasFerreira

+0

지금 봅니다. 고마워요, 지금 당장 할게요. – arrigonfr