【问题标题】:PHP/Laravel/eloquent - Insert dynamic amount of rows to databasePHP/Laravel/eloquent - 将动态行数插入数据库
【发布时间】:2014-11-02 03:36:48
【问题描述】:

我正在使用 Laravel 框架,使用 eloquent 与我的数据库进行交互。

我有一个表单,我将它发布到我的控制器。此表单具有用户添加的“标签”。用户可以根据需要添加任意数量的标签。

我想发布标签,然后在我的控制器中,将每个标签插入一个新的表格行,如下所示:

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

我将如何处理这个问题?起初我想将每个标签放入一个数组中,发布数组,然后在控制器中循环遍历每个元素,将它们插入数据库。

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

但经过一番搜索后,我得出的结论是您无法发布数组。

所以另一种方法是将每个数组值作为隐藏的表单类型发布。问题在于如何告诉我的控制器要插入多少个标签(以及行)。

我希望这足够清楚,在此先感谢。


编辑:还是有一些麻烦

编辑 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.');

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

【问题讨论】:

  • 为什么不能POST an array?
  • 只是循环Input::all()?这应该工作
  • @Allendar 好吧,输入带有更多数据。例如: 只有一个用户和评论输入,但可能有一个、三个、十个 - 任意数量的标签。我无法真正想象遍历所有内容将如何工作。 (为糟糕的格式道歉)
  • 为什么不对所有帖子字段进行循环并连接并检查真相? if (Input::get('comment'.$i)) { ... } 直到你找到它们? :) 如果您不确定范围,则必须将其限制在某个循环计数的某个地方。
  • 干杯@watcher,这是一个非常有用的链接,我会使用这个方法!

标签: php dynamic laravel insert eloquent


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我不知道为什么我在搜索时没有遇到这种方法,但它非常漂亮。 @watcher 实际上之前建议过这个,但你花时间写作为答案而不是评论哈哈。再次感谢!
  • 哈,就像几分钟前@watcher 在另一个问题中所做的那样;)很高兴我能帮助你。
  • 我还是有一些问题,你能帮我看看编辑吗?
  • +1 :) @bjurtown 您生成的输入名称的键为array,这是不必要的。检查输入的名称并尝试将其从 tags[array][tag_name] 更改为 tags[][tag_name]
  • 嗯,很明显!我忘记了 js var(您需要为每个新标签申请的数组索引)。检查编辑,它将在循环中工作,如果它是动态添加的,那么在添加新输入时只需更新该数字
【解决方案2】:

我在使用 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”键。

【讨论】:

  • 超级掌心。是的,就是这样,标签现在正在填充数据库。非常感谢
  • 没问题!我发现它只是因为我一直在做那种事情。
猜你喜欢
  • 2019-05-25
  • 2019-06-24
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 2021-11-16
  • 1970-01-01
  • 2020-07-05
相关资源
最近更新 更多