2014-09-08 3 views
0

Я работаю с базой Laravel, используя красноречие для взаимодействия с моей базой данных.PHP/Laravel/eloquent - Вставить динамическое количество строк в базу данных

У меня есть форма, которую я отправляю на свой контроллер. Эта форма имеет «теги», которые добавляются пользователем. Пользователь может добавить столько тегов, сколько захочет.

Я хочу, чтобы POST тегов, а затем в моем контроллере, вставьте каждый тег в новую строку таблицы, например, так:

 $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: еще есть некоторые проблемы

EDIT 2: изменил код для включения «я» переменной в JavaScript, и что новый массив выглядит, когда вывешенным.

Это то, что пользовательский ввод тегов выглядит

$("#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 массив?] (Http://stackoverflow.com/q/9073690/697370) –

+0

just loop 'Input :: all()'? Это должно хорошо работать – 2014-09-08 20:11:33

+0

@ Адаптер, вход содержит больше данных.Например: <вход бла имя = «пользователь»> <вход бла имя = «комментарий»> <вход DYNAMIC имя = «тег»> <вход DYNAMIC имя = «тег»> Там будет только один пользователь и комментарий, но может быть один, три, десять - любое количество тегов. Я не могу представить, как все будет работать. (извинения за дерьмовое форматирование) – 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 действительно предложил это раньше, но вы взяли время, чтобы написать как ответ, а не комментарий ха-ха. Еще раз спасибо! – bjurtown

+0

ХА, как @watcher сделал еще один вопрос за минуту раньше;) Рад, что я мог бы помочь вам в любом случае. –

+0

У меня все еще есть проблемы, не могли бы вы посмотреть на редактирование для меня, пожалуйста? – bjurtown

1

Я действительно новичок в использовании Laravel, и может быть неправильно здесь, но когда вы используете array_only ()

Я не вижу в поле тэгов тегов POST ключей 'tag_name' или 'user_id'.

+0

мега-ладонь. Да, это так, теги теперь заполняют базу данных. Большое спасибо – bjurtown

+0

Нет проблем! Я только заметил это, потому что я все время это делаю. – mjoconnor