2014-09-08 2 views
0

저는 Laravel 프레임 워크를 사용하여 데이터베이스와 상호 작용하는 것을 능숙하게 사용하고 있습니다.PHP/Laravel/eloquent - 데이터베이스에 동적 행을 삽입하십시오.

컨트롤러에 게시 할 양식이 있습니다. 이 양식에는 사용자가 추가 한 '태그'가 있습니다. 사용자는 원하는만큼 태그를 추가 할 수 있습니다.

내가 태그를 게시 할 다음 내 컨트롤러에서,과 같이, 새로운 테이블 행에 각 태그를 삽입 :

 $tag = new Tag; 
     $tag->user_id = Input::get('user_id'); 
     $tag->tag_name = Input::get('tag_name'); 
     $tag->save(); 

가 어떻게이 문제를 해결할 것인가? 처음에는 각 태그를 배열에 넣고 POST로 배열을 만든 다음 컨트롤러에서 각 요소를 순환하여 데이터베이스에 삽입한다고 생각했습니다.

See the code here, this was actually a previous stack overflow question

그러나 일부 검색 한 후

주위 난 당신이 배열을 게시 할 수 없습니다 결론에 도달했다.

그래서 다른 방법은 각 배열 값을 숨겨진 양식 유형으로 POST하는 것입니다. 문제는 내 컨트롤러에 얼마나 많은 태그 (및 그에 대한 행)를 삽입할지 알려주는 것입니다.

전적으로 감사드립니다.


편집 : 아직 몇 가지 문제

EDIT이있는 것은 : 자바 스크립트의 '난'변수와 어떤 새로운 배열을 게시 할 때 모양을 포함하는 코드를 변경했습니다.

$("#tagsbox") 
     .append("<div class='displaytag'><i>"+tag+"</i><input type='hidden' name='tags["+i+"]["+user_id+"]' value="+user_id+"><input type='hidden' name='tags["+i+"]["+tag+"]'value="+tag+">") 

이는 POST 데이터

컨트롤러 동일한

채로 제출

Array 
(
[user_id] => 12 
[lat] => 50.80589 
[lng] => -0.02784 
[spot_name] => test spot 
[tags] => Array 
    (
     [1] => Array 
      (
       [12] => 12 
       [tag1] => tag1 
      ) 

     [2] => Array 
      (
       [12] => 12 
       [tag2] => tag2 
      ) 

     [3] => Array 
      (
       [12] => 12 
       [tag3] => tag3 
      ) 

    ) 

[location_notes] => some notes 
[comments] => some comments 
[_token] => Cfsx56FZiEKcVz76mkcZvuBtVG7JQSmdJUffFMfM 

) 후의 모습처럼 사용자가 입력 태그 보이는 생성 무엇

  //dynamic tags 
     $tags = Input::get('tags'); 
     foreach ((array) $tags as $tagData) 
     { 
      // validate user_id and tag_name first 
      $tag = Tag::create(array_only($tagData, ['user_id', 'tag_name'])); 
     } 

     //create spot 
     $spot = new Spot; 
     $spot->user_id   = Input::get('user_id'); 
     $spot->latitude   = Input::get('lat'); 
     $spot->longitude  = Input::get('lng'); 
     $spot->spot_name  = Input::get('spot_name'); 
     $spot->location_notes = Input::get('location_notes'); 
     $spot->comments   = Input::get('comments'); 
     $spot->save(); 

     return Redirect::route('home') 
         ->with('global', 'Spot successfully tagged. You can edit all your spots on your profile.'); 

태그가 있어야하는 데이터베이스 행에서 여전히 값을 가져올 수 있습니다. 내가 어디로 잘못 가고 있니?

+1

왜 [POST 배열을 할 수 없습니까?] (0120-13995) –

+0

'Input :: all()'을 그냥 루프합니까? 그게 작동해야합니다 –

+0

@ Alendar 글쎄, 입력 더 많은 데이터와 함께 제공됩니다.예 : 한 명의 사용자와 주석 입력이 있지만 한 개, 세 개, 열 개의 태그가있을 수 있습니다. 나는 모든 작업을 반복하는 방법을 실제로 알 수 없습니다. (진절머리 나는 포맷에 대한 사과) – bjurtown

답변

4

당신은 배열로 보낼 수 있습니다 :

<input name="tags["+i+"][user_id]"><input name="tags["+i+"][tag_name]"> 
... 
<input name="tags["+i+"][user_id]"><input name="tags["+i+"][tag_name]"> 

다음 서버 측 :

$tags = Input::get('tags'); 
foreach ((array) $tags as $tagData) 
{ 
    // validate user_id and tag_name first 
    $tag = Tag::create(array_only($tagData, ['user_id', 'tag_name'])); 
} 
+0

감사합니다. 검색 할 때 왜이 방법을 사용하지 않았는지 알 수는 없지만 꽤 멋지 네요. @watcher는 실제로 이것을 이전에 제안했지만, 하하 (haha)에 대한 의견보다는 답변으로 쓰려고 시간을 낭비했습니다. 다시 한 번 감사드립니다! – bjurtown

+0

하하. @watcher가 다른 질문에 일찍 대답 한 것처럼;) 어쨌든 나는 당신을 도울 수있어서 기뻤습니다. –

+0

아직 문제가 있습니다. 제발 편집 좀 해 주시겠습니까? – bjurtown

1

나는 Laravel을 사용하여 정말 새로운 오전, 여기 잘못 될 수도 있지만 당신은 array_only 사용하는 경우 ()

$tags = Input::get('tags'); 
    foreach ((array) $tags as $tagData) 
    { 
     // validate user_id and tag_name first 
     $tag = Tag::create(array_only($tagData, ['user_id', 'tag_name'])); 
    } 

POST 데이터 태그 배열에 'tag_name'또는 'user_id'키가 표시되지 않습니다.

+0

메가 얼굴 손바닥. 예, 태그가 데이터베이스에 채워집니다. 고마워요 – bjurtown

+0

괜찮습니다! 나는 항상 그런 종류의 일을하기 때문에 그것을 발견했습니다. – mjoconnor

관련 문제