PHP / Laravel / eloquent - 将动态数量的行插入数据库

时间:2014-09-08 20:09:03

标签: php dynamic laravel insert eloquent

我正在使用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。问题在于如何告诉我的控制器要插入多少个标签(以及那些行)。

我希望这很清楚,先谢谢。


编辑:仍有一些麻烦

编辑2:更改了代码以在javascript中包含'i'变量以及POST时新数组的样子。

这是用户生成的输入标签的样子

$("#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.');

我仍然设法在我应该有标记的数据库行中获取空值。我哪里错了?

2 个答案:

答案 0 :(得分:5)

您可以将其作为数组发送:

<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']));
}

答案 1 :(得分: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'键。